Logan Gunthorpe <logang@xxxxxxxxxxxx> writes: > On 2024-09-09 22:14, Alistair Popple wrote: >> The reference counts for ZONE_DEVICE private pages should be >> initialised by the driver when the page is actually allocated by the >> driver allocator, not when they are first created. This is currently >> the case for MEMORY_DEVICE_PRIVATE and MEMORY_DEVICE_COHERENT pages >> but not MEMORY_DEVICE_PCI_P2PDMA pages so fix that up. >> >> Signed-off-by: Alistair Popple <apopple@xxxxxxxxxx> >> --- >> drivers/pci/p2pdma.c | 6 ++++++ >> mm/memremap.c | 17 +++++++++++++---- >> mm/mm_init.c | 22 ++++++++++++++++++---- >> 3 files changed, 37 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c >> index 4f47a13..210b9f4 100644 >> --- a/drivers/pci/p2pdma.c >> +++ b/drivers/pci/p2pdma.c >> @@ -129,6 +129,12 @@ static int p2pmem_alloc_mmap(struct file *filp, struct kobject *kobj, >> } >> >> /* >> + * Initialise the refcount for the freshly allocated page. As we have >> + * just allocated the page no one else should be using it. >> + */ >> + set_page_count(virt_to_page(kaddr), 1); >> + >> + /* >> * vm_insert_page() can sleep, so a reference is taken to mapping >> * such that rcu_read_unlock() can be done before inserting the >> * pages > This seems to only set reference count to the first page, when there can > be more than one page referenced by kaddr. Good point. > I suspect the page count adjustment should be done in the for loop > that's a few lines lower than this. Have moved it there for the next version, thanks! > I think a similar mistake was made by other recent changes. > > Thanks, > > Logan