> From: Michael Kelley <mhklinux@xxxxxxxxxxx> > > 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@xxxxxxxxxxxxxxx> # 5.15.x > Signed-off-by: Michael Kelley <mhklinux@xxxxxxxxxxx> > Reviewed-by: Kuppuswamy Sathyanarayanan > <sathyanarayanan.kuppuswamy@xxxxxxxxxxxxxxx> > Reviewed-by: Ilpo Jarvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx> > > --- > 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@xxxxxxxxxxxxx>