Message ID | 20210601064000.66909-1-xuanzhuo@linux.alibaba.com (mailing list archive) |
---|---|
Headers | show |
Series | virtio-net: fix for build_skb() | expand |
On Tue, Jun 01, 2021 at 02:39:58PM +0800, Xuan Zhuo wrote: > #1 Fixed a serious error. > #2 Fixed a logical error, but this error did not cause any serious consequences. > > The logic of this piece is really messy. Fortunately, my refactored patch can be > completed with a small amount of testing. Looks good, thanks! Also needed for stable I think. Acked-by: Michael S. Tsirkin <mst@redhat.com> > Thanks. > > Xuan Zhuo (2): > virtio-net: fix for unable to handle page fault for address > virtio_net: get build_skb() buf by data ptr > > drivers/net/virtio_net.c | 20 ++++++++------------ > 1 file changed, 8 insertions(+), 12 deletions(-) > > -- > 2.31.0
Hello: This series was applied to netdev/net.git (refs/heads/master): On Tue, 1 Jun 2021 14:39:58 +0800 you wrote: > #1 Fixed a serious error. > #2 Fixed a logical error, but this error did not cause any serious consequences. > > The logic of this piece is really messy. Fortunately, my refactored patch can be > completed with a small amount of testing. > > Thanks. > > [...] Here is the summary with links: - [net,v2,1/2] virtio-net: fix for unable to handle page fault for address https://git.kernel.org/netdev/net/c/5c37711d9f27 - [net,v2,2/2] virtio_net: get build_skb() buf by data ptr https://git.kernel.org/netdev/net/c/8fb7da9e9907 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html
On Tue, 1 Jun 2021 07:06:43 -0400 Michael S. Tsirkin wrote: > On Tue, Jun 01, 2021 at 02:39:58PM +0800, Xuan Zhuo wrote: > > #1 Fixed a serious error. > > #2 Fixed a logical error, but this error did not cause any serious consequences. > > > > The logic of this piece is really messy. Fortunately, my refactored patch can be > > completed with a small amount of testing. > > Looks good, thanks! > Also needed for stable I think. > > Acked-by: Michael S. Tsirkin <mst@redhat.com> Just a heads up folks, looks like we ended up merging both this and the net-next version of the patch set: 8fb7da9e9907 virtio_net: get build_skb() buf by data ptr 5c37711d9f27 virtio-net: fix for unable to handle page fault for address and 7bf64460e3b2 virtio-net: get build_skb() buf by data ptr 6c66c147b9a4 virtio-net: fix for unable to handle page fault for address Are you okay with the code as is or should we commit something like: --- diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 56c3f8519093..74482a52f076 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -380,7 +380,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi, struct page *page, unsigned int offset, unsigned int len, unsigned int truesize, bool hdr_valid, unsigned int metasize, - bool whole_page) + unsigned int headroom) { struct sk_buff *skb; struct virtio_net_hdr_mrg_rxbuf *hdr; @@ -398,28 +398,16 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi, else hdr_padded_len = sizeof(struct padded_vnet_hdr); - /* If whole_page, there is an offset between the beginning of the + /* If headroom is not 0, there is an offset between the beginning of the * data and the allocated space, otherwise the data and the allocated * space are aligned. * * Buffers with headroom use PAGE_SIZE as alloc size, see * add_recvbuf_mergeable() + get_mergeable_buf_len() */ - if (whole_page) { - /* Buffers with whole_page use PAGE_SIZE as alloc size, - * see add_recvbuf_mergeable() + get_mergeable_buf_len() - */ - truesize = PAGE_SIZE; - - /* page maybe head page, so we should get the buf by p, not the - * page - */ - tailroom = truesize - len - offset_in_page(p); - buf = (char *)((unsigned long)p & PAGE_MASK); - } else { - tailroom = truesize - len; - buf = p; - } + truesize = headroom ? PAGE_SIZE : truesize; + tailroom = truesize - len - headroom; + buf = p - headroom; len -= hdr_len; offset += hdr_padded_len; @@ -978,7 +966,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, put_page(page); head_skb = page_to_skb(vi, rq, xdp_page, offset, len, PAGE_SIZE, false, - metasize, true); + metasize, + VIRTIO_XDP_HEADROOM); return head_skb; } break; @@ -1029,7 +1018,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, rcu_read_unlock(); head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog, - metasize, !!headroom); + metasize, headroom); curr_skb = head_skb; if (unlikely(!curr_skb))
在 2021/7/30 下午8:16, Jakub Kicinski 写道: > On Tue, 1 Jun 2021 07:06:43 -0400 Michael S. Tsirkin wrote: >> On Tue, Jun 01, 2021 at 02:39:58PM +0800, Xuan Zhuo wrote: >>> #1 Fixed a serious error. >>> #2 Fixed a logical error, but this error did not cause any serious consequences. >>> >>> The logic of this piece is really messy. Fortunately, my refactored patch can be >>> completed with a small amount of testing. >> Looks good, thanks! >> Also needed for stable I think. >> >> Acked-by: Michael S. Tsirkin <mst@redhat.com> > Just a heads up folks, looks like we ended up merging both this and the > net-next version of the patch set: > > 8fb7da9e9907 virtio_net: get build_skb() buf by data ptr > 5c37711d9f27 virtio-net: fix for unable to handle page fault for address > > and > > 7bf64460e3b2 virtio-net: get build_skb() buf by data ptr > 6c66c147b9a4 virtio-net: fix for unable to handle page fault for address > > Are you okay with the code as is or should we commit something like: I think we need commit the following codes since it's more easier to be understood. Thanks > > --- > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 56c3f8519093..74482a52f076 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -380,7 +380,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi, > struct page *page, unsigned int offset, > unsigned int len, unsigned int truesize, > bool hdr_valid, unsigned int metasize, > - bool whole_page) > + unsigned int headroom) > { > struct sk_buff *skb; > struct virtio_net_hdr_mrg_rxbuf *hdr; > @@ -398,28 +398,16 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi, > else > hdr_padded_len = sizeof(struct padded_vnet_hdr); > > - /* If whole_page, there is an offset between the beginning of the > + /* If headroom is not 0, there is an offset between the beginning of the > * data and the allocated space, otherwise the data and the allocated > * space are aligned. > * > * Buffers with headroom use PAGE_SIZE as alloc size, see > * add_recvbuf_mergeable() + get_mergeable_buf_len() > */ > - if (whole_page) { > - /* Buffers with whole_page use PAGE_SIZE as alloc size, > - * see add_recvbuf_mergeable() + get_mergeable_buf_len() > - */ > - truesize = PAGE_SIZE; > - > - /* page maybe head page, so we should get the buf by p, not the > - * page > - */ > - tailroom = truesize - len - offset_in_page(p); > - buf = (char *)((unsigned long)p & PAGE_MASK); > - } else { > - tailroom = truesize - len; > - buf = p; > - } > + truesize = headroom ? PAGE_SIZE : truesize; > + tailroom = truesize - len - headroom; > + buf = p - headroom; > > len -= hdr_len; > offset += hdr_padded_len; > @@ -978,7 +966,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > put_page(page); > head_skb = page_to_skb(vi, rq, xdp_page, offset, > len, PAGE_SIZE, false, > - metasize, true); > + metasize, > + VIRTIO_XDP_HEADROOM); > return head_skb; > } > break; > @@ -1029,7 +1018,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > rcu_read_unlock(); > > head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog, > - metasize, !!headroom); > + metasize, headroom); > curr_skb = head_skb; > > if (unlikely(!curr_skb)) >
On Fri, Jul 30, 2021 at 05:16:43AM -0700, Jakub Kicinski wrote: > On Tue, 1 Jun 2021 07:06:43 -0400 Michael S. Tsirkin wrote: > > On Tue, Jun 01, 2021 at 02:39:58PM +0800, Xuan Zhuo wrote: > > > #1 Fixed a serious error. > > > #2 Fixed a logical error, but this error did not cause any serious consequences. > > > > > > The logic of this piece is really messy. Fortunately, my refactored patch can be > > > completed with a small amount of testing. > > > > Looks good, thanks! > > Also needed for stable I think. > > > > Acked-by: Michael S. Tsirkin <mst@redhat.com> > > Just a heads up folks, looks like we ended up merging both this and the > net-next version of the patch set: > > 8fb7da9e9907 virtio_net: get build_skb() buf by data ptr > 5c37711d9f27 virtio-net: fix for unable to handle page fault for address > > and > > 7bf64460e3b2 virtio-net: get build_skb() buf by data ptr > 6c66c147b9a4 virtio-net: fix for unable to handle page fault for address > > Are you okay with the code as is or should we commit something like: Yes: Acked-by: Michael S. Tsirkin <mst@redhat.com> Will you post this one then? > --- > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 56c3f8519093..74482a52f076 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -380,7 +380,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi, > struct page *page, unsigned int offset, > unsigned int len, unsigned int truesize, > bool hdr_valid, unsigned int metasize, > - bool whole_page) > + unsigned int headroom) > { > struct sk_buff *skb; > struct virtio_net_hdr_mrg_rxbuf *hdr; > @@ -398,28 +398,16 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi, > else > hdr_padded_len = sizeof(struct padded_vnet_hdr); > > - /* If whole_page, there is an offset between the beginning of the > + /* If headroom is not 0, there is an offset between the beginning of the > * data and the allocated space, otherwise the data and the allocated > * space are aligned. > * > * Buffers with headroom use PAGE_SIZE as alloc size, see > * add_recvbuf_mergeable() + get_mergeable_buf_len() > */ > - if (whole_page) { > - /* Buffers with whole_page use PAGE_SIZE as alloc size, > - * see add_recvbuf_mergeable() + get_mergeable_buf_len() > - */ > - truesize = PAGE_SIZE; > - > - /* page maybe head page, so we should get the buf by p, not the > - * page > - */ > - tailroom = truesize - len - offset_in_page(p); > - buf = (char *)((unsigned long)p & PAGE_MASK); > - } else { > - tailroom = truesize - len; > - buf = p; > - } > + truesize = headroom ? PAGE_SIZE : truesize; > + tailroom = truesize - len - headroom; > + buf = p - headroom; > > len -= hdr_len; > offset += hdr_padded_len; > @@ -978,7 +966,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > put_page(page); > head_skb = page_to_skb(vi, rq, xdp_page, offset, > len, PAGE_SIZE, false, > - metasize, true); > + metasize, > + VIRTIO_XDP_HEADROOM); > return head_skb; > } > break; > @@ -1029,7 +1018,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > rcu_read_unlock(); > > head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog, > - metasize, !!headroom); > + metasize, headroom); > curr_skb = head_skb; > > if (unlikely(!curr_skb))