From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52660) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bfPfF-0000ez-08 for qemu-devel@nongnu.org; Thu, 01 Sep 2016 06:56:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bfPf3-0003rl-NE for qemu-devel@nongnu.org; Thu, 01 Sep 2016 06:56:09 -0400 Received: from 10.mo179.mail-out.ovh.net ([46.105.79.46]:35232) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bfPf3-0003rN-EB for qemu-devel@nongnu.org; Thu, 01 Sep 2016 06:55:57 -0400 Received: from player698.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo179.mail-out.ovh.net (Postfix) with ESMTP id D49101008FEB for ; Thu, 1 Sep 2016 12:55:54 +0200 (CEST) Date: Thu, 1 Sep 2016 12:55:48 +0200 From: Greg Kurz Message-ID: <20160901125548.21722ee9@bahia.lan> In-Reply-To: <1472717449-12501-1-git-send-email-lvivier@redhat.com> References: <1472717449-12501-1-git-send-email-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [Qemu-ppc] [PATCH] spapr: implement H_CHANGE_LOGICAL_LAN_MAC h_call List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Laurent Vivier Cc: david@gibson.dropbear.id.au, qemu-ppc@nongnu.org, qemu-devel@nongnu.org On Thu, 1 Sep 2016 10:10:49 +0200 Laurent Vivier wrote: > Since kernel v4.0, linux uses H_CHANGE_LOGICAL_LAN_MAC to change lively > the MAC address of an ibmveth interface. > > As QEMU doesn't implement this h_call, we can't change anymore the > MAC address of an spapr-vlan interface. > > Signed-off-by: Laurent Vivier > --- > hw/net/spapr_llan.c | 30 ++++++++++++++++++++++++++++++ > 1 file changed, 30 insertions(+) > > diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c > index b273eda..4bb95a5 100644 > --- a/hw/net/spapr_llan.c > +++ b/hw/net/spapr_llan.c > @@ -106,6 +106,7 @@ typedef struct VIOsPAPRVLANDevice { > VIOsPAPRDevice sdev; > NICConf nicconf; > NICState *nic; > + MACAddr perm_mac; > bool isopen; > hwaddr buf_list; > uint32_t add_buf_ptr, use_buf_ptr, rx_bufs; > @@ -316,6 +317,10 @@ static void spapr_vlan_reset(VIOsPAPRDevice *sdev) > spapr_vlan_reset_rx_pool(dev->rx_pool[i]); > } > } > + > + memcpy(&dev->nicconf.macaddr.a, &dev->perm_mac.a, > + sizeof(dev->nicconf.macaddr.a)); > + qemu_format_nic_info_str(qemu_get_queue(dev->nic), dev->nicconf.macaddr.a); > } > > static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Error **errp) > @@ -324,6 +329,8 @@ static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Error **errp) > > qemu_macaddr_default_if_unset(&dev->nicconf.macaddr); > > + memcpy(&dev->perm_mac.a, &dev->nicconf.macaddr.a, sizeof(dev->perm_mac.a)); > + > dev->nic = qemu_new_nic(&net_spapr_vlan_info, &dev->nicconf, > object_get_typename(OBJECT(sdev)), sdev->qdev.id, dev); > qemu_format_nic_info_str(qemu_get_queue(dev->nic), dev->nicconf.macaddr.a); > @@ -756,6 +763,27 @@ static target_ulong h_multicast_ctrl(PowerPCCPU *cpu, sPAPRMachineState *spapr, > return H_SUCCESS; > } > > +static target_ulong h_change_logical_lan_mac(PowerPCCPU *cpu, > + sPAPRMachineState *spapr, > + target_ulong opcode, > + target_ulong *args) > +{ > + target_ulong reg = args[0]; > + target_ulong macaddr = args[1]; > + VIOsPAPRDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg); > + VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev); > + int i; > + > + for (i = 0; i < ETH_ALEN; i++) { > + dev->nicconf.macaddr.a[ETH_ALEN - i - 1] = macaddr & 0xff; Since ETH_ALEN is a constant, this could have been: + dev->nicconf.macaddr.a[ETH_ALEN - 1 - i] = macaddr & 0xff; and spare 1 instruction (at least with GCC 4.8.3/ppc64le) but we don't care for speed here, so: Reviewed-by: Greg Kurz and tested with both LE and BE guests on a LE host, and the permanent address is restored as expected on reset: Tested-by: Greg Kurz > + macaddr >>= 8; > + } > + > + qemu_format_nic_info_str(qemu_get_queue(dev->nic), dev->nicconf.macaddr.a); > + > + return H_SUCCESS; > +} > + > static Property spapr_vlan_properties[] = { > DEFINE_SPAPR_PROPERTIES(VIOsPAPRVLANDevice, sdev), > DEFINE_NIC_PROPERTIES(VIOsPAPRVLANDevice, nicconf), > @@ -854,6 +882,8 @@ static void spapr_vlan_register_types(void) > spapr_register_hypercall(H_ADD_LOGICAL_LAN_BUFFER, > h_add_logical_lan_buffer); > spapr_register_hypercall(H_MULTICAST_CTRL, h_multicast_ctrl); > + spapr_register_hypercall(H_CHANGE_LOGICAL_LAN_MAC, > + h_change_logical_lan_mac); > type_register_static(&spapr_vlan_info); > } >