Message ID | 20201119083024.119566-4-bjorn.topel@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | BPF |
Headers | show |
Series | Introduce preferred busy-polling | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for bpf-next |
netdev/subject_prefix | success | Link |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 1 this patch: 1 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | warning | WARNING: line length of 84 exceeds 80 columns |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 1 this patch: 1 |
netdev/header_inline | success | Link |
netdev/stable | success | Stable not CCed |
On Thu, Nov 19, 2020 at 9:32 AM Björn Töpel <bjorn.topel@gmail.com> wrote: > > From: Björn Töpel <bjorn.topel@intel.com> > > Add support for non-blocking recvmsg() to XDP sockets. Previously, > only sendmsg() was supported by XDP socket. Now, for symmetry and the > upcoming busy-polling support, recvmsg() is added. > > Signed-off-by: Björn Töpel <bjorn.topel@intel.com> > --- > net/xdp/xsk.c | 22 +++++++++++++++++++++- > 1 file changed, 21 insertions(+), 1 deletion(-) Acked-by: Magnus Karlsson <magnus.karlsson@intel.com> > diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c > index b0141973f23e..56a52ec75696 100644 > --- a/net/xdp/xsk.c > +++ b/net/xdp/xsk.c > @@ -531,6 +531,26 @@ static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len) > return __xsk_sendmsg(sk); > } > > +static int xsk_recvmsg(struct socket *sock, struct msghdr *m, size_t len, int flags) > +{ > + bool need_wait = !(flags & MSG_DONTWAIT); > + struct sock *sk = sock->sk; > + struct xdp_sock *xs = xdp_sk(sk); > + > + if (unlikely(!(xs->dev->flags & IFF_UP))) > + return -ENETDOWN; > + if (unlikely(!xs->rx)) > + return -ENOBUFS; > + if (unlikely(!xsk_is_bound(xs))) > + return -ENXIO; > + if (unlikely(need_wait)) > + return -EOPNOTSUPP; > + > + if (xs->pool->cached_need_wakeup & XDP_WAKEUP_RX && xs->zc) > + return xsk_wakeup(xs, XDP_WAKEUP_RX); > + return 0; > +} > + > static __poll_t xsk_poll(struct file *file, struct socket *sock, > struct poll_table_struct *wait) > { > @@ -1191,7 +1211,7 @@ static const struct proto_ops xsk_proto_ops = { > .setsockopt = xsk_setsockopt, > .getsockopt = xsk_getsockopt, > .sendmsg = xsk_sendmsg, > - .recvmsg = sock_no_recvmsg, > + .recvmsg = xsk_recvmsg, > .mmap = xsk_mmap, > .sendpage = sock_no_sendpage, > }; > -- > 2.27.0 >
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index b0141973f23e..56a52ec75696 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -531,6 +531,26 @@ static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len) return __xsk_sendmsg(sk); } +static int xsk_recvmsg(struct socket *sock, struct msghdr *m, size_t len, int flags) +{ + bool need_wait = !(flags & MSG_DONTWAIT); + struct sock *sk = sock->sk; + struct xdp_sock *xs = xdp_sk(sk); + + if (unlikely(!(xs->dev->flags & IFF_UP))) + return -ENETDOWN; + if (unlikely(!xs->rx)) + return -ENOBUFS; + if (unlikely(!xsk_is_bound(xs))) + return -ENXIO; + if (unlikely(need_wait)) + return -EOPNOTSUPP; + + if (xs->pool->cached_need_wakeup & XDP_WAKEUP_RX && xs->zc) + return xsk_wakeup(xs, XDP_WAKEUP_RX); + return 0; +} + static __poll_t xsk_poll(struct file *file, struct socket *sock, struct poll_table_struct *wait) { @@ -1191,7 +1211,7 @@ static const struct proto_ops xsk_proto_ops = { .setsockopt = xsk_setsockopt, .getsockopt = xsk_getsockopt, .sendmsg = xsk_sendmsg, - .recvmsg = sock_no_recvmsg, + .recvmsg = xsk_recvmsg, .mmap = xsk_mmap, .sendpage = sock_no_sendpage, };