From: "Michael S. Tsirkin" <mst@redhat.com>
To: Amos Kong <akong@redhat.com>
Cc: kvm@vger.kernel.org, netdev@vger.kernel.org,
qemu-devel@nongnu.org, virtualization@lists.linux-foundation.org,
davem@davemloft.net
Subject: Re: [PATCH v2 2/2] virtio-net: introduce a new control to set macaddr
Date: Wed, 16 Jan 2013 10:36:58 +0200 [thread overview]
Message-ID: <20130116083658.GE11465@redhat.com> (raw)
In-Reply-To: <20130116082447.GA31074@t430s.nay.redhat.com>
On Wed, Jan 16, 2013 at 04:24:47PM +0800, Amos Kong wrote:
> On Wed, Jan 16, 2013 at 02:20:39PM +0800, Jason Wang wrote:
> > On Wednesday, January 16, 2013 01:57:01 PM akong@redhat.com wrote:
> > > From: Amos Kong <akong@redhat.com>
> > >
> > > Currently we write MAC address to pci config space byte by byte,
> > > this means that we have an intermediate step where mac is wrong.
> > > This patch introduced a new control command to set MAC address
> > > in one time.
> > >
> > > VIRTIO_NET_F_CTRL_MAC_ADDR is a new feature bit for compatibility.
> > >
> > > Signed-off-by: Amos Kong <akong@redhat.com>
> > > ---
> > > drivers/net/virtio_net.c | 24 +++++++++++++++++-------
> > > include/uapi/linux/virtio_net.h | 8 +++++++-
> > > 2 files changed, 24 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > > index 395ab4f..c8901b6 100644
> > > --- a/drivers/net/virtio_net.c
> > > +++ b/drivers/net/virtio_net.c
> > > @@ -802,16 +802,25 @@ static int virtnet_set_mac_address(struct net_device
> > > *dev, void *p) struct virtnet_info *vi = netdev_priv(dev);
> > > struct virtio_device *vdev = vi->vdev;
> > > int ret;
> > > + struct sockaddr *addr = p;
> > > + struct scatterlist sg;
> > >
> > > - ret = eth_mac_addr(dev, p);
> > > - if (ret)
> > > - return ret;
> > > -
> > > - if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC))
> > > + if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
> > > + sg_init_one(&sg, addr->sa_data, dev->addr_len);
> > > + if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
> > > + VIRTIO_NET_CTRL_MAC_ADDR_SET,
> > > + &sg, 1, 0)) {
> > > + dev_warn(&vdev->dev,
> > > + "Failed to set mac address by vq command.\n");
> > > + return -EINVAL;
> > > + }
> > > + } else if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
> > > vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
> > > - dev->dev_addr, dev->addr_len);
> > > + addr->sa_data, dev->addr_len);
> > > + }
> > > + ret = eth_mac_addr(dev, p);
> > >
> >
> > The you will the validity check in eth_mac_addr which may result a wrong mac
> > address to be set in the hardware (or is there any check in qemu) and a
> > inconsistency bettween what kernel assumes and qemu has.
> >
> > You can take a look at netvsc driver that calls eth_mac_addr() first and
> > restore the software mac address when fail to enforce it to hardware.
>
> Thanks for the catching, I will move eth_mac_addr() back to above,
> just restore addr if fail to send command.
>
> I will also use DEFINE_PROP_BIT to fix migration issue, thanks.
And clear it if running with a compat machine type.
> > Thanks
> > > - return 0;
> > > + return ret;
> > > }
>
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Amos Kong <akong@redhat.com>
Cc: kvm@vger.kernel.org, netdev@vger.kernel.org,
Jason Wang <jasowang@redhat.com>,
qemu-devel@nongnu.org, virtualization@lists.linux-foundation.org,
davem@davemloft.net
Subject: Re: [Qemu-devel] [PATCH v2 2/2] virtio-net: introduce a new control to set macaddr
Date: Wed, 16 Jan 2013 10:36:58 +0200 [thread overview]
Message-ID: <20130116083658.GE11465@redhat.com> (raw)
In-Reply-To: <20130116082447.GA31074@t430s.nay.redhat.com>
On Wed, Jan 16, 2013 at 04:24:47PM +0800, Amos Kong wrote:
> On Wed, Jan 16, 2013 at 02:20:39PM +0800, Jason Wang wrote:
> > On Wednesday, January 16, 2013 01:57:01 PM akong@redhat.com wrote:
> > > From: Amos Kong <akong@redhat.com>
> > >
> > > Currently we write MAC address to pci config space byte by byte,
> > > this means that we have an intermediate step where mac is wrong.
> > > This patch introduced a new control command to set MAC address
> > > in one time.
> > >
> > > VIRTIO_NET_F_CTRL_MAC_ADDR is a new feature bit for compatibility.
> > >
> > > Signed-off-by: Amos Kong <akong@redhat.com>
> > > ---
> > > drivers/net/virtio_net.c | 24 +++++++++++++++++-------
> > > include/uapi/linux/virtio_net.h | 8 +++++++-
> > > 2 files changed, 24 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > > index 395ab4f..c8901b6 100644
> > > --- a/drivers/net/virtio_net.c
> > > +++ b/drivers/net/virtio_net.c
> > > @@ -802,16 +802,25 @@ static int virtnet_set_mac_address(struct net_device
> > > *dev, void *p) struct virtnet_info *vi = netdev_priv(dev);
> > > struct virtio_device *vdev = vi->vdev;
> > > int ret;
> > > + struct sockaddr *addr = p;
> > > + struct scatterlist sg;
> > >
> > > - ret = eth_mac_addr(dev, p);
> > > - if (ret)
> > > - return ret;
> > > -
> > > - if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC))
> > > + if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
> > > + sg_init_one(&sg, addr->sa_data, dev->addr_len);
> > > + if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
> > > + VIRTIO_NET_CTRL_MAC_ADDR_SET,
> > > + &sg, 1, 0)) {
> > > + dev_warn(&vdev->dev,
> > > + "Failed to set mac address by vq command.\n");
> > > + return -EINVAL;
> > > + }
> > > + } else if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
> > > vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
> > > - dev->dev_addr, dev->addr_len);
> > > + addr->sa_data, dev->addr_len);
> > > + }
> > > + ret = eth_mac_addr(dev, p);
> > >
> >
> > The you will the validity check in eth_mac_addr which may result a wrong mac
> > address to be set in the hardware (or is there any check in qemu) and a
> > inconsistency bettween what kernel assumes and qemu has.
> >
> > You can take a look at netvsc driver that calls eth_mac_addr() first and
> > restore the software mac address when fail to enforce it to hardware.
>
> Thanks for the catching, I will move eth_mac_addr() back to above,
> just restore addr if fail to send command.
>
> I will also use DEFINE_PROP_BIT to fix migration issue, thanks.
And clear it if running with a compat machine type.
> > Thanks
> > > - return 0;
> > > + return ret;
> > > }
>
next prev parent reply other threads:[~2013-01-16 8:36 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-16 5:56 [PATCH v2 0/2] make mac programming for virtio net more robust akong
2013-01-16 5:56 ` [Qemu-devel] " akong
2013-01-16 5:57 ` [PATCH v2 1/2] move virtnet_send_command() above virtnet_set_mac_address() akong
2013-01-16 5:57 ` [Qemu-devel] " akong
2013-01-16 5:57 ` akong
2013-01-16 5:57 ` [PATCH v2 2/2] virtio-net: introduce a new control to set macaddr akong
2013-01-16 5:57 ` akong
2013-01-16 5:57 ` [Qemu-devel] " akong
2013-01-16 6:20 ` Jason Wang
2013-01-16 6:20 ` [Qemu-devel] " Jason Wang
2013-01-16 8:24 ` Amos Kong
2013-01-16 8:24 ` [Qemu-devel] " Amos Kong
2013-01-16 8:36 ` Michael S. Tsirkin [this message]
2013-01-16 8:36 ` Michael S. Tsirkin
2013-01-16 8:24 ` Amos Kong
2013-01-16 6:16 ` [QEMU PATCH v2] virtio-net: introduce a new macaddr control akong
2013-01-16 6:16 ` [Qemu-devel] " akong
2013-01-16 6:37 ` Jason Wang
2013-01-16 6:37 ` [Qemu-devel] " Jason Wang
2013-01-16 8:19 ` Michael S. Tsirkin
2013-01-16 8:19 ` [Qemu-devel] " Michael S. Tsirkin
2013-01-16 8:59 ` Stefan Hajnoczi
2013-01-16 8:59 ` [Qemu-devel] " Stefan Hajnoczi
2013-01-16 9:07 ` Michael S. Tsirkin
2013-01-16 9:07 ` [Qemu-devel] " Michael S. Tsirkin
2013-01-16 9:07 ` Michael S. Tsirkin
2013-01-17 1:19 ` Rusty Russell
2013-01-17 1:19 ` [Qemu-devel] " Rusty Russell
2013-01-17 5:45 ` Amos Kong
2013-01-17 8:37 ` Amos Kong
2013-01-17 8:39 ` Stefan Hajnoczi
2013-01-17 8:39 ` Stefan Hajnoczi
2013-01-17 9:34 ` Michael S. Tsirkin
2013-01-17 9:34 ` Michael S. Tsirkin
2013-01-17 12:13 ` Michael S. Tsirkin
2013-01-17 12:13 ` [Qemu-devel] " Michael S. Tsirkin
2013-01-18 2:43 ` Amos Kong
2013-01-18 2:43 ` [Qemu-devel] " Amos Kong
2013-01-16 6:16 ` akong
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=20130116083658.GE11465@redhat.com \
--to=mst@redhat.com \
--cc=akong@redhat.com \
--cc=davem@davemloft.net \
--cc=kvm@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=qemu-devel@nongnu.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: link
Be 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.