xsk: share the mmap_sem for page pinning

Holding mmap_sem exclusively for a gup() is an overkill. Lets
share the lock and replace the gup call for gup_longterm(), as
it is better suited for the lifetime of the pinning.

Fixes: c0c77d8fb7 ("xsk: add user memory registration support sockopt")
Signed-off-by: Davidlohr Bueso <[email protected]>
Cc: David S. Miller <[email protected]>
Cc: Bjorn Topel <[email protected]>
Cc: Magnus Karlsson <[email protected]>
CC: [email protected]
Acked-by: Björn Töpel <[email protected]>
Signed-off-by: Daniel Borkmann <[email protected]>
This commit is contained in:
Davidlohr Bueso authored and Daniel Borkmann committed 2019-02-11 20:51:09 +01:00
1 parent 3defaf2f15
commit e451eb5106
1 file changed
+4 -4
+4 -4
View File
@@ -259,10 +259,10 @@ static int xdp_umem_pin_pages(struct xdp_umem *umem)
if (!umem->pgs)
return -ENOMEM;
down_write(&current->mm->mmap_sem);
npgs = get_user_pages(umem->address, umem->npgs,
gup_flags, &umem->pgs[0], NULL);
up_write(&current->mm->mmap_sem);
down_read(&current->mm->mmap_sem);
npgs = get_user_pages_longterm(umem->address, umem->npgs,
gup_flags, &umem->pgs[0], NULL);
up_read(&current->mm->mmap_sem);
if (npgs != umem->npgs) {
if (npgs >= 0) {