bus/vmbus: fix race in subchannel creation
authorStephen Hemminger <sthemmin@microsoft.com>
Wed, 5 Dec 2018 22:11:56 +0000 (14:11 -0800)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 19 Dec 2018 02:01:55 +0000 (03:01 +0100)
When using multiple queues, there was a race with the kernel
in setting up the second channel. This regression is due to a kernel change
which does not allow accessing sysfs files for Hyper-V channels that are not opened.

The fix is simple, just move the logic to detect not ready
sub channels earlier in the existing loop.

Fixes: 831dba47bd36 ("bus/vmbus: add Hyper-V virtual bus support")
Cc: stable@dpdk.org
Reported-by: Mohammed Gamal <mgamal@redhat.com>
Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
drivers/bus/vmbus/linux/vmbus_uio.c

index 12e97e3..38df4d7 100644 (file)
@@ -357,6 +357,12 @@ int vmbus_uio_get_subchan(struct vmbus_channel *primary,
                        continue;
                }
 
+               if (!vmbus_isnew_subchannel(primary, relid))
+                       continue;       /* Already know about you */
+
+               if (!vmbus_uio_ring_present(dev, relid))
+                       continue;       /* Ring may not be ready yet */
+
                snprintf(subchan_path, sizeof(subchan_path), "%s/%lu",
                         chan_path, relid);
                err = vmbus_uio_sysfs_read(subchan_path, "subchannel_id",
@@ -370,12 +376,6 @@ int vmbus_uio_get_subchan(struct vmbus_channel *primary,
                if (subid == 0)
                        continue;       /* skip primary channel */
 
-               if (!vmbus_isnew_subchannel(primary, relid))
-                       continue;
-
-               if (!vmbus_uio_ring_present(dev, relid))
-                       continue;       /* Ring may not be ready yet */
-
                err = vmbus_uio_sysfs_read(subchan_path, "monitor_id",
                                           &monid, UINT8_MAX);
                if (err) {