]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Drivers: hv: Make the sysfs node size for the ring buffer dynamic
authorNaman Jain <namjain@linux.microsoft.com>
Fri, 2 May 2025 07:48:11 +0000 (13:18 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 Aug 2025 08:48:47 +0000 (09:48 +0100)
commit 65995e97a1caacf0024bebda3332b8d1f0f443c4 upstream.

The ring buffer size varies across VMBus channels. The size of sysfs
node for the ring buffer is currently hardcoded to 4 MB. Userspace
clients either use fstat() or hardcode this size for doing mmap().
To address this, make the sysfs node size dynamic to reflect the
actual ring buffer size for each channel. This will ensure that
fstat() on ring sysfs node always returns the correct size of
ring buffer.

Reviewed-by: Michael Kelley <mhklinux@outlook.com>
Tested-by: Michael Kelley <mhklinux@outlook.com>
Reviewed-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
Link: https://lore.kernel.org/r/20250502074811.2022-3-namjain@linux.microsoft.com
[ The structure "struct attribute_group" does not have bin_size field in
  v6.12.x kernel so the logic of configuring size of sysfs node for ring buffer
  has been moved to vmbus_chan_bin_attr_is_visible().
  Original change was not a fix, but it needs to be backported to fix size
  related discrepancy caused by the commit mentioned in Fixes tag. ]
Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/vmbus_drv.c

index 1f519e925f0601a3dd7c9e8b80b952a5ba04b7b7..616e63fb2f15107e2fd32e84788c5d976f4756dc 100644 (file)
@@ -1810,7 +1810,6 @@ static struct bin_attribute chan_attr_ring_buffer = {
                .name = "ring",
                .mode = 0600,
        },
-       .size = 2 * SZ_2M,
        .mmap = hv_mmap_ring_buffer_wrapper,
 };
 static struct attribute *vmbus_chan_attrs[] = {
@@ -1866,6 +1865,7 @@ static umode_t vmbus_chan_bin_attr_is_visible(struct kobject *kobj,
        /* Hide ring attribute if channel's ring_sysfs_visible is set to false */
        if (attr ==  &chan_attr_ring_buffer && !channel->ring_sysfs_visible)
                return 0;
+       attr->size = channel->ringbuffer_pagecount << PAGE_SHIFT;
 
        return attr->attr.mode;
 }