From: "Michael S. Tsirkin" <mst@redhat.com>
To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Cc: "Xuan Zhuo" <xuanzhuo@linux.alibaba.com>,
"Jason Wang" <jasowang@redhat.com>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
virtualization@lists.linux.dev,
"Si-Wei Liu" <si-wei.liu@oracle.com>,
"Darren Kenny" <darren.kenny@oracle.com>,
"Boris Ostrovsky" <boris.ostrovsky@oracle.com>,
"Eugenio Pérez" <eperezma@redhat.com>,
"Alexei Starovoitov" <ast@kernel.org>,
"Daniel Borkmann" <daniel@iogearbox.net>,
"Jesper Dangaard Brouer" <hawk@kernel.org>,
"John Fastabend" <john.fastabend@gmail.com>,
bpf@vger.kernel.org
Subject: [RFC PATCH v2 1/7] Revert "virtio_net: xsk: rx: support recv merge mode"
Date: Fri, 6 Sep 2024 05:52:16 -0400 [thread overview]
Message-ID: <51e961cfb4f0a4db7fb4a7dc97cc966af05bf895.1725616135.git.mst@redhat.com> (raw)
In-Reply-To: <cover.1725616135.git.mst@redhat.com>
This reverts commit 99c861b44eb1fb9dfe8776854116a6a9064c19bb.
leads to crashes with no ACCESS_PLATFORM when
sysctl net.core.high_order_alloc_disable=1
Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Reported-by: Si-Wei Liu <si-wei.liu@oracle.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
drivers/net/virtio_net.c | 144 ---------------------------------------
1 file changed, 144 deletions(-)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index c6af18948092..15e202dd6964 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -504,10 +504,6 @@ static int virtnet_xdp_handler(struct bpf_prog *xdp_prog, struct xdp_buff *xdp,
struct virtnet_rq_stats *stats);
static void virtnet_receive_done(struct virtnet_info *vi, struct receive_queue *rq,
struct sk_buff *skb, u8 flags);
-static struct sk_buff *virtnet_skb_append_frag(struct sk_buff *head_skb,
- struct sk_buff *curr_skb,
- struct page *page, void *buf,
- int len, int truesize);
static bool is_xdp_frame(void *ptr)
{
@@ -988,11 +984,6 @@ static void virtnet_rq_unmap_free_buf(struct virtqueue *vq, void *buf)
rq = &vi->rq[i];
- if (rq->xsk_pool) {
- xsk_buff_free((struct xdp_buff *)buf);
- return;
- }
-
if (!vi->big_packets || vi->mergeable_rx_bufs)
virtnet_rq_unmap(rq, buf, 0);
@@ -1161,139 +1152,6 @@ static struct sk_buff *virtnet_receive_xsk_small(struct net_device *dev, struct
}
}
-static void xsk_drop_follow_bufs(struct net_device *dev,
- struct receive_queue *rq,
- u32 num_buf,
- struct virtnet_rq_stats *stats)
-{
- struct xdp_buff *xdp;
- u32 len;
-
- while (num_buf-- > 1) {
- xdp = virtqueue_get_buf(rq->vq, &len);
- if (unlikely(!xdp)) {
- pr_debug("%s: rx error: %d buffers missing\n",
- dev->name, num_buf);
- DEV_STATS_INC(dev, rx_length_errors);
- break;
- }
- u64_stats_add(&stats->bytes, len);
- xsk_buff_free(xdp);
- }
-}
-
-static int xsk_append_merge_buffer(struct virtnet_info *vi,
- struct receive_queue *rq,
- struct sk_buff *head_skb,
- u32 num_buf,
- struct virtio_net_hdr_mrg_rxbuf *hdr,
- struct virtnet_rq_stats *stats)
-{
- struct sk_buff *curr_skb;
- struct xdp_buff *xdp;
- u32 len, truesize;
- struct page *page;
- void *buf;
-
- curr_skb = head_skb;
-
- while (--num_buf) {
- buf = virtqueue_get_buf(rq->vq, &len);
- if (unlikely(!buf)) {
- pr_debug("%s: rx error: %d buffers out of %d missing\n",
- vi->dev->name, num_buf,
- virtio16_to_cpu(vi->vdev,
- hdr->num_buffers));
- DEV_STATS_INC(vi->dev, rx_length_errors);
- return -EINVAL;
- }
-
- u64_stats_add(&stats->bytes, len);
-
- xdp = buf_to_xdp(vi, rq, buf, len);
- if (!xdp)
- goto err;
-
- buf = napi_alloc_frag(len);
- if (!buf) {
- xsk_buff_free(xdp);
- goto err;
- }
-
- memcpy(buf, xdp->data - vi->hdr_len, len);
-
- xsk_buff_free(xdp);
-
- page = virt_to_page(buf);
-
- truesize = len;
-
- curr_skb = virtnet_skb_append_frag(head_skb, curr_skb, page,
- buf, len, truesize);
- if (!curr_skb) {
- put_page(page);
- goto err;
- }
- }
-
- return 0;
-
-err:
- xsk_drop_follow_bufs(vi->dev, rq, num_buf, stats);
- return -EINVAL;
-}
-
-static struct sk_buff *virtnet_receive_xsk_merge(struct net_device *dev, struct virtnet_info *vi,
- struct receive_queue *rq, struct xdp_buff *xdp,
- unsigned int *xdp_xmit,
- struct virtnet_rq_stats *stats)
-{
- struct virtio_net_hdr_mrg_rxbuf *hdr;
- struct bpf_prog *prog;
- struct sk_buff *skb;
- u32 ret, num_buf;
-
- hdr = xdp->data - vi->hdr_len;
- num_buf = virtio16_to_cpu(vi->vdev, hdr->num_buffers);
-
- ret = XDP_PASS;
- rcu_read_lock();
- prog = rcu_dereference(rq->xdp_prog);
- /* TODO: support multi buffer. */
- if (prog && num_buf == 1)
- ret = virtnet_xdp_handler(prog, xdp, dev, xdp_xmit, stats);
- rcu_read_unlock();
-
- switch (ret) {
- case XDP_PASS:
- skb = xsk_construct_skb(rq, xdp);
- if (!skb)
- goto drop_bufs;
-
- if (xsk_append_merge_buffer(vi, rq, skb, num_buf, hdr, stats)) {
- dev_kfree_skb(skb);
- goto drop;
- }
-
- return skb;
-
- case XDP_TX:
- case XDP_REDIRECT:
- return NULL;
-
- default:
- /* drop packet */
- xsk_buff_free(xdp);
- }
-
-drop_bufs:
- xsk_drop_follow_bufs(dev, rq, num_buf, stats);
-
-drop:
- u64_stats_inc(&stats->drops);
- return NULL;
-}
-
static void virtnet_receive_xsk_buf(struct virtnet_info *vi, struct receive_queue *rq,
void *buf, u32 len,
unsigned int *xdp_xmit,
@@ -1323,8 +1181,6 @@ static void virtnet_receive_xsk_buf(struct virtnet_info *vi, struct receive_queu
if (!vi->mergeable_rx_bufs)
skb = virtnet_receive_xsk_small(dev, vi, rq, xdp, xdp_xmit, stats);
- else
- skb = virtnet_receive_xsk_merge(dev, vi, rq, xdp, xdp_xmit, stats);
if (skb)
virtnet_receive_done(vi, rq, skb, flags);
--
MST
next prev parent reply other threads:[~2024-09-06 9:52 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-06 9:52 [RFC PATCH v2 0/7] Revert "virtio_net: rx enable premapped mode by default" Michael S. Tsirkin
2024-09-06 9:52 ` Michael S. Tsirkin [this message]
2024-09-06 9:52 ` [RFC PATCH v2 2/7] Revert "virtio_net: xsk: rx: support recv small mode" Michael S. Tsirkin
2024-09-06 9:52 ` [RFC PATCH v2 3/7] Revert "virtio_net: xsk: rx: support fill with xsk buffer" Michael S. Tsirkin
2024-09-06 9:52 ` [RFC PATCH v2 4/7] Revert "virtio_net: xsk: bind/unbind xsk for rx" Michael S. Tsirkin
2024-09-06 9:52 ` [RFC PATCH v2 5/7] Revert "virtio_net: rx remove premapped failover code" Michael S. Tsirkin
2024-09-06 10:02 ` Xuan Zhuo
2024-09-06 10:12 ` Michael S. Tsirkin
2024-09-06 9:52 ` [RFC PATCH v2 6/7] Revert "virtio_net: big mode skip the unmap check" Michael S. Tsirkin
2024-09-06 9:52 ` [RFC PATCH v2 7/7] Revert "virtio_ring: enable premapped mode whatever use_dma_api" Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51e961cfb4f0a4db7fb4a7dc97cc966af05bf895.1725616135.git.mst@redhat.com \
--to=mst@redhat.com \
--cc=ast@kernel.org \
--cc=boris.ostrovsky@oracle.com \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=darren.kenny@oracle.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eperezma@redhat.com \
--cc=hawk@kernel.org \
--cc=jasowang@redhat.com \
--cc=john.fastabend@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=si-wei.liu@oracle.com \
--cc=virtualization@lists.linux.dev \
--cc=xuanzhuo@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®