On Thu, Jun 28, 2012 at 05:24:52PM +0200, Eric Dumazet wrote: > On Thu, 2012-06-28 at 16:10 +0200, Jiri Pirko wrote: > > Introduce IFF_LIFE_ADDR_CHANGE priv_flag and use it to disable > > netif_running() check in eth_mac_addr() > > > > Signed-off-by: Jiri Pirko <jpirko@xxxxxxxxxx> > > --- > > include/linux/if.h | 2 ++ > > net/ethernet/eth.c | 2 +- > > 2 files changed, 3 insertions(+), 1 deletion(-) > > > > diff --git a/include/linux/if.h b/include/linux/if.h > > index f995c66..fd9ee7c 100644 > > --- a/include/linux/if.h > > +++ b/include/linux/if.h > > @@ -81,6 +81,8 @@ > > #define IFF_UNICAST_FLT 0x20000 /* Supports unicast filtering */ > > #define IFF_TEAM_PORT 0x40000 /* device used as team port */ > > #define IFF_SUPP_NOFCS 0x80000 /* device supports sending custom FCS */ > > +#define IFF_LIFE_ADDR_CHANGE 0x100000 /* device supports hardware address > > + * change when it's running */ > > > > > > #define IF_GET_IFACE 0x0001 /* for querying only */ > > diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c > > index 36e5880..8f8ded4 100644 > > --- a/net/ethernet/eth.c > > +++ b/net/ethernet/eth.c > > @@ -283,7 +283,7 @@ int eth_mac_addr(struct net_device *dev, void *p) > > { > > struct sockaddr *addr = p; > > > > - if (netif_running(dev)) > > + if (!(dev->priv_flags & IFF_LIFE_ADDR_CHANGE) && netif_running(dev)) > > return -EBUSY; > > if (!is_valid_ether_addr(addr->sa_data)) > > return -EADDRNOTAVAIL; > > Since the memcpy() is not atomic, there is a small window where a reader > could get a half-changed mac address. I guess its a detail. > At least for virtio nothing changes - we had this bug forever. How'd you fix this? -- MST _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization