> From: Michael Kelley <[email protected]> > > 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: <[email protected]> # 5.15.x > Signed-off-by: Michael Kelley <[email protected]> > Reviewed-by: Kuppuswamy Sathyanarayanan > <[email protected]> > Reviewed-by: Ilpo Jarvinen <[email protected]> > > --- > 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 <[email protected]>
