Message ID | 20240216202240.251818-1-mhklinux@outlook.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Krzysztof Wilczyński |
Headers | show |
Series | [v3,1/1] PCI: hv: Fix ring buffer size calculation | expand |
> From: Michael Kelley <mhklinux@outlook.com> > > For a physical PCI device that is passed through to a Hyper-V guest VM, current > code specifies the VMBus ring buffer size as 4 pages. But this is an inappropriate > dependency, since the amount of ring buffer space needed is unrelated to > PAGE_SIZE. For example, on x86 the ring buffer size ends up as 16 Kbytes, while > on ARM64 with 64 Kbyte pages, the ring size bloats to 256 Kbytes. The ring buffer > for PCI pass-thru devices is used for only a few messages during device setup and > removal, so any space above a few Kbytes is wasted. > > Fix this by declaring the ring buffer size to be a fixed 16 Kbytes. > Furthermore, use the VMBUS_RING_SIZE() macro so that the ring buffer header is > properly accounted for, and so the size is rounded up to a page boundary, using > the page size for which the kernel is built. While > w/64 Kbyte pages this results in a 64 Kbyte ring buffer header plus a > 64 Kbyte ring buffer, that's the smallest possible with that page size. > It's still 128 Kbytes better than the current code. > > Cc: <stable@vger.kernel.org> # 5.15.x > Signed-off-by: Michael Kelley <mhklinux@outlook.com> > Reviewed-by: Kuppuswamy Sathyanarayanan > <sathyanarayanan.kuppuswamy@linux.intel.com> > Reviewed-by: Ilpo Jarvinen <ilpo.jarvinen@linux.intel.com> > > --- > Changes in v3: > * Add #include of sizes.h > Changes in v2: > * Use SZ_16K instead of 16 * 1024 > --- > drivers/pci/controller/pci-hyperv.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci- > hyperv.c > index 1eaffff40b8d..5992280e8110 100644 > --- a/drivers/pci/controller/pci-hyperv.c > +++ b/drivers/pci/controller/pci-hyperv.c > @@ -49,6 +49,7 @@ > #include <linux/refcount.h> > #include <linux/irqdomain.h> > #include <linux/acpi.h> > +#include <linux/sizes.h> > #include <asm/mshyperv.h> > > /* > @@ -465,7 +466,7 @@ struct pci_eject_response { > u32 status; > } __packed; > > -static int pci_ring_size = (4 * PAGE_SIZE); > +static int pci_ring_size = VMBUS_RING_SIZE(SZ_16K); > > /* > * Driver specific state. > -- > 2.25.1 > Reviewed-by: Long Li <longli@microsoft.com>
Hello, > For a physical PCI device that is passed through to a Hyper-V guest VM, > current code specifies the VMBus ring buffer size as 4 pages. But this > is an inappropriate dependency, since the amount of ring buffer space > needed is unrelated to PAGE_SIZE. For example, on x86 the ring buffer > size ends up as 16 Kbytes, while on ARM64 with 64 Kbyte pages, the ring > size bloats to 256 Kbytes. The ring buffer for PCI pass-thru devices > is used for only a few messages during device setup and removal, so any > space above a few Kbytes is wasted. > > Fix this by declaring the ring buffer size to be a fixed 16 Kbytes. > Furthermore, use the VMBUS_RING_SIZE() macro so that the ring buffer > header is properly accounted for, and so the size is rounded up to a > page boundary, using the page size for which the kernel is built. While > w/64 Kbyte pages this results in a 64 Kbyte ring buffer header plus a > 64 Kbyte ring buffer, that's the smallest possible with that page size. > It's still 128 Kbytes better than the current code. Applied to controller/hyperv, thank you! [1/1] PCI: hv: Fix ring buffer size calculation https://git.kernel.org/pci/pci/c/192c0b72019f Krzysztof
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c index 1eaffff40b8d..5992280e8110 100644 --- a/drivers/pci/controller/pci-hyperv.c +++ b/drivers/pci/controller/pci-hyperv.c @@ -49,6 +49,7 @@ #include <linux/refcount.h> #include <linux/irqdomain.h> #include <linux/acpi.h> +#include <linux/sizes.h> #include <asm/mshyperv.h> /* @@ -465,7 +466,7 @@ struct pci_eject_response { u32 status; } __packed; -static int pci_ring_size = (4 * PAGE_SIZE); +static int pci_ring_size = VMBUS_RING_SIZE(SZ_16K); /* * Driver specific state.