virtio: don't allocate vqs when names[i] = NULL
to #26589565 commita229989d97
upstream Some vqs may not need to be allocated when their related feature bits are disabled. So callers may pass in such vqs with "names = NULL". Then we skip such vq allocations. Signed-off-by: Wei Wang <wei.w.wang@intel.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Wei Wang <wei.w.wang@intel.com> Signed-off-by: Wei Wang <wei.w.wang@intel.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Cc: stable@vger.kernel.org Fixes:86a559787e
("virtio-balloon: VIRTIO_BALLOON_F_FREE_PAGE_HINT") Signed-off-by: Yang Shi <yang.shi@linux.alibaba.com> Reviewed-by: Xunlei Pang <xlpang@linux.alibaba.com> Signed-off-by: Shile Zhang <shile.zhang@linux.alibaba.com>
This commit is contained in:
parent
a98451caa5
commit
99cb3f49e5
|
@ -381,16 +381,21 @@ static int vop_find_vqs(struct virtio_device *dev, unsigned nvqs,
|
|||
struct _vop_vdev *vdev = to_vopvdev(dev);
|
||||
struct vop_device *vpdev = vdev->vpdev;
|
||||
struct mic_device_ctrl __iomem *dc = vdev->dc;
|
||||
int i, err, retry;
|
||||
int i, err, retry, queue_idx = 0;
|
||||
|
||||
/* We must have this many virtqueues. */
|
||||
if (nvqs > ioread8(&vdev->desc->num_vq))
|
||||
return -ENOENT;
|
||||
|
||||
for (i = 0; i < nvqs; ++i) {
|
||||
if (!names[i]) {
|
||||
vqs[i] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
dev_dbg(_vop_dev(vdev), "%s: %d: %s\n",
|
||||
__func__, i, names[i]);
|
||||
vqs[i] = vop_find_vq(dev, i, callbacks[i], names[i],
|
||||
vqs[i] = vop_find_vq(dev, queue_idx++, callbacks[i], names[i],
|
||||
ctx ? ctx[i] : false);
|
||||
if (IS_ERR(vqs[i])) {
|
||||
err = PTR_ERR(vqs[i]);
|
||||
|
|
|
@ -141,10 +141,15 @@ static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
|
|||
const bool * ctx,
|
||||
struct irq_affinity *desc)
|
||||
{
|
||||
int i, ret;
|
||||
int i, ret, queue_idx = 0;
|
||||
|
||||
for (i = 0; i < nvqs; ++i) {
|
||||
vqs[i] = rp_find_vq(vdev, i, callbacks[i], names[i],
|
||||
if (!names[i]) {
|
||||
vqs[i] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
vqs[i] = rp_find_vq(vdev, queue_idx++, callbacks[i], names[i],
|
||||
ctx ? ctx[i] : false);
|
||||
if (IS_ERR(vqs[i])) {
|
||||
ret = PTR_ERR(vqs[i]);
|
||||
|
|
|
@ -640,7 +640,7 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
|
|||
{
|
||||
struct virtio_ccw_device *vcdev = to_vc_device(vdev);
|
||||
unsigned long *indicatorp = NULL;
|
||||
int ret, i;
|
||||
int ret, i, queue_idx = 0;
|
||||
struct ccw1 *ccw;
|
||||
|
||||
ccw = kzalloc(sizeof(*ccw), GFP_DMA | GFP_KERNEL);
|
||||
|
@ -648,8 +648,14 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
|
|||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < nvqs; ++i) {
|
||||
vqs[i] = virtio_ccw_setup_vq(vdev, i, callbacks[i], names[i],
|
||||
ctx ? ctx[i] : false, ccw);
|
||||
if (!names[i]) {
|
||||
vqs[i] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, callbacks[i],
|
||||
names[i], ctx ? ctx[i] : false,
|
||||
ccw);
|
||||
if (IS_ERR(vqs[i])) {
|
||||
ret = PTR_ERR(vqs[i]);
|
||||
vqs[i] = NULL;
|
||||
|
|
|
@ -468,7 +468,7 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned nvqs,
|
|||
{
|
||||
struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
|
||||
unsigned int irq = platform_get_irq(vm_dev->pdev, 0);
|
||||
int i, err;
|
||||
int i, err, queue_idx = 0;
|
||||
|
||||
err = request_irq(irq, vm_interrupt, IRQF_SHARED,
|
||||
dev_name(&vdev->dev), vm_dev);
|
||||
|
@ -476,7 +476,12 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned nvqs,
|
|||
return err;
|
||||
|
||||
for (i = 0; i < nvqs; ++i) {
|
||||
vqs[i] = vm_setup_vq(vdev, i, callbacks[i], names[i],
|
||||
if (!names[i]) {
|
||||
vqs[i] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
vqs[i] = vm_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
|
||||
ctx ? ctx[i] : false);
|
||||
if (IS_ERR(vqs[i])) {
|
||||
vm_del_vqs(vdev);
|
||||
|
|
Loading…
Reference in New Issue