diff options
| author | Davidlohr Bueso <dave@stgolabs.net> | 2019-02-11 11:15:29 -0500 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-02-11 14:51:09 -0500 |
| commit | e451eb51068496054d071af10b3530af4002a4f4 (patch) | |
| tree | 16bb1b5cf6371282e39850d1c98978f261c3cb57 /net | |
| parent | 3defaf2f15b2bfd86c6664181ac009e91985f8ac (diff) | |
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: c0c77d8fb787 ("xsk: add user memory registration support sockopt")
Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
Cc: David S. Miller <davem@davemloft.net>
Cc: Bjorn Topel <bjorn.topel@intel.com>
Cc: Magnus Karlsson <magnus.karlsson@intel.com>
CC: netdev@vger.kernel.org
Acked-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'net')
| -rw-r--r-- | net/xdp/xdp_umem.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c index d4de871e7d4d..597866e7c441 100644 --- a/net/xdp/xdp_umem.c +++ b/net/xdp/xdp_umem.c | |||
| @@ -259,10 +259,10 @@ static int xdp_umem_pin_pages(struct xdp_umem *umem) | |||
| 259 | if (!umem->pgs) | 259 | if (!umem->pgs) |
| 260 | return -ENOMEM; | 260 | return -ENOMEM; |
| 261 | 261 | ||
| 262 | down_write(¤t->mm->mmap_sem); | 262 | down_read(¤t->mm->mmap_sem); |
| 263 | npgs = get_user_pages(umem->address, umem->npgs, | 263 | npgs = get_user_pages_longterm(umem->address, umem->npgs, |
| 264 | gup_flags, &umem->pgs[0], NULL); | 264 | gup_flags, &umem->pgs[0], NULL); |
| 265 | up_write(¤t->mm->mmap_sem); | 265 | up_read(¤t->mm->mmap_sem); |
| 266 | 266 | ||
| 267 | if (npgs != umem->npgs) { | 267 | if (npgs != umem->npgs) { |
| 268 | if (npgs >= 0) { | 268 | if (npgs >= 0) { |
