mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
xen/blkback: get the number of hardware queues/rings from blkfront
Backend advertises "multi-queue-max-queues" to front, also get the negotiated number from "multi-queue-num-queues" written by blkfront. Signed-off-by: Bob Liu <bob.liu@oracle.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
2fb1ef4f12
commit
d62d860003
3 changed files with 42 additions and 6 deletions
|
@ -83,6 +83,16 @@ module_param_named(max_persistent_grants, xen_blkif_max_pgrants, int, 0644);
|
|||
MODULE_PARM_DESC(max_persistent_grants,
|
||||
"Maximum number of grants to map persistently");
|
||||
|
||||
/*
|
||||
* Maximum number of rings/queues blkback supports, allow as many queues as there
|
||||
* are CPUs if user has not specified a value.
|
||||
*/
|
||||
unsigned int xenblk_max_queues;
|
||||
module_param_named(max_queues, xenblk_max_queues, uint, 0644);
|
||||
MODULE_PARM_DESC(max_queues,
|
||||
"Maximum number of hardware queues per virtual disk." \
|
||||
"By default it is the number of online CPUs.");
|
||||
|
||||
/*
|
||||
* Maximum order of pages to be used for the shared ring between front and
|
||||
* backend, 4KB page granularity is used.
|
||||
|
@ -1483,6 +1493,9 @@ static int __init xen_blkif_init(void)
|
|||
xen_blkif_max_ring_order = XENBUS_MAX_RING_GRANT_ORDER;
|
||||
}
|
||||
|
||||
if (xenblk_max_queues == 0)
|
||||
xenblk_max_queues = num_online_cpus();
|
||||
|
||||
rc = xen_blkif_interface_init();
|
||||
if (rc)
|
||||
goto failed_init;
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
#include <xen/interface/io/protocols.h>
|
||||
|
||||
extern unsigned int xen_blkif_max_ring_order;
|
||||
extern unsigned int xenblk_max_queues;
|
||||
/*
|
||||
* This is the maximum number of segments that would be allowed in indirect
|
||||
* requests. This value will also be passed to the frontend.
|
||||
|
|
|
@ -181,12 +181,6 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
|
|||
blkif->st_print = jiffies;
|
||||
INIT_WORK(&blkif->persistent_purge_work, xen_blkbk_unmap_purged_grants);
|
||||
|
||||
blkif->nr_rings = 1;
|
||||
if (xen_blkif_alloc_rings(blkif)) {
|
||||
kmem_cache_free(xen_blkif_cachep, blkif);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
return blkif;
|
||||
}
|
||||
|
||||
|
@ -595,6 +589,12 @@ static int xen_blkbk_probe(struct xenbus_device *dev,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
/* Multi-queue: advertise how many queues are supported by us.*/
|
||||
err = xenbus_printf(XBT_NIL, dev->nodename,
|
||||
"multi-queue-max-queues", "%u", xenblk_max_queues);
|
||||
if (err)
|
||||
pr_warn("Error writing multi-queue-max-queues\n");
|
||||
|
||||
/* setup back pointer */
|
||||
be->blkif->be = be;
|
||||
|
||||
|
@ -980,6 +980,7 @@ static int connect_ring(struct backend_info *be)
|
|||
char *xspath;
|
||||
size_t xspathsize;
|
||||
const size_t xenstore_path_ext_size = 11; /* sufficient for "/queue-NNN" */
|
||||
unsigned int requested_num_queues = 0;
|
||||
|
||||
pr_debug("%s %s\n", __func__, dev->otherend);
|
||||
|
||||
|
@ -1007,6 +1008,27 @@ static int connect_ring(struct backend_info *be)
|
|||
be->blkif->vbd.feature_gnt_persistent = pers_grants;
|
||||
be->blkif->vbd.overflow_max_grants = 0;
|
||||
|
||||
/*
|
||||
* Read the number of hardware queues from frontend.
|
||||
*/
|
||||
err = xenbus_scanf(XBT_NIL, dev->otherend, "multi-queue-num-queues",
|
||||
"%u", &requested_num_queues);
|
||||
if (err < 0) {
|
||||
requested_num_queues = 1;
|
||||
} else {
|
||||
if (requested_num_queues > xenblk_max_queues
|
||||
|| requested_num_queues == 0) {
|
||||
/* Buggy or malicious guest. */
|
||||
xenbus_dev_fatal(dev, err,
|
||||
"guest requested %u queues, exceeding the maximum of %u.",
|
||||
requested_num_queues, xenblk_max_queues);
|
||||
return -ENOSYS;
|
||||
}
|
||||
}
|
||||
be->blkif->nr_rings = requested_num_queues;
|
||||
if (xen_blkif_alloc_rings(be->blkif))
|
||||
return -ENOMEM;
|
||||
|
||||
pr_info("%s: using %d queues, protocol %d (%s) %s\n", dev->nodename,
|
||||
be->blkif->nr_rings, be->blkif->blk_protocol, protocol,
|
||||
pers_grants ? "persistent grants" : "");
|
||||
|
|
Loading…
Reference in a new issue