]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Drivers: hv: vmbus: Add utility function for querying ring size
authorSaurabh Sengar <ssengar@linux.microsoft.com>
Sat, 30 Mar 2024 08:51:57 +0000 (01:51 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Jul 2025 13:57:36 +0000 (15:57 +0200)
[ Upstream commit e8c4bd6c6e6b7e7b416c42806981c2a81370001e ]

Add a function to query for the preferred ring buffer size of VMBus
device. This will allow the drivers (eg. UIO) to allocate the most
optimized ring buffer size for devices.

Signed-off-by: Saurabh Sengar <ssengar@linux.microsoft.com>
Reviewed-by: Long Li <longli@microsoft.com>
Link: https://lore.kernel.org/r/1711788723-8593-2-git-send-email-ssengar@linux.microsoft.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Stable-dep-of: 0315fef2aff9 ("uio_hv_generic: Align ring size to system page")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/hv/channel_mgmt.c
drivers/hv/hyperv_vmbus.h
include/linux/hyperv.h

index 029f8269ad15d0e9241369e9cfdc8c1f8c0a2b0d..cd9f01b7d37ddd437bd28d429345a5ceba12b19d 100644 (file)
@@ -119,7 +119,9 @@ const struct vmbus_device vmbus_devs[] = {
        },
 
        /* File copy */
-       { .dev_type = HV_FCOPY,
+       /* fcopy always uses 16KB ring buffer size and is working well for last many years */
+       { .pref_ring_size = 0x4000,
+         .dev_type = HV_FCOPY,
          HV_FCOPY_GUID,
          .perf_device = false,
          .allowed_in_isolated = false,
@@ -139,12 +141,19 @@ const struct vmbus_device vmbus_devs[] = {
          .allowed_in_isolated = false,
        },
 
-       /* Unknown GUID */
-       { .dev_type = HV_UNKNOWN,
+       /*
+        * Unknown GUID
+        * 64 KB ring buffer + 4 KB header should be sufficient size for any Hyper-V device apart
+        * from HV_NIC and HV_SCSI. This case avoid the fallback for unknown devices to allocate
+        * much bigger (2 MB) of ring size.
+        */
+       { .pref_ring_size = 0x11000,
+         .dev_type = HV_UNKNOWN,
          .perf_device = false,
          .allowed_in_isolated = false,
        },
 };
+EXPORT_SYMBOL_GPL(vmbus_devs);
 
 static const struct {
        guid_t guid;
index 6a0ae815a198ecdc4b6372241283b3b1b7666424..b87adb3a982112f2331871e4632def43107f0f7c 100644 (file)
@@ -405,6 +405,11 @@ static inline bool hv_is_perf_channel(struct vmbus_channel *channel)
        return vmbus_devs[channel->device_id].perf_device;
 }
 
+static inline size_t hv_dev_ring_size(struct vmbus_channel *channel)
+{
+       return vmbus_devs[channel->device_id].pref_ring_size;
+}
+
 static inline bool hv_is_allocated_cpu(unsigned int cpu)
 {
        struct vmbus_channel *channel, *sc;
index aff435a42ead9cab0afebe6bcbd4e5ff665909ce..62d5bb1f726f6e561dbd0b43f7a14899fe2d28bb 100644 (file)
@@ -815,6 +815,8 @@ struct vmbus_requestor {
 #define VMBUS_RQST_RESET (U64_MAX - 3)
 
 struct vmbus_device {
+       /* preferred ring buffer size in KB, 0 means no preferred size for this device */
+       size_t pref_ring_size;
        u16  dev_type;
        guid_t guid;
        bool perf_device;