From: Andy Lutomirski <luto@kernel.org> To: linux-kernel@vger.kernel.org, "David S. Miller" <davem@davemloft.net>, sparclinux@vger.kernel.org Cc: Joerg Roedel <jroedel@suse.de>, Christian Borntraeger <borntraeger@de.ibm.com>, Cornelia Huck <cornelia.huck@de.ibm.com>, Sebastian Ott <sebott@linux.vnet.ibm.com>, Paolo Bonzini <pbonzini@redhat.com>, Christoph Hellwig <hch@lst.de>, benh@kernel.crashing.org, KVM <kvm@vger.kernel.org>, dwmw2@infradead.org, Martin Schwidefsky <schwidefsky@de.ibm.com>, linux-s390 <linux-s390@vger.kernel.org>, "Michael S. Tsirkin" <mst@redhat.com>, virtualization@lists.linux-foundation.org, Andy Lutomirski <luto@kernel.org> Subject: [PATCH v4 1/6] virtio-net: Stop doing DMA from the stack Date: Thu, 29 Oct 2015 18:09:46 -0700 [thread overview] Message-ID: <8d6b1fc3b5d3b6f5e8b212ef690691a52fbefaff.1446162273.git.luto@kernel.org> (raw) In-Reply-To: <cover.1446162273.git.luto@kernel.org> In-Reply-To: <cover.1446162273.git.luto@kernel.org> From: "Michael S. Tsirkin" <mst@redhat.com> Once virtio starts using the DMA API, we won't be able to safely DMA from the stack. virtio-net does a couple of config DMA requests from small stack buffers -- switch to using dynamically-allocated memory. This should have no effect on any performance-critical code paths. [I wrote the subject and commit message. mst wrote the code. --luto] Signed-off-by: Andy Lutomirski <luto@kernel.org> signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- drivers/net/virtio_net.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index d8838dedb7a4..f94ab786088f 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -140,6 +140,12 @@ struct virtnet_info { /* CPU hot plug notifier */ struct notifier_block nb; + + /* Control VQ buffers: protected by the rtnl lock */ + struct virtio_net_ctrl_hdr ctrl_hdr; + virtio_net_ctrl_ack ctrl_status; + u8 ctrl_promisc; + u8 ctrl_allmulti; }; struct padded_vnet_hdr { @@ -976,31 +982,30 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, struct scatterlist *out) { struct scatterlist *sgs[4], hdr, stat; - struct virtio_net_ctrl_hdr ctrl; - virtio_net_ctrl_ack status = ~0; unsigned out_num = 0, tmp; /* Caller should know better */ BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)); - ctrl.class = class; - ctrl.cmd = cmd; + vi->ctrl_status = ~0; + vi->ctrl_hdr.class = class; + vi->ctrl_hdr.cmd = cmd; /* Add header */ - sg_init_one(&hdr, &ctrl, sizeof(ctrl)); + sg_init_one(&hdr, &vi->ctrl_hdr, sizeof(vi->ctrl_hdr)); sgs[out_num++] = &hdr; if (out) sgs[out_num++] = out; /* Add return status. */ - sg_init_one(&stat, &status, sizeof(status)); + sg_init_one(&stat, &vi->ctrl_status, sizeof(vi->ctrl_status)); sgs[out_num] = &stat; BUG_ON(out_num + 1 > ARRAY_SIZE(sgs)); virtqueue_add_sgs(vi->cvq, sgs, out_num, 1, vi, GFP_ATOMIC); if (unlikely(!virtqueue_kick(vi->cvq))) - return status == VIRTIO_NET_OK; + return vi->ctrl_status == VIRTIO_NET_OK; /* Spin for a response, the kick causes an ioport write, trapping * into the hypervisor, so the request should be handled immediately. @@ -1009,7 +1014,7 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, !virtqueue_is_broken(vi->cvq)) cpu_relax(); - return status == VIRTIO_NET_OK; + return vi->ctrl_status == VIRTIO_NET_OK; } static int virtnet_set_mac_address(struct net_device *dev, void *p) @@ -1151,7 +1156,6 @@ static void virtnet_set_rx_mode(struct net_device *dev) { struct virtnet_info *vi = netdev_priv(dev); struct scatterlist sg[2]; - u8 promisc, allmulti; struct virtio_net_ctrl_mac *mac_data; struct netdev_hw_addr *ha; int uc_count; @@ -1163,22 +1167,22 @@ static void virtnet_set_rx_mode(struct net_device *dev) if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_RX)) return; - promisc = ((dev->flags & IFF_PROMISC) != 0); - allmulti = ((dev->flags & IFF_ALLMULTI) != 0); + vi->ctrl_promisc = ((dev->flags & IFF_PROMISC) != 0); + vi->ctrl_allmulti = ((dev->flags & IFF_ALLMULTI) != 0); - sg_init_one(sg, &promisc, sizeof(promisc)); + sg_init_one(sg, &vi->ctrl_promisc, sizeof(vi->ctrl_promisc)); if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX, VIRTIO_NET_CTRL_RX_PROMISC, sg)) dev_warn(&dev->dev, "Failed to %sable promisc mode.\n", - promisc ? "en" : "dis"); + vi->ctrl_promisc ? "en" : "dis"); - sg_init_one(sg, &allmulti, sizeof(allmulti)); + sg_init_one(sg, &vi->ctrl_allmulti, sizeof(vi->ctrl_allmulti)); if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX, VIRTIO_NET_CTRL_RX_ALLMULTI, sg)) dev_warn(&dev->dev, "Failed to %sable allmulti mode.\n", - allmulti ? "en" : "dis"); + vi->ctrl_allmulti ? "en" : "dis"); uc_count = netdev_uc_count(dev); mc_count = netdev_mc_count(dev); -- 2.4.3
WARNING: multiple messages have this Message-ID (diff)
From: Andy Lutomirski <luto@kernel.org> To: linux-kernel@vger.kernel.org, "David S. Miller" <davem@davemloft.net>, sparclinux@vger.kernel.org Cc: Joerg Roedel <jroedel@suse.de>, Christian Borntraeger <borntraeger@de.ibm.com>, Cornelia Huck <cornelia.huck@de.ibm.com>, Sebastian Ott <sebott@linux.vnet.ibm.com>, Paolo Bonzini <pbonzini@redhat.com>, Christoph Hellwig <hch@lst.de>, benh@kernel.crashing.org, KVM <kvm@vger.kernel.org>, dwmw2@infradead.org, Martin Schwidefsky <schwidefsky@de.ibm.com>, linux-s390 <linux-s390@vger.kernel.org>, "Michael S. Tsirkin" <mst@redhat.com>, virtualization@lists.linux-foundation.org, Andy Lutomirski <luto@kernel.org> Subject: [PATCH v4 1/6] virtio-net: Stop doing DMA from the stack Date: Fri, 30 Oct 2015 01:09:46 +0000 [thread overview] Message-ID: <8d6b1fc3b5d3b6f5e8b212ef690691a52fbefaff.1446162273.git.luto@kernel.org> (raw) In-Reply-To: <cover.1446162273.git.luto@kernel.org> From: "Michael S. Tsirkin" <mst@redhat.com> Once virtio starts using the DMA API, we won't be able to safely DMA from the stack. virtio-net does a couple of config DMA requests from small stack buffers -- switch to using dynamically-allocated memory. This should have no effect on any performance-critical code paths. [I wrote the subject and commit message. mst wrote the code. --luto] Signed-off-by: Andy Lutomirski <luto@kernel.org> signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- drivers/net/virtio_net.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index d8838dedb7a4..f94ab786088f 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -140,6 +140,12 @@ struct virtnet_info { /* CPU hot plug notifier */ struct notifier_block nb; + + /* Control VQ buffers: protected by the rtnl lock */ + struct virtio_net_ctrl_hdr ctrl_hdr; + virtio_net_ctrl_ack ctrl_status; + u8 ctrl_promisc; + u8 ctrl_allmulti; }; struct padded_vnet_hdr { @@ -976,31 +982,30 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, struct scatterlist *out) { struct scatterlist *sgs[4], hdr, stat; - struct virtio_net_ctrl_hdr ctrl; - virtio_net_ctrl_ack status = ~0; unsigned out_num = 0, tmp; /* Caller should know better */ BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)); - ctrl.class = class; - ctrl.cmd = cmd; + vi->ctrl_status = ~0; + vi->ctrl_hdr.class = class; + vi->ctrl_hdr.cmd = cmd; /* Add header */ - sg_init_one(&hdr, &ctrl, sizeof(ctrl)); + sg_init_one(&hdr, &vi->ctrl_hdr, sizeof(vi->ctrl_hdr)); sgs[out_num++] = &hdr; if (out) sgs[out_num++] = out; /* Add return status. */ - sg_init_one(&stat, &status, sizeof(status)); + sg_init_one(&stat, &vi->ctrl_status, sizeof(vi->ctrl_status)); sgs[out_num] = &stat; BUG_ON(out_num + 1 > ARRAY_SIZE(sgs)); virtqueue_add_sgs(vi->cvq, sgs, out_num, 1, vi, GFP_ATOMIC); if (unlikely(!virtqueue_kick(vi->cvq))) - return status = VIRTIO_NET_OK; + return vi->ctrl_status = VIRTIO_NET_OK; /* Spin for a response, the kick causes an ioport write, trapping * into the hypervisor, so the request should be handled immediately. @@ -1009,7 +1014,7 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, !virtqueue_is_broken(vi->cvq)) cpu_relax(); - return status = VIRTIO_NET_OK; + return vi->ctrl_status = VIRTIO_NET_OK; } static int virtnet_set_mac_address(struct net_device *dev, void *p) @@ -1151,7 +1156,6 @@ static void virtnet_set_rx_mode(struct net_device *dev) { struct virtnet_info *vi = netdev_priv(dev); struct scatterlist sg[2]; - u8 promisc, allmulti; struct virtio_net_ctrl_mac *mac_data; struct netdev_hw_addr *ha; int uc_count; @@ -1163,22 +1167,22 @@ static void virtnet_set_rx_mode(struct net_device *dev) if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_RX)) return; - promisc = ((dev->flags & IFF_PROMISC) != 0); - allmulti = ((dev->flags & IFF_ALLMULTI) != 0); + vi->ctrl_promisc = ((dev->flags & IFF_PROMISC) != 0); + vi->ctrl_allmulti = ((dev->flags & IFF_ALLMULTI) != 0); - sg_init_one(sg, &promisc, sizeof(promisc)); + sg_init_one(sg, &vi->ctrl_promisc, sizeof(vi->ctrl_promisc)); if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX, VIRTIO_NET_CTRL_RX_PROMISC, sg)) dev_warn(&dev->dev, "Failed to %sable promisc mode.\n", - promisc ? "en" : "dis"); + vi->ctrl_promisc ? "en" : "dis"); - sg_init_one(sg, &allmulti, sizeof(allmulti)); + sg_init_one(sg, &vi->ctrl_allmulti, sizeof(vi->ctrl_allmulti)); if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX, VIRTIO_NET_CTRL_RX_ALLMULTI, sg)) dev_warn(&dev->dev, "Failed to %sable allmulti mode.\n", - allmulti ? "en" : "dis"); + vi->ctrl_allmulti ? "en" : "dis"); uc_count = netdev_uc_count(dev); mc_count = netdev_mc_count(dev); -- 2.4.3
next prev parent reply other threads:[~2015-10-30 1:10 UTC|newest] Thread overview: 115+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-10-30 1:09 [PATCH v4 0/6] virtio core DMA API conversion Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` [PATCH v4 1/6] virtio-net: Stop doing DMA from the stack Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski [this message] 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 13:55 ` Christian Borntraeger 2015-10-30 13:55 ` Christian Borntraeger 2015-10-31 5:02 ` Andy Lutomirski 2015-10-31 5:02 ` Andy Lutomirski 2015-10-31 5:02 ` Andy Lutomirski 2015-10-30 13:55 ` Christian Borntraeger 2015-10-30 1:09 ` [PATCH v4 2/6] virtio_ring: Support DMA APIs Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 12:01 ` Cornelia Huck 2015-10-30 12:01 ` Cornelia Huck 2015-10-30 12:01 ` Cornelia Huck 2015-10-30 12:05 ` Christian Borntraeger 2015-10-30 12:05 ` Christian Borntraeger 2015-10-30 12:05 ` Christian Borntraeger 2015-10-30 18:51 ` Andy Lutomirski 2015-10-30 18:51 ` Andy Lutomirski 2015-10-30 18:51 ` Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` [PATCH v4 3/6] virtio_pci: Use the DMA API Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` [PATCH v4 4/6] virtio: Add improved queue allocation API Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` [PATCH v4 5/6] virtio_mmio: Use the DMA API Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` [PATCH v4 6/6] virtio_pci: " Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:09 ` Andy Lutomirski 2015-10-30 1:17 ` [PATCH v4 0/6] virtio core DMA API conversion Andy Lutomirski 2015-10-30 1:17 ` Andy Lutomirski 2015-10-30 1:17 ` Andy Lutomirski 2015-10-30 9:57 ` Christian Borntraeger 2015-10-30 9:57 ` Christian Borntraeger 2015-10-30 9:57 ` Christian Borntraeger 2015-11-09 12:15 ` Michael S. Tsirkin 2015-11-09 12:15 ` Michael S. Tsirkin 2015-11-09 12:15 ` Michael S. Tsirkin 2015-11-09 12:27 ` Paolo Bonzini 2015-11-09 12:27 ` Paolo Bonzini 2015-11-09 12:27 ` Paolo Bonzini 2015-11-09 22:58 ` Benjamin Herrenschmidt 2015-11-09 22:58 ` Benjamin Herrenschmidt 2015-11-09 22:58 ` Benjamin Herrenschmidt 2015-11-10 0:46 ` Andy Lutomirski 2015-11-10 0:46 ` Andy Lutomirski 2015-11-10 0:46 ` Andy Lutomirski 2015-11-10 2:04 ` Benjamin Herrenschmidt 2015-11-10 2:04 ` Benjamin Herrenschmidt 2015-11-10 2:04 ` Benjamin Herrenschmidt 2015-11-10 2:18 ` Andy Lutomirski 2015-11-10 2:18 ` Andy Lutomirski 2015-11-10 2:18 ` Andy Lutomirski 2015-11-10 5:26 ` Benjamin Herrenschmidt 2015-11-10 5:26 ` Benjamin Herrenschmidt 2015-11-10 5:26 ` Benjamin Herrenschmidt 2015-11-10 5:33 ` Andy Lutomirski 2015-11-10 5:33 ` Andy Lutomirski 2015-11-10 5:33 ` Andy Lutomirski 2015-11-10 5:28 ` Benjamin Herrenschmidt 2015-11-10 5:28 ` Benjamin Herrenschmidt 2015-11-10 5:28 ` Benjamin Herrenschmidt 2015-11-10 5:35 ` Andy Lutomirski 2015-11-10 5:35 ` Andy Lutomirski 2015-11-10 5:35 ` Andy Lutomirski 2015-11-10 10:37 ` Benjamin Herrenschmidt 2015-11-10 10:37 ` Benjamin Herrenschmidt 2015-11-10 10:37 ` Benjamin Herrenschmidt 2015-11-10 12:43 ` Michael S. Tsirkin 2015-11-10 12:43 ` Michael S. Tsirkin 2015-11-10 12:43 ` Michael S. Tsirkin 2015-11-10 19:37 ` Benjamin Herrenschmidt 2015-11-10 19:37 ` Benjamin Herrenschmidt 2015-11-10 19:37 ` Benjamin Herrenschmidt 2015-11-10 12:43 ` Michael S. Tsirkin 2015-11-10 18:54 ` Andy Lutomirski 2015-11-10 18:54 ` Andy Lutomirski 2015-11-10 18:54 ` Andy Lutomirski 2015-11-10 22:27 ` Benjamin Herrenschmidt 2015-11-10 22:27 ` Benjamin Herrenschmidt 2015-11-10 22:27 ` Benjamin Herrenschmidt 2015-11-10 23:44 ` Andy Lutomirski 2015-11-10 23:44 ` Andy Lutomirski 2015-11-10 23:44 ` Andy Lutomirski 2015-11-11 0:44 ` Benjamin Herrenschmidt 2015-11-11 0:44 ` Benjamin Herrenschmidt 2015-11-11 0:44 ` Benjamin Herrenschmidt 2015-11-11 4:46 ` Andy Lutomirski 2015-11-11 4:46 ` Andy Lutomirski 2015-11-11 4:46 ` Andy Lutomirski 2015-11-11 5:08 ` Benjamin Herrenschmidt 2015-11-11 5:08 ` Benjamin Herrenschmidt 2015-11-11 5:08 ` Benjamin Herrenschmidt 2015-11-10 7:28 ` Jan Kiszka 2015-11-10 7:28 ` Jan Kiszka 2015-11-10 7:28 ` Jan Kiszka 2015-11-10 7:28 ` Jan Kiszka 2015-11-10 9:45 ` Knut Omang 2015-11-10 9:45 ` Knut Omang 2015-11-10 9:45 ` Knut Omang 2015-11-10 10:26 ` Benjamin Herrenschmidt 2015-11-10 10:26 ` Benjamin Herrenschmidt 2015-11-10 10:26 ` Benjamin Herrenschmidt 2015-11-10 10:27 ` Joerg Roedel 2015-11-10 10:27 ` Joerg Roedel 2015-11-10 10:27 ` Joerg Roedel 2015-11-10 19:36 ` Benjamin Herrenschmidt 2015-11-10 19:36 ` Benjamin Herrenschmidt 2015-11-10 19:36 ` Benjamin Herrenschmidt
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=8d6b1fc3b5d3b6f5e8b212ef690691a52fbefaff.1446162273.git.luto@kernel.org \ --to=luto@kernel.org \ --cc=benh@kernel.crashing.org \ --cc=borntraeger@de.ibm.com \ --cc=cornelia.huck@de.ibm.com \ --cc=davem@davemloft.net \ --cc=dwmw2@infradead.org \ --cc=hch@lst.de \ --cc=jroedel@suse.de \ --cc=kvm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-s390@vger.kernel.org \ --cc=mst@redhat.com \ --cc=pbonzini@redhat.com \ --cc=schwidefsky@de.ibm.com \ --cc=sebott@linux.vnet.ibm.com \ --cc=sparclinux@vger.kernel.org \ --cc=virtualization@lists.linux-foundation.org \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.