From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jesper Dangaard Brouer Subject: Re: [PATCH RFC 6/9] veth: Add ndo_xdp_xmit Date: Wed, 25 Apr 2018 22:24:52 +0200 Message-ID: <20180425222452.1ea5c69f@redhat.com> References: <20180424143923.26519-1-toshiaki.makita1@gmail.com> <20180424143923.26519-7-toshiaki.makita1@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: brouer@redhat.com, netdev@vger.kernel.org, Toshiaki Makita To: Toshiaki Makita Return-path: Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51558 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750949AbeDYUY6 (ORCPT ); Wed, 25 Apr 2018 16:24:58 -0400 In-Reply-To: <20180424143923.26519-7-toshiaki.makita1@gmail.com> Sender: netdev-owner@vger.kernel.org List-ID: On Tue, 24 Apr 2018 23:39:20 +0900 Toshiaki Makita wrote: > +static int veth_xdp_xmit(struct net_device *dev, struct xdp_frame *frame) > +{ > + struct veth_priv *rcv_priv, *priv = netdev_priv(dev); > + int headroom = frame->data - (void *)frame; > + struct net_device *rcv; > + int err = 0; > + > + rcv = rcu_dereference(priv->peer); > + if (unlikely(!rcv)) > + return -ENXIO; > + > + rcv_priv = netdev_priv(rcv); > + /* xdp_ring is initialized on receive side? */ > + if (rcu_access_pointer(rcv_priv->xdp_prog)) { > + err = xdp_ok_fwd_dev(rcv, frame->len); > + if (unlikely(err)) > + return err; > + > + err = veth_xdp_enqueue(rcv_priv, veth_xdp_to_ptr(frame)); > + } else { > + struct sk_buff *skb; > + > + skb = veth_build_skb(frame, headroom, frame->len, 0); > + if (unlikely(!skb)) > + return -ENOMEM; > + > + /* Get page ref in case skb is dropped in netif_rx. > + * The caller is responsible for freeing the page on error. > + */ > + get_page(virt_to_page(frame->data)); I'm not sure you can make this assumption, that xdp_frames coming from another device driver uses a refcnt based memory model. But maybe I'm confused, as this looks like an SKB receive path, but in the ndo_xdp_xmit(). > + if (unlikely(veth_forward_skb(rcv, skb, false) != NET_RX_SUCCESS)) > + return -ENXIO; > + > + /* Put page ref on success */ > + page_frag_free(frame->data); > + } > + > + return err; > +} -- Best regards, Jesper Dangaard Brouer MSc.CS, Principal Kernel Engineer at Red Hat LinkedIn: http://www.linkedin.com/in/brouer