* [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust
@ 2013-01-10 14:45 akong
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 1/2] move virtnet_send_command() above virtnet_set_mac_address() akong
` (4 more replies)
0 siblings, 5 replies; 17+ messages in thread
From: akong @ 2013-01-10 14:45 UTC (permalink / raw)
To: kvm, rusty; +Cc: mst, qemu-devel, virtualization
From: Amos Kong <akong@redhat.com>
Currenly mac is programmed byte by byte. This means that we
have an intermediate step where mac is wrong.
Second patch introduced a new vq control command to set mac
address in one time.
Amos Kong (2):
move virtnet_send_command() above virtnet_set_mac_address()
virtio-net: introduce a new control to set macaddr
drivers/net/virtio_net.c | 105 ++++++++++++++++++++++------------------
include/uapi/linux/virtio_net.h | 8 ++-
2 files changed, 66 insertions(+), 47 deletions(-)
--
1.7.11.7
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC PATCH 1/2] move virtnet_send_command() above virtnet_set_mac_address()
2013-01-10 14:45 [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust akong
@ 2013-01-10 14:45 ` akong
2013-01-10 14:51 ` Jason Wang
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr akong
` (3 subsequent siblings)
4 siblings, 1 reply; 17+ messages in thread
From: akong @ 2013-01-10 14:45 UTC (permalink / raw)
To: kvm, rusty; +Cc: mst, qemu-devel, virtualization
From: Amos Kong <akong@redhat.com>
We will send vq command to set mac address in virtnet_set_mac_address()
a little fix of coding style
Signed-off-by: Amos Kong <akong@redhat.com>
---
drivers/net/virtio_net.c | 89 ++++++++++++++++++++++++------------------------
1 file changed, 44 insertions(+), 45 deletions(-)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index a6fcf15..395ab4f 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -753,6 +753,50 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK;
}
+/*
+ * Send command via the control virtqueue and check status. Commands
+ * supported by the hypervisor, as indicated by feature bits, should
+ * never fail unless improperly formated.
+ */
+static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
+ struct scatterlist *data, int out, int in)
+{
+ struct scatterlist *s, sg[VIRTNET_SEND_COMMAND_SG_MAX + 2];
+ struct virtio_net_ctrl_hdr ctrl;
+ virtio_net_ctrl_ack status = ~0;
+ unsigned int tmp;
+ int i;
+
+ /* Caller should know better */
+ BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ) ||
+ (out + in > VIRTNET_SEND_COMMAND_SG_MAX));
+
+ out++; /* Add header */
+ in++; /* Add return status */
+
+ ctrl.class = class;
+ ctrl.cmd = cmd;
+
+ sg_init_table(sg, out + in);
+
+ sg_set_buf(&sg[0], &ctrl, sizeof(ctrl));
+ for_each_sg(data, s, out + in - 2, i)
+ sg_set_buf(&sg[i + 1], sg_virt(s), s->length);
+ sg_set_buf(&sg[out + in - 1], &status, sizeof(status));
+
+ BUG_ON(virtqueue_add_buf(vi->cvq, sg, out, in, vi, GFP_ATOMIC) < 0);
+
+ virtqueue_kick(vi->cvq);
+
+ /* Spin for a response, the kick causes an ioport write, trapping
+ * into the hypervisor, so the request should be handled immediately.
+ */
+ while (!virtqueue_get_buf(vi->cvq, &tmp))
+ cpu_relax();
+
+ return status == VIRTIO_NET_OK;
+}
+
static int virtnet_set_mac_address(struct net_device *dev, void *p)
{
struct virtnet_info *vi = netdev_priv(dev);
@@ -819,51 +863,6 @@ static void virtnet_netpoll(struct net_device *dev)
}
#endif
-/*
- * Send command via the control virtqueue and check status. Commands
- * supported by the hypervisor, as indicated by feature bits, should
- * never fail unless improperly formated.
- */
-static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
- struct scatterlist *data, int out, int in)
-{
- struct scatterlist *s, sg[VIRTNET_SEND_COMMAND_SG_MAX + 2];
- struct virtio_net_ctrl_hdr ctrl;
- virtio_net_ctrl_ack status = ~0;
- unsigned int tmp;
- int i;
-
- /* Caller should know better */
- BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ) ||
- (out + in > VIRTNET_SEND_COMMAND_SG_MAX));
-
- out++; /* Add header */
- in++; /* Add return status */
-
- ctrl.class = class;
- ctrl.cmd = cmd;
-
- sg_init_table(sg, out + in);
-
- sg_set_buf(&sg[0], &ctrl, sizeof(ctrl));
- for_each_sg(data, s, out + in - 2, i)
- sg_set_buf(&sg[i + 1], sg_virt(s), s->length);
- sg_set_buf(&sg[out + in - 1], &status, sizeof(status));
-
- BUG_ON(virtqueue_add_buf(vi->cvq, sg, out, in, vi, GFP_ATOMIC) < 0);
-
- virtqueue_kick(vi->cvq);
-
- /*
- * Spin for a response, the kick causes an ioport write, trapping
- * into the hypervisor, so the request should be handled immediately.
- */
- while (!virtqueue_get_buf(vi->cvq, &tmp))
- cpu_relax();
-
- return status == VIRTIO_NET_OK;
-}
-
static void virtnet_ack_link_announce(struct virtnet_info *vi)
{
rtnl_lock();
--
1.7.11.7
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr
2013-01-10 14:45 [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust akong
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 1/2] move virtnet_send_command() above virtnet_set_mac_address() akong
@ 2013-01-10 14:45 ` akong
2013-01-10 14:57 ` Jason Wang
2013-01-10 15:26 ` Michael S. Tsirkin
2013-01-10 14:51 ` [Qemu-devel] [RFC PATCH] virtio-net: introduce a new macaddr control akong
` (2 subsequent siblings)
4 siblings, 2 replies; 17+ messages in thread
From: akong @ 2013-01-10 14:45 UTC (permalink / raw)
To: kvm, rusty; +Cc: mst, qemu-devel, virtualization
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 | 16 +++++++++++++++-
include/uapi/linux/virtio_net.h | 8 +++++++-
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 395ab4f..ff22bcd 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -803,13 +803,26 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
struct virtio_device *vdev = vi->vdev;
int ret;
+ 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)) {
+ /* Set MAC address by sending vq command */
+ sg_init_one(&sg, dev->dev_addr, dev->addr_len);
+ virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
+ VIRTIO_NET_CTRL_MAC_ADDR_SET,
+ &sg, 1, 0);
+ return 0;
+ }
+
+ if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
+ /* Set MAC address by writing config space */
vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
dev->dev_addr, dev->addr_len);
+ }
return 0;
}
@@ -1627,6 +1640,7 @@ static unsigned int features[] = {
VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
+ VIRTIO_NET_F_CTRL_MAC_ADDR,
};
static struct virtio_driver virtio_net_driver = {
diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h
index 848e358..a5a8c88 100644
--- a/include/uapi/linux/virtio_net.h
+++ b/include/uapi/linux/virtio_net.h
@@ -53,6 +53,7 @@
* network */
#define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow
* Steering */
+#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
#define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */
@@ -127,7 +128,7 @@ typedef __u8 virtio_net_ctrl_ack;
#define VIRTIO_NET_CTRL_RX_NOBCAST 5
/*
- * Control the MAC filter table.
+ * Control the MAC
*
* The MAC filter table is managed by the hypervisor, the guest should
* assume the size is infinite. Filtering should be considered
@@ -140,6 +141,10 @@ typedef __u8 virtio_net_ctrl_ack;
* first sg list contains unicast addresses, the second is for multicast.
* This functionality is present if the VIRTIO_NET_F_CTRL_RX feature
* is available.
+ *
+ * The ADDR_SET command requests one out scatterlist, it contains a
+ * 6 bytes MAC address. This functionality is present if the
+ * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available.
*/
struct virtio_net_ctrl_mac {
__u32 entries;
@@ -148,6 +153,7 @@ struct virtio_net_ctrl_mac {
#define VIRTIO_NET_CTRL_MAC 1
#define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
+ #define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
/*
* Control VLAN filtering
--
1.7.11.7
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 1/2] move virtnet_send_command() above virtnet_set_mac_address()
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 1/2] move virtnet_send_command() above virtnet_set_mac_address() akong
@ 2013-01-10 14:51 ` Jason Wang
2013-01-10 15:02 ` Michael S. Tsirkin
0 siblings, 1 reply; 17+ messages in thread
From: Jason Wang @ 2013-01-10 14:51 UTC (permalink / raw)
To: akong; +Cc: rusty, virtualization, qemu-devel, kvm, mst
On 01/10/2013 10:45 PM, akong@redhat.com wrote:
> From: Amos Kong <akong@redhat.com>
>
> We will send vq command to set mac address in virtnet_set_mac_address()
> a little fix of coding style
Maybe what you need is just a forward declaration.
>
> Signed-off-by: Amos Kong <akong@redhat.com>
> ---
> drivers/net/virtio_net.c | 89 ++++++++++++++++++++++++------------------------
> 1 file changed, 44 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index a6fcf15..395ab4f 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -753,6 +753,50 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
> return NETDEV_TX_OK;
> }
>
> +/*
> + * Send command via the control virtqueue and check status. Commands
> + * supported by the hypervisor, as indicated by feature bits, should
> + * never fail unless improperly formated.
> + */
> +static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
> + struct scatterlist *data, int out, int in)
> +{
> + struct scatterlist *s, sg[VIRTNET_SEND_COMMAND_SG_MAX + 2];
> + struct virtio_net_ctrl_hdr ctrl;
> + virtio_net_ctrl_ack status = ~0;
> + unsigned int tmp;
> + int i;
> +
> + /* Caller should know better */
> + BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ) ||
> + (out + in > VIRTNET_SEND_COMMAND_SG_MAX));
> +
> + out++; /* Add header */
> + in++; /* Add return status */
> +
> + ctrl.class = class;
> + ctrl.cmd = cmd;
> +
> + sg_init_table(sg, out + in);
> +
> + sg_set_buf(&sg[0], &ctrl, sizeof(ctrl));
> + for_each_sg(data, s, out + in - 2, i)
> + sg_set_buf(&sg[i + 1], sg_virt(s), s->length);
> + sg_set_buf(&sg[out + in - 1], &status, sizeof(status));
> +
> + BUG_ON(virtqueue_add_buf(vi->cvq, sg, out, in, vi, GFP_ATOMIC) < 0);
> +
> + virtqueue_kick(vi->cvq);
> +
> + /* Spin for a response, the kick causes an ioport write, trapping
> + * into the hypervisor, so the request should be handled immediately.
> + */
> + while (!virtqueue_get_buf(vi->cvq, &tmp))
> + cpu_relax();
> +
> + return status == VIRTIO_NET_OK;
> +}
> +
> static int virtnet_set_mac_address(struct net_device *dev, void *p)
> {
> struct virtnet_info *vi = netdev_priv(dev);
> @@ -819,51 +863,6 @@ static void virtnet_netpoll(struct net_device *dev)
> }
> #endif
>
> -/*
> - * Send command via the control virtqueue and check status. Commands
> - * supported by the hypervisor, as indicated by feature bits, should
> - * never fail unless improperly formated.
> - */
> -static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
> - struct scatterlist *data, int out, int in)
> -{
> - struct scatterlist *s, sg[VIRTNET_SEND_COMMAND_SG_MAX + 2];
> - struct virtio_net_ctrl_hdr ctrl;
> - virtio_net_ctrl_ack status = ~0;
> - unsigned int tmp;
> - int i;
> -
> - /* Caller should know better */
> - BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ) ||
> - (out + in > VIRTNET_SEND_COMMAND_SG_MAX));
> -
> - out++; /* Add header */
> - in++; /* Add return status */
> -
> - ctrl.class = class;
> - ctrl.cmd = cmd;
> -
> - sg_init_table(sg, out + in);
> -
> - sg_set_buf(&sg[0], &ctrl, sizeof(ctrl));
> - for_each_sg(data, s, out + in - 2, i)
> - sg_set_buf(&sg[i + 1], sg_virt(s), s->length);
> - sg_set_buf(&sg[out + in - 1], &status, sizeof(status));
> -
> - BUG_ON(virtqueue_add_buf(vi->cvq, sg, out, in, vi, GFP_ATOMIC) < 0);
> -
> - virtqueue_kick(vi->cvq);
> -
> - /*
> - * Spin for a response, the kick causes an ioport write, trapping
> - * into the hypervisor, so the request should be handled immediately.
> - */
> - while (!virtqueue_get_buf(vi->cvq, &tmp))
> - cpu_relax();
> -
> - return status == VIRTIO_NET_OK;
> -}
> -
> static void virtnet_ack_link_announce(struct virtnet_info *vi)
> {
> rtnl_lock();
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC PATCH] virtio-net: introduce a new macaddr control
2013-01-10 14:45 [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust akong
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 1/2] move virtnet_send_command() above virtnet_set_mac_address() akong
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr akong
@ 2013-01-10 14:51 ` akong
2013-01-11 9:50 ` Stefan Hajnoczi
2013-01-10 15:08 ` [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust Amos Kong
2013-01-10 15:28 ` Michael S. Tsirkin
4 siblings, 1 reply; 17+ messages in thread
From: akong @ 2013-01-10 14:51 UTC (permalink / raw)
To: qemu-devel; +Cc: rusty, mst, stefanha, kvm, virtualization
From: Amos Kong <akong@redhat.com>
In virtio-net guest driver, 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>
---
hw/virtio-net.c | 9 +++++++++
hw/virtio-net.h | 9 ++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index dc7c6d6..fc11106 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -247,6 +247,7 @@ static uint32_t virtio_net_get_features(VirtIODevice *vdev, uint32_t features)
VirtIONet *n = to_virtio_net(vdev);
features |= (1 << VIRTIO_NET_F_MAC);
+ features |= (1 << VIRTIO_NET_F_CTRL_MAC_ADDR);
if (!peer_has_vnet_hdr(n)) {
features &= ~(0x1 << VIRTIO_NET_F_CSUM);
@@ -282,6 +283,7 @@ static uint32_t virtio_net_bad_features(VirtIODevice *vdev)
/* Linux kernel 2.6.25. It understood MAC (as everyone must),
* but also these: */
features |= (1 << VIRTIO_NET_F_MAC);
+ features |= (1 << VIRTIO_NET_F_CTRL_MAC_ADDR);
features |= (1 << VIRTIO_NET_F_CSUM);
features |= (1 << VIRTIO_NET_F_HOST_TSO4);
features |= (1 << VIRTIO_NET_F_HOST_TSO6);
@@ -349,6 +351,13 @@ static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd,
{
struct virtio_net_ctrl_mac mac_data;
+ if (cmd == VIRTIO_NET_CTRL_MAC_ADDR_SET && elem->out_num == 2) {
+ /* Set MAC address */
+ memcpy(n->mac, elem->out_sg[1].iov_base, elem->out_sg[1].iov_len);
+ qemu_format_nic_info_str(&n->nic->nc, n->mac);
+ return VIRTIO_NET_OK;
+ }
+
if (cmd != VIRTIO_NET_CTRL_MAC_TABLE_SET || elem->out_num != 3 ||
elem->out_sg[1].iov_len < sizeof(mac_data) ||
elem->out_sg[2].iov_len < sizeof(mac_data))
diff --git a/hw/virtio-net.h b/hw/virtio-net.h
index d46fb98..9394cc0 100644
--- a/hw/virtio-net.h
+++ b/hw/virtio-net.h
@@ -44,6 +44,8 @@
#define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */
#define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */
+#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
+
#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
#define TX_TIMER_INTERVAL 150000 /* 150 us */
@@ -106,7 +108,7 @@ typedef uint8_t virtio_net_ctrl_ack;
#define VIRTIO_NET_CTRL_RX_MODE_NOBCAST 5
/*
- * Control the MAC filter table.
+ * Control the MAC
*
* The MAC filter table is managed by the hypervisor, the guest should
* assume the size is infinite. Filtering should be considered
@@ -119,6 +121,10 @@ typedef uint8_t virtio_net_ctrl_ack;
* first sg list contains unicast addresses, the second is for multicast.
* This functionality is present if the VIRTIO_NET_F_CTRL_RX feature
* is available.
+ *
+ * The ADDR_SET command requests one out scatterlist, it contains a
+ * 6 bytes MAC address. This functionality is present if the
+ * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available.
*/
struct virtio_net_ctrl_mac {
uint32_t entries;
@@ -126,6 +132,7 @@ struct virtio_net_ctrl_mac {
};
#define VIRTIO_NET_CTRL_MAC 1
#define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
+ #define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
/*
* Control VLAN filtering
--
1.7.11.7
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr akong
@ 2013-01-10 14:57 ` Jason Wang
2013-01-16 5:23 ` Amos Kong
2013-01-10 15:26 ` Michael S. Tsirkin
1 sibling, 1 reply; 17+ messages in thread
From: Jason Wang @ 2013-01-10 14:57 UTC (permalink / raw)
To: akong; +Cc: rusty, virtualization, qemu-devel, kvm, mst
On 01/10/2013 10:45 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 | 16 +++++++++++++++-
> include/uapi/linux/virtio_net.h | 8 +++++++-
> 2 files changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 395ab4f..ff22bcd 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -803,13 +803,26 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
> struct virtio_device *vdev = vi->vdev;
> int ret;
>
> + 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)) {
> + /* Set MAC address by sending vq command */
> + sg_init_one(&sg, dev->dev_addr, dev->addr_len);
> + virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
> + VIRTIO_NET_CTRL_MAC_ADDR_SET,
> + &sg, 1, 0);
> + return 0;
> + }
> +
Better to check the return of virtnet_send_command() and give a warn
like other command. Btw, need we fail back to try the old way then?
> + if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
> + /* Set MAC address by writing config space */
> vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
> dev->dev_addr, dev->addr_len);
> + }
>
> return 0;
> }
> @@ -1627,6 +1640,7 @@ static unsigned int features[] = {
> VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
> VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
> VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
> + VIRTIO_NET_F_CTRL_MAC_ADDR,
> };
>
> static struct virtio_driver virtio_net_driver = {
> diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h
> index 848e358..a5a8c88 100644
> --- a/include/uapi/linux/virtio_net.h
> +++ b/include/uapi/linux/virtio_net.h
> @@ -53,6 +53,7 @@
> * network */
> #define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow
> * Steering */
> +#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
>
> #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
> #define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */
> @@ -127,7 +128,7 @@ typedef __u8 virtio_net_ctrl_ack;
> #define VIRTIO_NET_CTRL_RX_NOBCAST 5
>
> /*
> - * Control the MAC filter table.
> + * Control the MAC
> *
> * The MAC filter table is managed by the hypervisor, the guest should
> * assume the size is infinite. Filtering should be considered
> @@ -140,6 +141,10 @@ typedef __u8 virtio_net_ctrl_ack;
> * first sg list contains unicast addresses, the second is for multicast.
> * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature
> * is available.
> + *
> + * The ADDR_SET command requests one out scatterlist, it contains a
> + * 6 bytes MAC address. This functionality is present if the
> + * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available.
> */
> struct virtio_net_ctrl_mac {
> __u32 entries;
> @@ -148,6 +153,7 @@ struct virtio_net_ctrl_mac {
>
> #define VIRTIO_NET_CTRL_MAC 1
> #define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
> + #define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
>
> /*
> * Control VLAN filtering
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 1/2] move virtnet_send_command() above virtnet_set_mac_address()
2013-01-10 14:51 ` Jason Wang
@ 2013-01-10 15:02 ` Michael S. Tsirkin
0 siblings, 0 replies; 17+ messages in thread
From: Michael S. Tsirkin @ 2013-01-10 15:02 UTC (permalink / raw)
To: Jason Wang; +Cc: rusty, akong, qemu-devel, kvm, virtualization
On Thu, Jan 10, 2013 at 10:51:52PM +0800, Jason Wang wrote:
> On 01/10/2013 10:45 PM, akong@redhat.com wrote:
> > From: Amos Kong <akong@redhat.com>
> >
> > We will send vq command to set mac address in virtnet_set_mac_address()
> > a little fix of coding style
>
> Maybe what you need is just a forward declaration.
Nah functions should be ordered sensibly.
> >
> > Signed-off-by: Amos Kong <akong@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust
2013-01-10 14:45 [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust akong
` (2 preceding siblings ...)
2013-01-10 14:51 ` [Qemu-devel] [RFC PATCH] virtio-net: introduce a new macaddr control akong
@ 2013-01-10 15:08 ` Amos Kong
2013-01-10 15:28 ` Michael S. Tsirkin
4 siblings, 0 replies; 17+ messages in thread
From: Amos Kong @ 2013-01-10 15:08 UTC (permalink / raw)
To: kvm, rusty; +Cc: virtualization, qemu-devel, mst
On Thu, Jan 10, 2013 at 10:45:39PM +0800, akong@redhat.com wrote:
> From: Amos Kong <akong@redhat.com>
>
> Currenly mac is programmed byte by byte. This means that we
> have an intermediate step where mac is wrong.
>
> Second patch introduced a new vq control command to set mac
> address in one time.
I just posted RFC patches (kernel & qemu) out,
specifiction update will be sent when the solution
is accepted.
MST has another solution:
1. add a feature to disable mac address in pci space
2. introduce a new vq control cmd to add new mac address
to mac filter table. (no long check n->mac in receiver_filter())
Welcome to give comments, thanks!
Amos
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr akong
2013-01-10 14:57 ` Jason Wang
@ 2013-01-10 15:26 ` Michael S. Tsirkin
2013-01-11 0:43 ` Rusty Russell
1 sibling, 1 reply; 17+ messages in thread
From: Michael S. Tsirkin @ 2013-01-10 15:26 UTC (permalink / raw)
To: akong; +Cc: rusty, qemu-devel, kvm, virtualization
On Thu, Jan 10, 2013 at 10:45:41PM +0800, 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 | 16 +++++++++++++++-
> include/uapi/linux/virtio_net.h | 8 +++++++-
> 2 files changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 395ab4f..ff22bcd 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -803,13 +803,26 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
> struct virtio_device *vdev = vi->vdev;
> int ret;
>
> + 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)) {
> + /* Set MAC address by sending vq command */
> + sg_init_one(&sg, dev->dev_addr, dev->addr_len);
> + virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
> + VIRTIO_NET_CTRL_MAC_ADDR_SET,
> + &sg, 1, 0);
I think we should check status and return an error if the command failed.
Also, delay eth_mac_addr until after it passes.
> + return 0;
> + }
> +
> + if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
> + /* Set MAC address by writing config space */
> vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
> dev->dev_addr, dev->addr_len);
> + }
>
By the way, why don't we fail the command if VIRTIO_NET_F_MAC is off?
Rusty?
> return 0;
> }
> @@ -1627,6 +1640,7 @@ static unsigned int features[] = {
> VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
> VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
> VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
> + VIRTIO_NET_F_CTRL_MAC_ADDR,
> };
>
> static struct virtio_driver virtio_net_driver = {
> diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h
> index 848e358..a5a8c88 100644
> --- a/include/uapi/linux/virtio_net.h
> +++ b/include/uapi/linux/virtio_net.h
> @@ -53,6 +53,7 @@
> * network */
> #define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow
> * Steering */
> +#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
>
> #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
> #define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */
> @@ -127,7 +128,7 @@ typedef __u8 virtio_net_ctrl_ack;
> #define VIRTIO_NET_CTRL_RX_NOBCAST 5
>
> /*
> - * Control the MAC filter table.
> + * Control the MAC
> *
> * The MAC filter table is managed by the hypervisor, the guest should
> * assume the size is infinite. Filtering should be considered
> @@ -140,6 +141,10 @@ typedef __u8 virtio_net_ctrl_ack;
> * first sg list contains unicast addresses, the second is for multicast.
> * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature
> * is available.
> + *
> + * The ADDR_SET command requests one out scatterlist, it contains a
> + * 6 bytes MAC address. This functionality is present if the
> + * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available.
> */
> struct virtio_net_ctrl_mac {
> __u32 entries;
> @@ -148,6 +153,7 @@ struct virtio_net_ctrl_mac {
>
> #define VIRTIO_NET_CTRL_MAC 1
> #define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
> + #define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
>
> /*
> * Control VLAN filtering
> --
> 1.7.11.7
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust
2013-01-10 14:45 [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust akong
` (3 preceding siblings ...)
2013-01-10 15:08 ` [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust Amos Kong
@ 2013-01-10 15:28 ` Michael S. Tsirkin
2013-01-11 2:23 ` Rusty Russell
4 siblings, 1 reply; 17+ messages in thread
From: Michael S. Tsirkin @ 2013-01-10 15:28 UTC (permalink / raw)
To: akong; +Cc: rusty, qemu-devel, kvm, virtualization
On Thu, Jan 10, 2013 at 10:45:39PM +0800, akong@redhat.com wrote:
> From: Amos Kong <akong@redhat.com>
>
> Currenly mac is programmed byte by byte. This means that we
> have an intermediate step where mac is wrong.
>
> Second patch introduced a new vq control command to set mac
> address in one time.
As you mention we could alternatively do it without
new commands, simply add a feature bit that says that MACs are
in the mac table.
This would be a much bigger patch, and I'm fine with either way.
Rusty what do you think?
> Amos Kong (2):
> move virtnet_send_command() above virtnet_set_mac_address()
> virtio-net: introduce a new control to set macaddr
>
> drivers/net/virtio_net.c | 105 ++++++++++++++++++++++------------------
> include/uapi/linux/virtio_net.h | 8 ++-
> 2 files changed, 66 insertions(+), 47 deletions(-)
>
> --
> 1.7.11.7
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr
2013-01-10 15:26 ` Michael S. Tsirkin
@ 2013-01-11 0:43 ` Rusty Russell
0 siblings, 0 replies; 17+ messages in thread
From: Rusty Russell @ 2013-01-11 0:43 UTC (permalink / raw)
To: Michael S. Tsirkin, akong; +Cc: qemu-devel, kvm, virtualization
"Michael S. Tsirkin" <mst@redhat.com> writes:
>> + if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
>> + /* Set MAC address by writing config space */
>> vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
>> dev->dev_addr, dev->addr_len);
>> + }
>>
>
> By the way, why don't we fail the command if VIRTIO_NET_F_MAC is off?
> Rusty?
Looked back through the history for this one. I think the theory is that
if the guest doesn't set VIRTIO_NET_F_MAC, it means it doesn't care:
it's up to the guest.
Cheers,
Rusty.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust
2013-01-10 15:28 ` Michael S. Tsirkin
@ 2013-01-11 2:23 ` Rusty Russell
2013-01-11 7:46 ` Michael S. Tsirkin
0 siblings, 1 reply; 17+ messages in thread
From: Rusty Russell @ 2013-01-11 2:23 UTC (permalink / raw)
To: Michael S. Tsirkin, akong; +Cc: qemu-devel, kvm, virtualization
"Michael S. Tsirkin" <mst@redhat.com> writes:
> On Thu, Jan 10, 2013 at 10:45:39PM +0800, akong@redhat.com wrote:
>> From: Amos Kong <akong@redhat.com>
>>
>> Currenly mac is programmed byte by byte. This means that we
>> have an intermediate step where mac is wrong.
>>
>> Second patch introduced a new vq control command to set mac
>> address in one time.
>
> As you mention we could alternatively do it without
> new commands, simply add a feature bit that says that MACs are
> in the mac table.
> This would be a much bigger patch, and I'm fine with either way.
> Rusty what do you think?
Hmm, mac filtering and "my mac address" are not quite the same thing. I
don't know if it matters for anyone: does it? The mac address is abused
for things like identifying machines, etc.
If we keep it as a separate concept, Amos' patch seems to make sense.
Cheers,
Rusty.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust
2013-01-11 2:23 ` Rusty Russell
@ 2013-01-11 7:46 ` Michael S. Tsirkin
2013-01-11 14:52 ` John Fastabend
0 siblings, 1 reply; 17+ messages in thread
From: Michael S. Tsirkin @ 2013-01-11 7:46 UTC (permalink / raw)
To: Rusty Russell
Cc: kvm, netdev, qemu-devel, virtualization, akong, David Miller
On Fri, Jan 11, 2013 at 12:53:07PM +1030, Rusty Russell wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
>
> > On Thu, Jan 10, 2013 at 10:45:39PM +0800, akong@redhat.com wrote:
> >> From: Amos Kong <akong@redhat.com>
> >>
> >> Currenly mac is programmed byte by byte. This means that we
> >> have an intermediate step where mac is wrong.
> >>
> >> Second patch introduced a new vq control command to set mac
> >> address in one time.
> >
> > As you mention we could alternatively do it without
> > new commands, simply add a feature bit that says that MACs are
> > in the mac table.
> > This would be a much bigger patch, and I'm fine with either way.
> > Rusty what do you think?
>
> Hmm, mac filtering and "my mac address" are not quite the same thing. I
> don't know if it matters for anyone: does it?
> The mac address is abused
> for things like identifying machines, etc.
I don't know either. I think net core differentiates between mac and
uc_list because linux has to know which mac to use when building
up packets, so at some level, I agree it might be useful to identify the
machine.
BTW netdev/davem should have been copied on this, Amos I think it's a
good idea to remember to do it next time you post.
>
> If we keep it as a separate concept, Amos' patch seems to make sense.
Yes. It also keeps the patch small, I just thought I'd mention the
option.
>
> Cheers,
> Rusty.
--
MST
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] virtio-net: introduce a new macaddr control
2013-01-10 14:51 ` [Qemu-devel] [RFC PATCH] virtio-net: introduce a new macaddr control akong
@ 2013-01-11 9:50 ` Stefan Hajnoczi
0 siblings, 0 replies; 17+ messages in thread
From: Stefan Hajnoczi @ 2013-01-11 9:50 UTC (permalink / raw)
To: akong; +Cc: kvm, virtualization, qemu-devel, stefanha, mst
On Thu, Jan 10, 2013 at 10:51:57PM +0800, akong@redhat.com wrote:
> @@ -349,6 +351,13 @@ static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd,
> {
> struct virtio_net_ctrl_mac mac_data;
>
> + if (cmd == VIRTIO_NET_CTRL_MAC_ADDR_SET && elem->out_num == 2) {
> + /* Set MAC address */
> + memcpy(n->mac, elem->out_sg[1].iov_base, elem->out_sg[1].iov_len);
We cannot trust the guest's iov_len, it could overflow n->mac.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust
2013-01-11 7:46 ` Michael S. Tsirkin
@ 2013-01-11 14:52 ` John Fastabend
0 siblings, 0 replies; 17+ messages in thread
From: John Fastabend @ 2013-01-11 14:52 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: kvm, netdev, Rusty Russell, qemu-devel, virtualization, akong,
David Miller
On 1/10/2013 11:46 PM, Michael S. Tsirkin wrote:
> On Fri, Jan 11, 2013 at 12:53:07PM +1030, Rusty Russell wrote:
>> "Michael S. Tsirkin" <mst@redhat.com> writes:
>>
>>> On Thu, Jan 10, 2013 at 10:45:39PM +0800, akong@redhat.com wrote:
>>>> From: Amos Kong <akong@redhat.com>
>>>>
>>>> Currenly mac is programmed byte by byte. This means that we
>>>> have an intermediate step where mac is wrong.
>>>>
>>>> Second patch introduced a new vq control command to set mac
>>>> address in one time.
>>>
>>> As you mention we could alternatively do it without
>>> new commands, simply add a feature bit that says that MACs are
>>> in the mac table.
>>> This would be a much bigger patch, and I'm fine with either way.
>>> Rusty what do you think?
>>
>> Hmm, mac filtering and "my mac address" are not quite the same thing. I
>> don't know if it matters for anyone: does it?
>> The mac address is abused
>> for things like identifying machines, etc.
>
> I don't know either. I think net core differentiates between mac and
> uc_list because linux has to know which mac to use when building
> up packets, so at some level, I agree it might be useful to identify the
> machine.
>
> BTW netdev/davem should have been copied on this, Amos I think it's a
> good idea to remember to do it next time you post.
>
>>
>> If we keep it as a separate concept, Amos' patch seems to make sense.
>
> Yes. It also keeps the patch small, I just thought I'd mention the
> option.
>
>>
>> Cheers,
>> Rusty.
>
Don't have the entire context here but if you implement the
ndo_fdb_dump() probably hooking it up to ndo_dflt_fdb_dump() you could
use the 'bridge' tool dump the uc_list.
Then use ndo_fdb_add() and ndo_fdb_del() to add and remove entries
from the uc_list. We do this today in macvlan and the ixgbe driver when
it is in SR-IOV mode and the embedded switch needs to be programmed.
fdb is "forwarding database" its a bit different then mac filtering
in that its telling the "switch" how to forward mac addresses, in
ixgbe and macvlan at least we have been overloading it a bit to also
stop filtering the mac address. I think this makes sense if you setup
forwarding to a port it doesn't make much sense to then drop them.
Maybe its not entirely applicable here just thought I would mention it.
Thanks,
John
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr
2013-01-10 14:57 ` Jason Wang
@ 2013-01-16 5:23 ` Amos Kong
2013-01-16 9:17 ` Michael S. Tsirkin
0 siblings, 1 reply; 17+ messages in thread
From: Amos Kong @ 2013-01-16 5:23 UTC (permalink / raw)
To: Jason Wang; +Cc: rusty, mst, qemu-devel, kvm, virtualization
On Thu, Jan 10, 2013 at 10:57:05PM +0800, Jason Wang wrote:
> On 01/10/2013 10:45 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 | 16 +++++++++++++++-
> > include/uapi/linux/virtio_net.h | 8 +++++++-
> > 2 files changed, 22 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > index 395ab4f..ff22bcd 100644
> > --- a/drivers/net/virtio_net.c
> > +++ b/drivers/net/virtio_net.c
> > @@ -803,13 +803,26 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
> > struct virtio_device *vdev = vi->vdev;
> > int ret;
> >
> > + 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)) {
> > + /* Set MAC address by sending vq command */
> > + sg_init_one(&sg, dev->dev_addr, dev->addr_len);
> > + virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
> > + VIRTIO_NET_CTRL_MAC_ADDR_SET,
> > + &sg, 1, 0);
> > + return 0;
> > + }
> > +
>
> Better to check the return of virtnet_send_command() and give a warn
> like other command. Btw, need we fail back to try the old way then?
Yes, it's necessary to check the return value of
virtnet_send_command().
In fail case, I like to return -EINVAL to userspace, because we don't
only want to set mac successfully, we also want to resolve the
addr inconsistent issue by this feature (vq cmd).
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr
2013-01-16 5:23 ` Amos Kong
@ 2013-01-16 9:17 ` Michael S. Tsirkin
0 siblings, 0 replies; 17+ messages in thread
From: Michael S. Tsirkin @ 2013-01-16 9:17 UTC (permalink / raw)
To: Amos Kong; +Cc: Jason Wang, rusty, qemu-devel, kvm, virtualization
On Wed, Jan 16, 2013 at 01:23:26PM +0800, Amos Kong wrote:
> On Thu, Jan 10, 2013 at 10:57:05PM +0800, Jason Wang wrote:
> > On 01/10/2013 10:45 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 | 16 +++++++++++++++-
> > > include/uapi/linux/virtio_net.h | 8 +++++++-
> > > 2 files changed, 22 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > > index 395ab4f..ff22bcd 100644
> > > --- a/drivers/net/virtio_net.c
> > > +++ b/drivers/net/virtio_net.c
> > > @@ -803,13 +803,26 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
> > > struct virtio_device *vdev = vi->vdev;
> > > int ret;
> > >
> > > + 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)) {
> > > + /* Set MAC address by sending vq command */
> > > + sg_init_one(&sg, dev->dev_addr, dev->addr_len);
> > > + virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
> > > + VIRTIO_NET_CTRL_MAC_ADDR_SET,
> > > + &sg, 1, 0);
> > > + return 0;
> > > + }
> > > +
> >
> > Better to check the return of virtnet_send_command() and give a warn
> > like other command. Btw, need we fail back to try the old way then?
>
> Yes, it's necessary to check the return value of
> virtnet_send_command().
>
> In fail case, I like to return -EINVAL to userspace, because we don't
> only want to set mac successfully, we also want to resolve the
> addr inconsistent issue by this feature (vq cmd).
It's really a device error but I guess we can.
We probably should print a warning too.
--
MST
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2013-01-16 12:12 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-10 14:45 [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust akong
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 1/2] move virtnet_send_command() above virtnet_set_mac_address() akong
2013-01-10 14:51 ` Jason Wang
2013-01-10 15:02 ` Michael S. Tsirkin
2013-01-10 14:45 ` [Qemu-devel] [RFC PATCH 2/2] virtio-net: introduce a new control to set macaddr akong
2013-01-10 14:57 ` Jason Wang
2013-01-16 5:23 ` Amos Kong
2013-01-16 9:17 ` Michael S. Tsirkin
2013-01-10 15:26 ` Michael S. Tsirkin
2013-01-11 0:43 ` Rusty Russell
2013-01-10 14:51 ` [Qemu-devel] [RFC PATCH] virtio-net: introduce a new macaddr control akong
2013-01-11 9:50 ` Stefan Hajnoczi
2013-01-10 15:08 ` [Qemu-devel] [RFC PATCH 0/2] make mac programming for virtio net more robust Amos Kong
2013-01-10 15:28 ` Michael S. Tsirkin
2013-01-11 2:23 ` Rusty Russell
2013-01-11 7:46 ` Michael S. Tsirkin
2013-01-11 14:52 ` John Fastabend
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).