]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Drivers: hv: vmbus: Fix rescind handling in uio_hv_generic
authorNaman Jain <namjain@linux.microsoft.com>
Thu, 29 Aug 2024 07:13:12 +0000 (12:43 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Sep 2024 09:06:50 +0000 (11:06 +0200)
commit 6fd28941447bf2c8ca0f26fda612a1cabc41663f upstream.

Rescind offer handling relies on rescind callbacks for some of the
resources cleanup, if they are registered. It does not unregister
vmbus device for the primary channel closure, when callback is
registered. Without it, next onoffer does not come, rescind flag
remains set and device goes to unusable state.

Add logic to unregister vmbus for the primary channel in rescind callback
to ensure channel removal and relid release, and to ensure that next
onoffer can be received and handled properly.

Cc: stable@vger.kernel.org
Fixes: ca3cda6fcf1e ("uio_hv_generic: add rescind support")
Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
Reviewed-by: Saurabh Sengar <ssengar@linux.microsoft.com>
Link: https://lore.kernel.org/r/20240829071312.1595-3-namjain@linux.microsoft.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/vmbus_drv.c
drivers/uio/uio_hv_generic.c

index e99400f3ae1d112ab8e94053203abd1e59376f01..39339b152b8baa1cd75794205d60ba0c35c63140 100644 (file)
@@ -1965,6 +1965,7 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(vmbus_device_unregister);
 
 /*
  * vmbus_remove_channel_attr_group - remove the channel's attribute group
index a09e062b8e30026a8560b81238db47ce5a1bac57..3343cac607379d43e5fbb9a02e08b476b37849c9 100644 (file)
@@ -119,6 +119,14 @@ static void hv_uio_rescind(struct vmbus_channel *channel)
 
        /* Wake up reader */
        uio_event_notify(&pdata->info);
+
+       /*
+        * With rescind callback registered, rescind path will not unregister the device
+        * from vmbus when the primary channel is rescinded.
+        * Without it, rescind handling is incomplete and next onoffer msg does not come.
+        * Unregister the device from vmbus here.
+        */
+       vmbus_device_unregister(channel->device_obj);
 }
 
 /* Sysfs API to allow mmap of the ring buffers