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, 11 Apr 2024 12:55:53 +0000 (14:55 +0200)
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>
drivers/hv/channel_mgmt.c
drivers/hv/hyperv_vmbus.h
include/linux/hyperv.h

index 2f4d09ce027a3f6b07132da55c6b31cdbbfaf25b..3c6011a48dabe749325782ea90d9de228eb3e761 100644 (file)
@@ -120,7 +120,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,
@@ -140,12 +142,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 f6b1e710f805511229258bea51a722a0dcb898f6..76ac5185a01a881bfdf1c9030cc7cc4760257960 100644 (file)
@@ -417,6 +417,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 6ef0557b4bff8ed5d14bc18391d356913136c23c..7de9f90d3f95e01a494280ab552ce663a77a6217 100644 (file)
@@ -820,6 +820,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;