Patch "xsk: Simplify detection of empty and full rings" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    xsk: Simplify detection of empty and full rings

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     xsk-simplify-detection-of-empty-and-full-rings.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6c4cbef21253bc82dc2a759b3e0894f5303291c3
Author: Magnus Karlsson <magnus.karlsson@xxxxxxxxx>
Date:   Thu Dec 19 13:39:21 2019 +0100

    xsk: Simplify detection of empty and full rings
    
    [ Upstream commit 11cc2d21499cabe7e7964389634ed1de3ee91d33 ]
    
    In order to set the correct return flags for poll, the xsk code has to
    check if the Rx queue is empty and if the Tx queue is full. This code
    was unnecessarily large and complex as it used the functions that are
    used to update the local state from the global state (xskq_nb_free and
    xskq_nb_avail). Since we are not doing this nor updating any data
    dependent on this state, we can simplify the functions. Another
    benefit from this is that we can also simplify the xskq_nb_free and
    xskq_nb_avail functions in a later commit.
    
    Signed-off-by: Magnus Karlsson <magnus.karlsson@xxxxxxxxx>
    Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx>
    Link: https://lore.kernel.org/bpf/1576759171-28550-3-git-send-email-magnus.karlsson@xxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h
index eddae4688862..ee3f8c857dd8 100644
--- a/net/xdp/xsk_queue.h
+++ b/net/xdp/xsk_queue.h
@@ -363,12 +363,15 @@ static inline void xskq_produce_flush_desc(struct xsk_queue *q)
 
 static inline bool xskq_full_desc(struct xsk_queue *q)
 {
-	return xskq_nb_avail(q, q->nentries) == q->nentries;
+	/* No barriers needed since data is not accessed */
+	return READ_ONCE(q->ring->producer) - READ_ONCE(q->ring->consumer) ==
+		q->nentries;
 }
 
 static inline bool xskq_empty_desc(struct xsk_queue *q)
 {
-	return xskq_nb_free(q, q->prod_tail, q->nentries) == q->nentries;
+	/* No barriers needed since data is not accessed */
+	return READ_ONCE(q->ring->consumer) == READ_ONCE(q->ring->producer);
 }
 
 void xskq_set_umem(struct xsk_queue *q, u64 size, u64 chunk_mask);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux