xen-blkfront: move negotiate_mq to cover all cases of new VBDs
negotiate_mq should happen in all cases of a new VBD being discovered by xen-blkfront, whether called through _probe() or a hot-attached new VBD from dom-0 via xenstore. Otherwise, hot-attached new VBDs are left configured without multi-queue. Signed-off-by: Bhavesh Davda <bhavesh.davda@oracle.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
bebc6082da
commit
7ed8ce1c5f
@ -262,6 +262,7 @@ static DEFINE_SPINLOCK(minor_lock);
|
|||||||
|
|
||||||
static int blkfront_setup_indirect(struct blkfront_ring_info *rinfo);
|
static int blkfront_setup_indirect(struct blkfront_ring_info *rinfo);
|
||||||
static void blkfront_gather_backend_features(struct blkfront_info *info);
|
static void blkfront_gather_backend_features(struct blkfront_info *info);
|
||||||
|
static int negotiate_mq(struct blkfront_info *info);
|
||||||
|
|
||||||
static int get_id_from_freelist(struct blkfront_ring_info *rinfo)
|
static int get_id_from_freelist(struct blkfront_ring_info *rinfo)
|
||||||
{
|
{
|
||||||
@ -1774,11 +1775,18 @@ static int talk_to_blkback(struct xenbus_device *dev,
|
|||||||
unsigned int i, max_page_order;
|
unsigned int i, max_page_order;
|
||||||
unsigned int ring_page_order;
|
unsigned int ring_page_order;
|
||||||
|
|
||||||
|
if (!info)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
max_page_order = xenbus_read_unsigned(info->xbdev->otherend,
|
max_page_order = xenbus_read_unsigned(info->xbdev->otherend,
|
||||||
"max-ring-page-order", 0);
|
"max-ring-page-order", 0);
|
||||||
ring_page_order = min(xen_blkif_max_ring_order, max_page_order);
|
ring_page_order = min(xen_blkif_max_ring_order, max_page_order);
|
||||||
info->nr_ring_pages = 1 << ring_page_order;
|
info->nr_ring_pages = 1 << ring_page_order;
|
||||||
|
|
||||||
|
err = negotiate_mq(info);
|
||||||
|
if (err)
|
||||||
|
goto destroy_blkring;
|
||||||
|
|
||||||
for (i = 0; i < info->nr_rings; i++) {
|
for (i = 0; i < info->nr_rings; i++) {
|
||||||
struct blkfront_ring_info *rinfo = &info->rinfo[i];
|
struct blkfront_ring_info *rinfo = &info->rinfo[i];
|
||||||
|
|
||||||
@ -1978,11 +1986,6 @@ static int blkfront_probe(struct xenbus_device *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
info->xbdev = dev;
|
info->xbdev = dev;
|
||||||
err = negotiate_mq(info);
|
|
||||||
if (err) {
|
|
||||||
kfree(info);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_init(&info->mutex);
|
mutex_init(&info->mutex);
|
||||||
info->vdevice = vdevice;
|
info->vdevice = vdevice;
|
||||||
@ -2099,10 +2102,6 @@ static int blkfront_resume(struct xenbus_device *dev)
|
|||||||
|
|
||||||
blkif_free(info, info->connected == BLKIF_STATE_CONNECTED);
|
blkif_free(info, info->connected == BLKIF_STATE_CONNECTED);
|
||||||
|
|
||||||
err = negotiate_mq(info);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
err = talk_to_blkback(dev, info);
|
err = talk_to_blkback(dev, info);
|
||||||
if (!err)
|
if (!err)
|
||||||
blk_mq_update_nr_hw_queues(&info->tag_set, info->nr_rings);
|
blk_mq_update_nr_hw_queues(&info->tag_set, info->nr_rings);
|
||||||
|
Loading…
Reference in New Issue
Block a user