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 <[email protected]>
Reviewed-by: Long Li <[email protected]>
---
[V2]
- Added more details in commit message.
- Added comments for preferred ring sizes and there values.
- Added reviewed-by from Long Li.

 drivers/hv/channel_mgmt.c | 15 ++++++++++++---
 drivers/hv/hyperv_vmbus.h |  5 +++++
 include/linux/hyperv.h    |  2 ++
 3 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index 2f4d09ce027a..3c6011a48dab 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -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;
diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
index f6b1e710f805..76ac5185a01a 100644
--- a/drivers/hv/hyperv_vmbus.h
+++ b/drivers/hv/hyperv_vmbus.h
@@ -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;
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index 6ef0557b4bff..7de9f90d3f95 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -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;
-- 
2.34.1


Reply via email to