Message ID | 20230130132804.223144-1-bmt@zurich.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | RDMA/siw: Fix user page pinning accounting | expand |
On Mon, Jan 30, 2023 at 02:28:04PM +0100, Bernard Metzler wrote: > To avoid racing with other user memory reservations, immediately > account full amount of pages to be pinned. > > Fixes: 2251334dcac9 ("rdma/siw: application buffer management") > Reported-by: Jason Gunthorpe <jgg@nvidia.com> > Suggested-by: Alistair Popple <apopple@nvidia.com> > Signed-off-by: Bernard Metzler <bmt@zurich.ibm.com> > --- > drivers/infiniband/sw/siw/siw_mem.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/infiniband/sw/siw/siw_mem.c b/drivers/infiniband/sw/siw/siw_mem.c > index b2b33dd3b4fa..7cf4d927bbab 100644 > --- a/drivers/infiniband/sw/siw/siw_mem.c > +++ b/drivers/infiniband/sw/siw/siw_mem.c > @@ -398,7 +398,8 @@ struct siw_umem *siw_umem_get(u64 start, u64 len, bool writable) > > mlock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; > > - if (num_pages + atomic64_read(&mm_s->pinned_vm) > mlock_limit) { > + if (num_pages + atomic64_add_return(num_pages, &mm_s->pinned_vm) > > + mlock_limit) { ??? Doesn't atomic_add_return return the result of adding num_pages and pinned_vm? Then you add it again? Jason
> -----Original Message----- > From: Jason Gunthorpe <jgg@nvidia.com> > Sent: Monday, 30 January 2023 14:29 > To: Bernard Metzler <BMT@zurich.ibm.com> > Cc: linux-rdma@vger.kernel.org; leonro@nvidia.com; apopple@nvidia.com > Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Fix user page pinning accounting > > On Mon, Jan 30, 2023 at 02:28:04PM +0100, Bernard Metzler wrote: > > To avoid racing with other user memory reservations, immediately > > account full amount of pages to be pinned. > > > > Fixes: 2251334dcac9 ("rdma/siw: application buffer management") > > Reported-by: Jason Gunthorpe <jgg@nvidia.com> > > Suggested-by: Alistair Popple <apopple@nvidia.com> > > Signed-off-by: Bernard Metzler <bmt@zurich.ibm.com> > > --- > > drivers/infiniband/sw/siw/siw_mem.c | 8 ++++++-- > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/infiniband/sw/siw/siw_mem.c > b/drivers/infiniband/sw/siw/siw_mem.c > > index b2b33dd3b4fa..7cf4d927bbab 100644 > > --- a/drivers/infiniband/sw/siw/siw_mem.c > > +++ b/drivers/infiniband/sw/siw/siw_mem.c > > @@ -398,7 +398,8 @@ struct siw_umem *siw_umem_get(u64 start, u64 len, > bool writable) > > > > mlock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; > > > > - if (num_pages + atomic64_read(&mm_s->pinned_vm) > mlock_limit) { > > + if (num_pages + atomic64_add_return(num_pages, &mm_s->pinned_vm) > > > + mlock_limit) { > > ??? > > Doesn't atomic_add_return return the result of adding num_pages and > pinned_vm? Then you add it again? > Stupid me. Thanks. Let me re-send > Jason
diff --git a/drivers/infiniband/sw/siw/siw_mem.c b/drivers/infiniband/sw/siw/siw_mem.c index b2b33dd3b4fa..7cf4d927bbab 100644 --- a/drivers/infiniband/sw/siw/siw_mem.c +++ b/drivers/infiniband/sw/siw/siw_mem.c @@ -398,7 +398,8 @@ struct siw_umem *siw_umem_get(u64 start, u64 len, bool writable) mlock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; - if (num_pages + atomic64_read(&mm_s->pinned_vm) > mlock_limit) { + if (num_pages + atomic64_add_return(num_pages, &mm_s->pinned_vm) > + mlock_limit) { rv = -ENOMEM; goto out_sem_up; } @@ -429,7 +430,6 @@ struct siw_umem *siw_umem_get(u64 start, u64 len, bool writable) goto out_sem_up; umem->num_pages += rv; - atomic64_add(rv, &mm_s->pinned_vm); first_page_va += rv * PAGE_SIZE; nents -= rv; got += rv; @@ -442,6 +442,10 @@ struct siw_umem *siw_umem_get(u64 start, u64 len, bool writable) if (rv > 0) return umem; + /* Adjust accounting for pages not pinned */ + if (num_pages) + atomic64_sub(num_pages, &mm_s->pinned_vm); + siw_umem_release(umem, false); return ERR_PTR(rv);
To avoid racing with other user memory reservations, immediately account full amount of pages to be pinned. Fixes: 2251334dcac9 ("rdma/siw: application buffer management") Reported-by: Jason Gunthorpe <jgg@nvidia.com> Suggested-by: Alistair Popple <apopple@nvidia.com> Signed-off-by: Bernard Metzler <bmt@zurich.ibm.com> --- drivers/infiniband/sw/siw/siw_mem.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)