lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <51e961cfb4f0a4db7fb4a7dc97cc966af05bf895.1725616135.git.mst@redhat.com> Date: Fri, 6 Sep 2024 05:52:16 -0400 From: "Michael S. Tsirkin" <mst@...hat.com> To: linux-kernel@...r.kernel.org, netdev@...r.kernel.org Cc: Xuan Zhuo <xuanzhuo@...ux.alibaba.com>, Jason Wang <jasowang@...hat.com>, "David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>, Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>, virtualization@...ts.linux.dev, Si-Wei Liu <si-wei.liu@...cle.com>, Darren Kenny <darren.kenny@...cle.com>, Boris Ostrovsky <boris.ostrovsky@...cle.com>, Eugenio PĂ©rez <eperezma@...hat.com>, Alexei Starovoitov <ast@...nel.org>, Daniel Borkmann <daniel@...earbox.net>, Jesper Dangaard Brouer <hawk@...nel.org>, John Fastabend <john.fastabend@...il.com>, bpf@...r.kernel.org Subject: [RFC PATCH v2 1/7] Revert "virtio_net: xsk: rx: support recv merge mode" This reverts commit 99c861b44eb1fb9dfe8776854116a6a9064c19bb. leads to crashes with no ACCESS_PLATFORM when sysctl net.core.high_order_alloc_disable=1 Cc: Xuan Zhuo <xuanzhuo@...ux.alibaba.com> Reported-by: Si-Wei Liu <si-wei.liu@...cle.com> Signed-off-by: Michael S. Tsirkin <mst@...hat.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
Powered by blists - more mailing lists