netlink: rx mmap: notify only when NL_MMAP_STATUS_VALID frame exists
Subsystems (2)
RFC PATCH 5/5 netlink: rx mmap: notify only when NL_MMAP_STATUS_VALID frame exists
Signed-off-by Ken-ichirou MATSUZAWA <[email protected]>
--- net/netlink/af_netlink.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
net/netlink/af_netlink.c +16 -12
@@ -576,16 +576,6 @@ netlink_current_frame(const struct netlink_ring *ring,return netlink_lookup_frame (ring, ring->head, status); } -static struct nl_mmap_hdr * -netlink_previous_frame (const struct netlink_ring *ring, -enum nl_mmap_status status) -{ -unsigned int prev; - - prev = ring->head ? ring->head -1 : ring->frame_max; -return netlink_lookup_frame (ring, prev, status); -} -static void netlink_increment_head (struct netlink_ring *ring) { ring->head = ring->head != ring->frame_max ? ring->head +1 :0 ;
@@ -606,6 +596,21 @@ static void netlink_forward_ring(struct netlink_ring *ring) }while (ring->head != head); } +static bool netlink_has_valid_frame (struct netlink_ring *ring) +{ +unsigned int head = ring->head, pos = head; +const struct nl_mmap_hdr *hdr; + +do { + hdr =__netlink_lookup_frame (ring, pos); +if (hdr->nm_status ==NL_MMAP_STATUS_VALID ) +return true; + pos = pos != ring->frame_max ? pos +1 :0 ; + }while (pos != head); + +return false; +} +static bool netlink_dump_space (struct netlink_sock *nlk) {struct netlink_ring *ring = &nlk->rx_ring;
@@ -653,8 +658,7 @@ static unsigned int netlink_poll(struct file *file, struct socket *sock,spin_lock_bh (&sk->sk_receive_queue.lock);if (nlk->rx_ring.pg_vec) { -netlink_forward_ring (&nlk->rx_ring); -if (!netlink_previous_frame (&nlk->rx_ring,NL_MMAP_STATUS_UNUSED )) +if (netlink_has_valid_frame (&nlk->rx_ring)) mask |=POLLIN |POLLRDNORM ; }spin_unlock_bh (&sk->sk_receive_queue.lock);
Signature · 4 lines
1.7.10.4 ----- End forwarded message -----