wireguard: queueing: get rid of per-peer ring buffers
[linux-2.6-microblaze.git] / drivers / net / wireguard / queueing.h
index dfb674e..4ef2944 100644 (file)
@@ -17,12 +17,13 @@ struct wg_device;
 struct wg_peer;
 struct multicore_worker;
 struct crypt_queue;
+struct prev_queue;
 struct sk_buff;
 
 /* queueing.c APIs: */
 int wg_packet_queue_init(struct crypt_queue *queue, work_func_t function,
-                        bool multicore, unsigned int len);
-void wg_packet_queue_free(struct crypt_queue *queue, bool multicore);
+                        unsigned int len);
+void wg_packet_queue_free(struct crypt_queue *queue);
 struct multicore_worker __percpu *
 wg_packet_percpu_multicore_worker_alloc(work_func_t function, void *ptr);
 
@@ -135,8 +136,31 @@ static inline int wg_cpumask_next_online(int *next)
        return cpu;
 }
 
+void wg_prev_queue_init(struct prev_queue *queue);
+
+/* Multi producer */
+bool wg_prev_queue_enqueue(struct prev_queue *queue, struct sk_buff *skb);
+
+/* Single consumer */
+struct sk_buff *wg_prev_queue_dequeue(struct prev_queue *queue);
+
+/* Single consumer */
+static inline struct sk_buff *wg_prev_queue_peek(struct prev_queue *queue)
+{
+       if (queue->peeked)
+               return queue->peeked;
+       queue->peeked = wg_prev_queue_dequeue(queue);
+       return queue->peeked;
+}
+
+/* Single consumer */
+static inline void wg_prev_queue_drop_peeked(struct prev_queue *queue)
+{
+       queue->peeked = NULL;
+}
+
 static inline int wg_queue_enqueue_per_device_and_peer(
-       struct crypt_queue *device_queue, struct crypt_queue *peer_queue,
+       struct crypt_queue *device_queue, struct prev_queue *peer_queue,
        struct sk_buff *skb, struct workqueue_struct *wq, int *next_cpu)
 {
        int cpu;
@@ -145,8 +169,9 @@ static inline int wg_queue_enqueue_per_device_and_peer(
        /* We first queue this up for the peer ingestion, but the consumer
         * will wait for the state to change to CRYPTED or DEAD before.
         */
-       if (unlikely(ptr_ring_produce_bh(&peer_queue->ring, skb)))
+       if (unlikely(!wg_prev_queue_enqueue(peer_queue, skb)))
                return -ENOSPC;
+
        /* Then we queue it up in the device queue, which consumes the
         * packet as soon as it can.
         */
@@ -157,9 +182,7 @@ static inline int wg_queue_enqueue_per_device_and_peer(
        return 0;
 }
 
-static inline void wg_queue_enqueue_per_peer(struct crypt_queue *queue,
-                                            struct sk_buff *skb,
-                                            enum packet_state state)
+static inline void wg_queue_enqueue_per_peer_tx(struct sk_buff *skb, enum packet_state state)
 {
        /* We take a reference, because as soon as we call atomic_set, the
         * peer can be freed from below us.
@@ -167,14 +190,12 @@ static inline void wg_queue_enqueue_per_peer(struct crypt_queue *queue,
        struct wg_peer *peer = wg_peer_get(PACKET_PEER(skb));
 
        atomic_set_release(&PACKET_CB(skb)->state, state);
-       queue_work_on(wg_cpumask_choose_online(&peer->serial_work_cpu,
-                                              peer->internal_id),
-                     peer->device->packet_crypt_wq, &queue->work);
+       queue_work_on(wg_cpumask_choose_online(&peer->serial_work_cpu, peer->internal_id),
+                     peer->device->packet_crypt_wq, &peer->transmit_packet_work);
        wg_peer_put(peer);
 }
 
-static inline void wg_queue_enqueue_per_peer_napi(struct sk_buff *skb,
-                                                 enum packet_state state)
+static inline void wg_queue_enqueue_per_peer_rx(struct sk_buff *skb, enum packet_state state)
 {
        /* We take a reference, because as soon as we call atomic_set, the
         * peer can be freed from below us.