Message ID | 20240327111430.108787-10-xuanzhuo@linux.alibaba.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | virtio: drivers maintain dma info for premapped vq | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
On Wed, Mar 27, 2024 at 7:14 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > Now, the virtio core can set the premapped mode by find_vqs(). > If the premapped can be enabled, the dma array will not be > allocated. So virtio-net use the api of find_vqs to enable the > premapped. > > Judge the premapped mode by the vq->premapped instead of saving > local variable. > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > --- I wonder what's the reason to keep a fallback when premapped is not enabled? Thanks
On Thu, 28 Mar 2024 16:05:02 +0800, Jason Wang <jasowang@redhat.com> wrote: > On Wed, Mar 27, 2024 at 7:14 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > Now, the virtio core can set the premapped mode by find_vqs(). > > If the premapped can be enabled, the dma array will not be > > allocated. So virtio-net use the api of find_vqs to enable the > > premapped. > > > > Judge the premapped mode by the vq->premapped instead of saving > > local variable. > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > --- > > I wonder what's the reason to keep a fallback when premapped is not enabled? Rethink this. I think you are right. We can remove the fallback. Because we have the virtio dma apis that wrap all the cases. So I will remove the fallback from the virtio-net in next version. But we still need to export the premapped to the drivers. Because we can enable the AF_XDP only when premapped is true. Thanks > > Thanks >
On Thu, Mar 28, 2024 at 4:27 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > On Thu, 28 Mar 2024 16:05:02 +0800, Jason Wang <jasowang@redhat.com> wrote: > > On Wed, Mar 27, 2024 at 7:14 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > Now, the virtio core can set the premapped mode by find_vqs(). > > > If the premapped can be enabled, the dma array will not be > > > allocated. So virtio-net use the api of find_vqs to enable the > > > premapped. > > > > > > Judge the premapped mode by the vq->premapped instead of saving > > > local variable. > > > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > > --- > > > > I wonder what's the reason to keep a fallback when premapped is not enabled? > > Rethink this. > > I think you are right. We can remove the fallback. > > Because we have the virtio dma apis that wrap all the cases. > So I will remove the fallback from the virtio-net in next version. Ok. > > But we still need to export the premapped to the drivers. > Because we can enable the AF_XDP only when premapped is true. I may miss something but it should work like enable AF_XDP -> enable remapping So can we fail during remapping enablement? THanks > > Thanks > > > > > > Thanks > > >
On Fri, 29 Mar 2024 11:20:08 +0800, Jason Wang <jasowang@redhat.com> wrote: > On Thu, Mar 28, 2024 at 4:27 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > On Thu, 28 Mar 2024 16:05:02 +0800, Jason Wang <jasowang@redhat.com> wrote: > > > On Wed, Mar 27, 2024 at 7:14 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > > > Now, the virtio core can set the premapped mode by find_vqs(). > > > > If the premapped can be enabled, the dma array will not be > > > > allocated. So virtio-net use the api of find_vqs to enable the > > > > premapped. > > > > > > > > Judge the premapped mode by the vq->premapped instead of saving > > > > local variable. > > > > > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > > > --- > > > > > > I wonder what's the reason to keep a fallback when premapped is not enabled? > > > > Rethink this. > > > > I think you are right. We can remove the fallback. > > > > Because we have the virtio dma apis that wrap all the cases. > > So I will remove the fallback from the virtio-net in next version. > > Ok. > > > > > But we still need to export the premapped to the drivers. > > Because we can enable the AF_XDP only when premapped is true. > > I may miss something but it should work like > > enable AF_XDP -> enable remapping > > So can we fail during remapping enablement? YES. Enabling the premapped mode may fail, then we must stop to enable AF_XDP. AF-XDP requires that we export the dma dev to the af-xdp. We can do that only when the virtio core works with use_dma_api. Other other side, if we support the page-pool in future, we may have the same requirement. Thanks. > > THanks > > > > > Thanks > > > > > > > > > > Thanks > > > > > >
On Mon, 1 Apr 2024 09:40:07 +0800, Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > On Fri, 29 Mar 2024 11:20:08 +0800, Jason Wang <jasowang@redhat.com> wrote: > > On Thu, Mar 28, 2024 at 4:27 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > On Thu, 28 Mar 2024 16:05:02 +0800, Jason Wang <jasowang@redhat.com> wrote: > > > > On Wed, Mar 27, 2024 at 7:14 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > > > > > Now, the virtio core can set the premapped mode by find_vqs(). > > > > > If the premapped can be enabled, the dma array will not be > > > > > allocated. So virtio-net use the api of find_vqs to enable the > > > > > premapped. > > > > > > > > > > Judge the premapped mode by the vq->premapped instead of saving > > > > > local variable. > > > > > > > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > > > > --- > > > > > > > > I wonder what's the reason to keep a fallback when premapped is not enabled? > > > > > > Rethink this. > > > > > > I think you are right. We can remove the fallback. > > > > > > Because we have the virtio dma apis that wrap all the cases. > > > So I will remove the fallback from the virtio-net in next version. > > > > Ok. > > > > > > > > But we still need to export the premapped to the drivers. > > > Because we can enable the AF_XDP only when premapped is true. > > > > I may miss something but it should work like > > > > enable AF_XDP -> enable remapping > > > > So can we fail during remapping enablement? > > > YES. > > Enabling the premapped mode may fail, then we must stop to enable AF_XDP. > > AF-XDP requires that we export the dma dev to the af-xdp. > We can do that only when the virtio core works with use_dma_api. > Other other side, if we support the page-pool in future, we may have the > same requirement. Rethink this. Enable premapped MUST NOT fail. No care the use_dma_api is true or not, because we have the DMA APIs for virtio. Then the virtio-net rx will work with premapped (I will make the big mode work with premapped mode) AF_XDP checks the virtqueue_dma_dev() when enabling. But disabling premapped mode may fail, because that virtio ring need to allocate memory for dma. Thanks. > > > Thanks. > > > > > > THanks > > > > > > > > Thanks > > > > > > > > > > > > > > Thanks > > > > > > > > > >
On Mon, Apr 1, 2024 at 11:10 AM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > On Mon, 1 Apr 2024 09:40:07 +0800, Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > On Fri, 29 Mar 2024 11:20:08 +0800, Jason Wang <jasowang@redhat.com> wrote: > > > On Thu, Mar 28, 2024 at 4:27 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > > > On Thu, 28 Mar 2024 16:05:02 +0800, Jason Wang <jasowang@redhat.com> wrote: > > > > > On Wed, Mar 27, 2024 at 7:14 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > > > > > > > Now, the virtio core can set the premapped mode by find_vqs(). > > > > > > If the premapped can be enabled, the dma array will not be > > > > > > allocated. So virtio-net use the api of find_vqs to enable the > > > > > > premapped. > > > > > > > > > > > > Judge the premapped mode by the vq->premapped instead of saving > > > > > > local variable. > > > > > > > > > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > > > > > --- > > > > > > > > > > I wonder what's the reason to keep a fallback when premapped is not enabled? > > > > > > > > Rethink this. > > > > > > > > I think you are right. We can remove the fallback. > > > > > > > > Because we have the virtio dma apis that wrap all the cases. > > > > So I will remove the fallback from the virtio-net in next version. > > > > > > Ok. > > > > > > > > > > > But we still need to export the premapped to the drivers. > > > > Because we can enable the AF_XDP only when premapped is true. > > > > > > I may miss something but it should work like > > > > > > enable AF_XDP -> enable remapping > > > > > > So can we fail during remapping enablement? > > > > > > YES. > > > > Enabling the premapped mode may fail, then we must stop to enable AF_XDP. > > > > AF-XDP requires that we export the dma dev to the af-xdp. > > We can do that only when the virtio core works with use_dma_api. > > Other other side, if we support the page-pool in future, we may have the > > same requirement. > > Rethink this. > > Enable premapped MUST NOT fail. No care the use_dma_api is true or not, because > we have the DMA APIs for virtio. Then the virtio-net rx will work with > premapped (I will make the big mode work with premapped mode) Just to make sure we're at the same page. Rx will always work in the mode or pre mapping. So we can easily fail the probe if we fail to enable RX premapping? > > AF_XDP checks the virtqueue_dma_dev() when enabling. > > But disabling premapped mode may fail, because that virtio ring need to > allocate memory for dma. That's kind of too tricky, what if we just allocate the memory for dma unconditionally? Thanks > > Thanks. > > > > > > > > > Thanks. > > > > > > > > > > THanks > > > > > > > > > > > Thanks > > > > > > > > > > > > > > > > > > Thanks > > > > > > > > > > > > > > >
On Sun, 7 Apr 2024 12:24:00 +0800, Jason Wang <jasowang@redhat.com> wrote: > On Mon, Apr 1, 2024 at 11:10 AM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > On Mon, 1 Apr 2024 09:40:07 +0800, Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > On Fri, 29 Mar 2024 11:20:08 +0800, Jason Wang <jasowang@redhat.com> wrote: > > > > On Thu, Mar 28, 2024 at 4:27 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > > > > > On Thu, 28 Mar 2024 16:05:02 +0800, Jason Wang <jasowang@redhat.com> wrote: > > > > > > On Wed, Mar 27, 2024 at 7:14 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > > > > > > > > > Now, the virtio core can set the premapped mode by find_vqs(). > > > > > > > If the premapped can be enabled, the dma array will not be > > > > > > > allocated. So virtio-net use the api of find_vqs to enable the > > > > > > > premapped. > > > > > > > > > > > > > > Judge the premapped mode by the vq->premapped instead of saving > > > > > > > local variable. > > > > > > > > > > > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > > > > > > --- > > > > > > > > > > > > I wonder what's the reason to keep a fallback when premapped is not enabled? > > > > > > > > > > Rethink this. > > > > > > > > > > I think you are right. We can remove the fallback. > > > > > > > > > > Because we have the virtio dma apis that wrap all the cases. > > > > > So I will remove the fallback from the virtio-net in next version. > > > > > > > > Ok. > > > > > > > > > > > > > > But we still need to export the premapped to the drivers. > > > > > Because we can enable the AF_XDP only when premapped is true. > > > > > > > > I may miss something but it should work like > > > > > > > > enable AF_XDP -> enable remapping > > > > > > > > So can we fail during remapping enablement? > > > > > > > > > YES. > > > > > > Enabling the premapped mode may fail, then we must stop to enable AF_XDP. > > > > > > AF-XDP requires that we export the dma dev to the af-xdp. > > > We can do that only when the virtio core works with use_dma_api. > > > Other other side, if we support the page-pool in future, we may have the > > > same requirement. > > > > Rethink this. > > > > Enable premapped MUST NOT fail. No care the use_dma_api is true or not, because > > we have the DMA APIs for virtio. Then the virtio-net rx will work with > > premapped (I will make the big mode work with premapped mode) > > Just to make sure we're at the same page. Rx will always work in the > mode or pre mapping. So we can easily fail the probe if we fail to > enable RX premapping? NO, enabling premapped mode can not fail. So the rx will always work in the premapping mode. > > > > > AF_XDP checks the virtqueue_dma_dev() when enabling. > > > > But disabling premapped mode may fail, because that virtio ring need to > > allocate memory for dma. > > That's kind of too tricky, what if we just allocate the memory for dma > unconditionally? It's ok, but we waste the memory. Thanks. > > Thanks > > > > > Thanks. > > > > > > > > > > > > > > > Thanks. > > > > > > > > > > > > > > THanks > > > > > > > > > > > > > > Thanks > > > > > > > > > > > > > > > > > > > > > > Thanks > > > > > > > > > > > > > > > > > > > > >
On Sun, Apr 7, 2024 at 2:03 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > On Sun, 7 Apr 2024 12:24:00 +0800, Jason Wang <jasowang@redhat.com> wrote: > > On Mon, Apr 1, 2024 at 11:10 AM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > On Mon, 1 Apr 2024 09:40:07 +0800, Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > On Fri, 29 Mar 2024 11:20:08 +0800, Jason Wang <jasowang@redhat.com> wrote: > > > > > On Thu, Mar 28, 2024 at 4:27 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > > > > > > > On Thu, 28 Mar 2024 16:05:02 +0800, Jason Wang <jasowang@redhat.com> wrote: > > > > > > > On Wed, Mar 27, 2024 at 7:14 PM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > > > > > > > > > > > > > Now, the virtio core can set the premapped mode by find_vqs(). > > > > > > > > If the premapped can be enabled, the dma array will not be > > > > > > > > allocated. So virtio-net use the api of find_vqs to enable the > > > > > > > > premapped. > > > > > > > > > > > > > > > > Judge the premapped mode by the vq->premapped instead of saving > > > > > > > > local variable. > > > > > > > > > > > > > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > > > > > > > --- > > > > > > > > > > > > > > I wonder what's the reason to keep a fallback when premapped is not enabled? > > > > > > > > > > > > Rethink this. > > > > > > > > > > > > I think you are right. We can remove the fallback. > > > > > > > > > > > > Because we have the virtio dma apis that wrap all the cases. > > > > > > So I will remove the fallback from the virtio-net in next version. > > > > > > > > > > Ok. > > > > > > > > > > > > > > > > > But we still need to export the premapped to the drivers. > > > > > > Because we can enable the AF_XDP only when premapped is true. > > > > > > > > > > I may miss something but it should work like > > > > > > > > > > enable AF_XDP -> enable remapping > > > > > > > > > > So can we fail during remapping enablement? > > > > > > > > > > > > YES. > > > > > > > > Enabling the premapped mode may fail, then we must stop to enable AF_XDP. > > > > > > > > AF-XDP requires that we export the dma dev to the af-xdp. > > > > We can do that only when the virtio core works with use_dma_api. > > > > Other other side, if we support the page-pool in future, we may have the > > > > same requirement. > > > > > > Rethink this. > > > > > > Enable premapped MUST NOT fail. No care the use_dma_api is true or not, because > > > we have the DMA APIs for virtio. Then the virtio-net rx will work with > > > premapped (I will make the big mode work with premapped mode) > > > > Just to make sure we're at the same page. Rx will always work in the > > mode or pre mapping. So we can easily fail the probe if we fail to > > enable RX premapping? > > > NO, enabling premapped mode can not fail. So the rx will always work > in the premapping mode. Ok, kind of my understanding. > > > > > > > > > > AF_XDP checks the virtqueue_dma_dev() when enabling. > > > > > > But disabling premapped mode may fail, because that virtio ring need to > > > allocate memory for dma. > > > > That's kind of too tricky, what if we just allocate the memory for dma > > unconditionally? > > It's ok, but we waste the memory. Probably, but the point is to reduce the complexity of the codes for symmetry: We don't need to have and maintain codes for fallback mode when we fail to disable premapping. Thanks > > Thanks. > > > > > > > Thanks > > > > > > > > Thanks. > > > > > > > > > > > > > > > > > > > > > Thanks. > > > > > > > > > > > > > > > > > > THanks > > > > > > > > > > > > > > > > > Thanks > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks > > > > > > > > > > > > > > > > > > > > > > > > > > > >
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index c22d1118a133..107aef2c9458 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -213,9 +213,6 @@ struct receive_queue { /* Record the last dma info to free after new pages is allocated. */ struct virtnet_rq_dma *last_dma; - - /* Do dma by self */ - bool do_dma; }; /* This structure can contain rss message with maximum settings for indirection table and keysize @@ -707,7 +704,7 @@ static void *virtnet_rq_get_buf(struct receive_queue *rq, u32 *len, void **ctx) void *buf; buf = virtqueue_get_buf_ctx(rq->vq, len, ctx); - if (buf && rq->do_dma) + if (buf && rq->vq->premapped) virtnet_rq_unmap(rq, buf, *len); return buf; @@ -720,7 +717,7 @@ static void virtnet_rq_init_one_sg(struct receive_queue *rq, void *buf, u32 len) u32 offset; void *head; - if (!rq->do_dma) { + if (!rq->vq->premapped) { sg_init_one(rq->sg, buf, len); return; } @@ -750,7 +747,7 @@ static void *virtnet_rq_alloc(struct receive_queue *rq, u32 size, gfp_t gfp) head = page_address(alloc_frag->page); - if (rq->do_dma) { + if (rq->vq->premapped) { dma = head; /* new pages */ @@ -796,22 +793,6 @@ static void *virtnet_rq_alloc(struct receive_queue *rq, u32 size, gfp_t gfp) return buf; } -static void virtnet_rq_set_premapped(struct virtnet_info *vi) -{ - int i; - - /* disable for big mode */ - if (!vi->mergeable_rx_bufs && vi->big_packets) - return; - - for (i = 0; i < vi->max_queue_pairs; i++) { - if (virtqueue_set_dma_premapped(vi->rq[i].vq)) - continue; - - vi->rq[i].do_dma = true; - } -} - static void virtnet_rq_unmap_free_buf(struct virtqueue *vq, void *buf) { struct virtnet_info *vi = vq->vdev->priv; @@ -820,7 +801,7 @@ static void virtnet_rq_unmap_free_buf(struct virtqueue *vq, void *buf) rq = &vi->rq[i]; - if (rq->do_dma) + if (rq->vq->premapped) virtnet_rq_unmap(rq, buf, 0); virtnet_rq_free_buf(vi, rq, buf); @@ -1881,7 +1862,7 @@ static int add_recvbuf_small(struct virtnet_info *vi, struct receive_queue *rq, err = virtqueue_add_inbuf_ctx(rq->vq, rq->sg, 1, buf, ctx, gfp); if (err < 0) { - if (rq->do_dma) + if (rq->vq->premapped) virtnet_rq_unmap(rq, buf, 0); put_page(virt_to_head_page(buf)); } @@ -1996,7 +1977,7 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi, ctx = mergeable_len_to_ctx(len + room, headroom); err = virtqueue_add_inbuf_ctx(rq->vq, rq->sg, 1, buf, ctx, gfp); if (err < 0) { - if (rq->do_dma) + if (rq->vq->premapped) virtnet_rq_unmap(rq, buf, 0); put_page(virt_to_head_page(buf)); } @@ -4271,7 +4252,7 @@ static void free_receive_page_frags(struct virtnet_info *vi) int i; for (i = 0; i < vi->max_queue_pairs; i++) if (vi->rq[i].alloc_frag.page) { - if (vi->rq[i].do_dma && vi->rq[i].last_dma) + if (vi->rq[i].vq->premapped && vi->rq[i].last_dma) virtnet_rq_unmap(&vi->rq[i], vi->rq[i].last_dma, 0); put_page(vi->rq[i].alloc_frag.page); } @@ -4335,11 +4316,13 @@ static unsigned int mergeable_min_buf_len(struct virtnet_info *vi, struct virtqu static int virtnet_find_vqs(struct virtnet_info *vi) { + struct virtio_vq_config cfg = {}; vq_callback_t **callbacks; struct virtqueue **vqs; const char **names; int ret = -ENOMEM; int total_vqs; + bool *premapped; bool *ctx; u16 i; @@ -4364,8 +4347,13 @@ static int virtnet_find_vqs(struct virtnet_info *vi) ctx = kcalloc(total_vqs, sizeof(*ctx), GFP_KERNEL); if (!ctx) goto err_ctx; + + premapped = kcalloc(total_vqs, sizeof(*premapped), GFP_KERNEL); + if (!ctx) + goto err_premapped; } else { ctx = NULL; + premapped = NULL; } /* Parameters for control virtqueue, if any */ @@ -4384,10 +4372,19 @@ static int virtnet_find_vqs(struct virtnet_info *vi) names[txq2vq(i)] = vi->sq[i].name; if (ctx) ctx[rxq2vq(i)] = true; + + if (premapped) + premapped[rxq2vq(i)] = true; } - ret = virtio_find_vqs_ctx(vi->vdev, total_vqs, vqs, callbacks, - names, ctx, NULL); + cfg.nvqs = total_vqs; + cfg.vqs = vqs; + cfg.callbacks = callbacks; + cfg.names = names; + cfg.ctx = ctx; + cfg.premapped = premapped; + + ret = virtio_find_vqs_cfg(vi->vdev, &cfg); if (ret) goto err_find; @@ -4407,6 +4404,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi) err_find: + kfree(premapped); +err_premapped: kfree(ctx); err_ctx: kfree(names); @@ -4479,8 +4478,6 @@ static int init_vqs(struct virtnet_info *vi) if (ret) goto err_free; - virtnet_rq_set_premapped(vi); - cpus_read_lock(); virtnet_set_affinity(vi); cpus_read_unlock(); diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index 80b7974ca9ff..dc7f4067a171 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h @@ -267,21 +267,9 @@ int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs, } static inline -int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs, - struct virtqueue *vqs[], vq_callback_t *callbacks[], - const char *names[], const bool *ctx, - struct irq_affinity *desc) +int virtio_find_vqs_cfg(struct virtio_device *vdev, struct virtio_vq_config *cfg) { - struct virtio_vq_config cfg = {}; - - cfg.nvqs = nvqs; - cfg.vqs = vqs; - cfg.callbacks = callbacks; - cfg.names = names; - cfg.ctx = ctx; - cfg.desc = desc; - - return vdev->config->find_vqs(vdev, &cfg); + return vdev->config->find_vqs(vdev, cfg); } /**
Now, the virtio core can set the premapped mode by find_vqs(). If the premapped can be enabled, the dma array will not be allocated. So virtio-net use the api of find_vqs to enable the premapped. Judge the premapped mode by the vq->premapped instead of saving local variable. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- drivers/net/virtio_net.c | 57 +++++++++++++++++------------------ include/linux/virtio_config.h | 16 ++-------- 2 files changed, 29 insertions(+), 44 deletions(-)