lkml.org 
[lkml]   [2018]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/32] net: refactor socket_poll
    Date
    Factor out two busy poll related helpers for late reuse, and remove
    a command that isn't very helpful, especially with the __poll_t
    annotations in place.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    ---
    include/net/busy_poll.h | 15 +++++++++++++++
    net/socket.c | 21 ++++-----------------
    2 files changed, 19 insertions(+), 17 deletions(-)

    diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h
    index 71c72a939bf8..c5187438af38 100644
    --- a/include/net/busy_poll.h
    +++ b/include/net/busy_poll.h
    @@ -121,6 +121,21 @@ static inline void sk_busy_loop(struct sock *sk, int nonblock)
    #endif
    }

    +static inline void sock_poll_busy_loop(struct socket *sock, __poll_t events)
    +{
    + if (sk_can_busy_loop(sock->sk) &&
    + events && (events & POLL_BUSY_LOOP)) {
    + /* once, only if requested by syscall */
    + sk_busy_loop(sock->sk, 1);
    + }
    +}
    +
    +/* if this socket can poll_ll, tell the system call */
    +static inline __poll_t sock_poll_busy_flag(struct socket *sock)
    +{
    + return sk_can_busy_loop(sock->sk) ? POLL_BUSY_LOOP : 0;
    +}
    +
    /* used in the NIC receive handler to mark the skb */
    static inline void skb_mark_napi_id(struct sk_buff *skb,
    struct napi_struct *napi)
    diff --git a/net/socket.c b/net/socket.c
    index f10f1d947c78..571ee4005192 100644
    --- a/net/socket.c
    +++ b/net/socket.c
    @@ -1117,24 +1117,11 @@ EXPORT_SYMBOL(sock_create_lite);
    /* No kernel lock held - perfect */
    static __poll_t sock_poll(struct file *file, poll_table *wait)
    {
    - __poll_t busy_flag = 0;
    - struct socket *sock;
    -
    - /*
    - * We can't return errors to poll, so it's either yes or no.
    - */
    - sock = file->private_data;
    -
    - if (sk_can_busy_loop(sock->sk)) {
    - /* this socket can poll_ll so tell the system call */
    - busy_flag = POLL_BUSY_LOOP;
    -
    - /* once, only if requested by syscall */
    - if (wait && (wait->_key & POLL_BUSY_LOOP))
    - sk_busy_loop(sock->sk, 1);
    - }
    + struct socket *sock = file->private_data;
    + __poll_t events = poll_requested_events(wait);

    - return busy_flag | sock->ops->poll(file, sock, wait);
    + sock_poll_busy_loop(sock, events);
    + return sock->ops->poll(file, sock, wait) | sock_poll_busy_flag(sock);
    }

    static int sock_mmap(struct file *file, struct vm_area_struct *vma)
    --
    2.17.0
    \
     
     \ /
      Last update: 2018-05-11 13:20    [W:4.271 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site