2121#include <linux/uaccess.h>
2222#include <linux/net.h>
2323#include <linux/netdevice.h>
24+ #include <linux/rculist.h>
2425#include <net/xdp_sock.h>
2526#include <net/xdp.h>
2627
@@ -138,6 +139,59 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
138139 return err ;
139140}
140141
142+ void xsk_umem_complete_tx (struct xdp_umem * umem , u32 nb_entries )
143+ {
144+ xskq_produce_flush_addr_n (umem -> cq , nb_entries );
145+ }
146+ EXPORT_SYMBOL (xsk_umem_complete_tx );
147+
148+ void xsk_umem_consume_tx_done (struct xdp_umem * umem )
149+ {
150+ struct xdp_sock * xs ;
151+
152+ rcu_read_lock ();
153+ list_for_each_entry_rcu (xs , & umem -> xsk_list , list ) {
154+ xs -> sk .sk_write_space (& xs -> sk );
155+ }
156+ rcu_read_unlock ();
157+ }
158+ EXPORT_SYMBOL (xsk_umem_consume_tx_done );
159+
160+ bool xsk_umem_consume_tx (struct xdp_umem * umem , dma_addr_t * dma , u32 * len )
161+ {
162+ struct xdp_desc desc ;
163+ struct xdp_sock * xs ;
164+
165+ rcu_read_lock ();
166+ list_for_each_entry_rcu (xs , & umem -> xsk_list , list ) {
167+ if (!xskq_peek_desc (xs -> tx , & desc ))
168+ continue ;
169+
170+ if (xskq_produce_addr_lazy (umem -> cq , desc .addr ))
171+ goto out ;
172+
173+ * dma = xdp_umem_get_dma (umem , desc .addr );
174+ * len = desc .len ;
175+
176+ xskq_discard_desc (xs -> tx );
177+ rcu_read_unlock ();
178+ return true;
179+ }
180+
181+ out :
182+ rcu_read_unlock ();
183+ return false;
184+ }
185+ EXPORT_SYMBOL (xsk_umem_consume_tx );
186+
187+ static int xsk_zc_xmit (struct sock * sk )
188+ {
189+ struct xdp_sock * xs = xdp_sk (sk );
190+ struct net_device * dev = xs -> dev ;
191+
192+ return dev -> netdev_ops -> ndo_xsk_async_xmit (dev , xs -> queue_id );
193+ }
194+
141195static void xsk_destruct_skb (struct sk_buff * skb )
142196{
143197 u64 addr = (u64 )(long )skb_shinfo (skb )-> destructor_arg ;
@@ -151,7 +205,6 @@ static void xsk_destruct_skb(struct sk_buff *skb)
151205static int xsk_generic_xmit (struct sock * sk , struct msghdr * m ,
152206 size_t total_len )
153207{
154- bool need_wait = !(m -> msg_flags & MSG_DONTWAIT );
155208 u32 max_batch = TX_BATCH_SIZE ;
156209 struct xdp_sock * xs = xdp_sk (sk );
157210 bool sent_frame = false;
@@ -161,8 +214,6 @@ static int xsk_generic_xmit(struct sock *sk, struct msghdr *m,
161214
162215 if (unlikely (!xs -> tx ))
163216 return - ENOBUFS ;
164- if (need_wait )
165- return - EOPNOTSUPP ;
166217
167218 mutex_lock (& xs -> mutex );
168219
@@ -192,7 +243,7 @@ static int xsk_generic_xmit(struct sock *sk, struct msghdr *m,
192243 goto out ;
193244 }
194245
195- skb = sock_alloc_send_skb (sk , len , ! need_wait , & err );
246+ skb = sock_alloc_send_skb (sk , len , 1 , & err );
196247 if (unlikely (!skb )) {
197248 err = - EAGAIN ;
198249 goto out ;
@@ -235,15 +286,18 @@ static int xsk_generic_xmit(struct sock *sk, struct msghdr *m,
235286
236287static int xsk_sendmsg (struct socket * sock , struct msghdr * m , size_t total_len )
237288{
289+ bool need_wait = !(m -> msg_flags & MSG_DONTWAIT );
238290 struct sock * sk = sock -> sk ;
239291 struct xdp_sock * xs = xdp_sk (sk );
240292
241293 if (unlikely (!xs -> dev ))
242294 return - ENXIO ;
243295 if (unlikely (!(xs -> dev -> flags & IFF_UP )))
244296 return - ENETDOWN ;
297+ if (need_wait )
298+ return - EOPNOTSUPP ;
245299
246- return xsk_generic_xmit (sk , m , total_len );
300+ return ( xs -> zc ) ? xsk_zc_xmit ( sk ) : xsk_generic_xmit (sk , m , total_len );
247301}
248302
249303static unsigned int xsk_poll (struct file * file , struct socket * sock ,
@@ -419,10 +473,11 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
419473 }
420474
421475 xs -> dev = dev ;
422- xs -> queue_id = sxdp -> sxdp_queue_id ;
423-
476+ xs -> zc = xs -> umem -> zc ;
477+ xs -> queue_id = qid ;
424478 xskq_set_umem (xs -> rx , & xs -> umem -> props );
425479 xskq_set_umem (xs -> tx , & xs -> umem -> props );
480+ xdp_add_sk_umem (xs -> umem , xs );
426481
427482out_unlock :
428483 if (err )
@@ -660,6 +715,7 @@ static void xsk_destruct(struct sock *sk)
660715
661716 xskq_destroy (xs -> rx );
662717 xskq_destroy (xs -> tx );
718+ xdp_del_sk_umem (xs -> umem , xs );
663719 xdp_put_umem (xs -> umem );
664720
665721 sk_refcnt_debug_dec (sk );
0 commit comments