Drivers: hv: vmbus: Add utility function for querying ring size

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>
This commit is contained in:
Saurabh Sengar 2024-03-30 01:51:57 -07:00 committed by Greg Kroah-Hartman
parent a36b69775f
commit e8c4bd6c6e
3 changed files with 19 additions and 3 deletions

View File

@ -120,7 +120,9 @@ const struct vmbus_device vmbus_devs[] = {
}, },
/* File copy */ /* 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, HV_FCOPY_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false, .allowed_in_isolated = false,
@ -140,12 +142,19 @@ const struct vmbus_device vmbus_devs[] = {
.allowed_in_isolated = false, .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, .perf_device = false,
.allowed_in_isolated = false, .allowed_in_isolated = false,
}, },
}; };
EXPORT_SYMBOL_GPL(vmbus_devs);
static const struct { static const struct {
guid_t guid; guid_t guid;

View File

@ -417,6 +417,11 @@ static inline bool hv_is_perf_channel(struct vmbus_channel *channel)
return vmbus_devs[channel->device_id].perf_device; 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) static inline bool hv_is_allocated_cpu(unsigned int cpu)
{ {
struct vmbus_channel *channel, *sc; struct vmbus_channel *channel, *sc;

View File

@ -820,6 +820,8 @@ struct vmbus_requestor {
#define VMBUS_RQST_RESET (U64_MAX - 3) #define VMBUS_RQST_RESET (U64_MAX - 3)
struct vmbus_device { 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; u16 dev_type;
guid_t guid; guid_t guid;
bool perf_device; bool perf_device;