From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36482) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1agRKY-00080L-NA for qemu-devel@nongnu.org; Thu, 17 Mar 2016 02:22:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1agRKU-0004FX-Fw for qemu-devel@nongnu.org; Thu, 17 Mar 2016 02:22:46 -0400 Date: Thu, 17 Mar 2016 17:23:46 +1100 From: David Gibson Message-ID: <20160317062346.GP9032@voom> References: <1458130611-17304-1-git-send-email-thuth@redhat.com> <1458130611-17304-2-git-send-email-thuth@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="tbUdrdPJASQ8VKrP" Content-Disposition: inline In-Reply-To: <1458130611-17304-2-git-send-email-thuth@redhat.com> Subject: Re: [Qemu-devel] [PATCH 1/3] hw/net/spapr_llan: Extract rx buffer code into separate functions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Thomas Huth Cc: lvivier@redhat.com, Alexey Kardashevskiy , Jason Wang , qemu-devel@nongnu.org, Alexander Graf , qemu-ppc@nongnu.org, Anton Blanchard --tbUdrdPJASQ8VKrP Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Mar 16, 2016 at 01:16:49PM +0100, Thomas Huth wrote: > Refactor the code a little bit by extracting the code that reads > and writes the receive buffer list page into separate functions. > There should be no functional change in this patch, this is just > a preparation for the upcoming extensions that introduce receive > buffer pools. >=20 > Signed-off-by: Thomas Huth Reviewed-by: David Gibson > --- > hw/net/spapr_llan.c | 106 ++++++++++++++++++++++++++++++++++------------= ------ > 1 file changed, 70 insertions(+), 36 deletions(-) >=20 > diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c > index 5237b4d..39a1dd1 100644 > --- a/hw/net/spapr_llan.c > +++ b/hw/net/spapr_llan.c > @@ -103,6 +103,42 @@ static int spapr_vlan_can_receive(NetClientState *nc) > return (dev->isopen && dev->rx_bufs > 0); > } > =20 > +/** > + * Get buffer descriptor from the receive buffer list page that has been > + * supplied by the guest with the H_REGISTER_LOGICAL_LAN call > + */ > +static vlan_bd_t spapr_vlan_get_rx_bd_from_page(VIOsPAPRVLANDevice *dev, > + size_t size) > +{ > + int buf_ptr =3D dev->use_buf_ptr; > + vlan_bd_t bd; > + > + do { > + buf_ptr +=3D 8; > + if (buf_ptr >=3D VLAN_RX_BDS_LEN + VLAN_RX_BDS_OFF) { > + buf_ptr =3D VLAN_RX_BDS_OFF; > + } > + > + bd =3D vio_ldq(&dev->sdev, dev->buf_list + buf_ptr); > + DPRINTF("use_buf_ptr=3D%d bd=3D0x%016llx\n", > + buf_ptr, (unsigned long long)bd); > + } while ((!(bd & VLAN_BD_VALID) || VLAN_BD_LEN(bd) < size + 8) > + && buf_ptr !=3D dev->use_buf_ptr); > + > + if (!(bd & VLAN_BD_VALID) || VLAN_BD_LEN(bd) < size + 8) { > + /* Failed to find a suitable buffer */ > + return 0; > + } > + > + /* Remove the buffer from the pool */ > + dev->use_buf_ptr =3D buf_ptr; > + vio_stq(&dev->sdev, dev->buf_list + dev->use_buf_ptr, 0); > + > + DPRINTF("Found buffer: ptr=3D%d rxbufs=3D%d\n", dev->use_buf_ptr, de= v->rx_bufs); > + > + return bd; > +} > + > static ssize_t spapr_vlan_receive(NetClientState *nc, const uint8_t *buf, > size_t size) > { > @@ -110,7 +146,6 @@ static ssize_t spapr_vlan_receive(NetClientState *nc,= const uint8_t *buf, > VIOsPAPRDevice *sdev =3D VIO_SPAPR_DEVICE(dev); > vlan_bd_t rxq_bd =3D vio_ldq(sdev, dev->buf_list + VLAN_RXQ_BD_OFF); > vlan_bd_t bd; > - int buf_ptr =3D dev->use_buf_ptr; > uint64_t handle; > uint8_t control; > =20 > @@ -125,29 +160,12 @@ static ssize_t spapr_vlan_receive(NetClientState *n= c, const uint8_t *buf, > return -1; > } > =20 > - do { > - buf_ptr +=3D 8; > - if (buf_ptr >=3D (VLAN_RX_BDS_LEN + VLAN_RX_BDS_OFF)) { > - buf_ptr =3D VLAN_RX_BDS_OFF; > - } > - > - bd =3D vio_ldq(sdev, dev->buf_list + buf_ptr); > - DPRINTF("use_buf_ptr=3D%d bd=3D0x%016llx\n", > - buf_ptr, (unsigned long long)bd); > - } while ((!(bd & VLAN_BD_VALID) || (VLAN_BD_LEN(bd) < (size + 8))) > - && (buf_ptr !=3D dev->use_buf_ptr)); > - > - if (!(bd & VLAN_BD_VALID) || (VLAN_BD_LEN(bd) < (size + 8))) { > - /* Failed to find a suitable buffer */ > + bd =3D spapr_vlan_get_rx_bd_from_page(dev, size); > + if (!bd) { > return -1; > } > =20 > - /* Remove the buffer from the pool */ > dev->rx_bufs--; > - dev->use_buf_ptr =3D buf_ptr; > - vio_stq(sdev, dev->buf_list + dev->use_buf_ptr, 0); > - > - DPRINTF("Found buffer: ptr=3D%d num=3D%d\n", dev->use_buf_ptr, dev->= rx_bufs); > =20 > /* Transfer the packet data */ > if (spapr_vio_dma_write(sdev, VLAN_BD_ADDR(bd) + 8, buf, size) < 0) { > @@ -372,6 +390,32 @@ static target_ulong h_free_logical_lan(PowerPCCPU *c= pu, > return H_SUCCESS; > } > =20 > +static target_long spapr_vlan_add_rxbuf_to_page(VIOsPAPRVLANDevice *dev, > + target_ulong buf) > +{ > + vlan_bd_t bd; > + > + if (dev->rx_bufs >=3D VLAN_MAX_BUFS) { > + return H_RESOURCE; > + } > + > + do { > + dev->add_buf_ptr +=3D 8; > + if (dev->add_buf_ptr >=3D VLAN_RX_BDS_LEN + VLAN_RX_BDS_OFF) { > + dev->add_buf_ptr =3D VLAN_RX_BDS_OFF; > + } > + > + bd =3D vio_ldq(&dev->sdev, dev->buf_list + dev->add_buf_ptr); > + } while (bd & VLAN_BD_VALID); > + > + vio_stq(&dev->sdev, dev->buf_list + dev->add_buf_ptr, buf); > + > + DPRINTF("h_add_llan_buf(): Added buf ptr=3D%d rx_bufs=3D%d bd=3D0= x%016llx\n", > + dev->add_buf_ptr, dev->rx_bufs, (unsigned long long)buf); > + > + return 0; > +} > + > static target_ulong h_add_logical_lan_buffer(PowerPCCPU *cpu, > sPAPRMachineState *spapr, > target_ulong opcode, > @@ -381,7 +425,7 @@ static target_ulong h_add_logical_lan_buffer(PowerPCC= PU *cpu, > target_ulong buf =3D args[1]; > VIOsPAPRDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); > VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); > - vlan_bd_t bd; > + target_long ret; > =20 > DPRINTF("H_ADD_LOGICAL_LAN_BUFFER(0x" TARGET_FMT_lx > ", 0x" TARGET_FMT_lx ")\n", reg, buf); > @@ -397,29 +441,19 @@ static target_ulong h_add_logical_lan_buffer(PowerP= CCPU *cpu, > return H_PARAMETER; > } > =20 > - if (!dev->isopen || dev->rx_bufs >=3D VLAN_MAX_BUFS) { > + if (!dev->isopen) { > return H_RESOURCE; > } > =20 > - do { > - dev->add_buf_ptr +=3D 8; > - if (dev->add_buf_ptr >=3D (VLAN_RX_BDS_LEN + VLAN_RX_BDS_OFF)) { > - dev->add_buf_ptr =3D VLAN_RX_BDS_OFF; > - } > - > - bd =3D vio_ldq(sdev, dev->buf_list + dev->add_buf_ptr); > - } while (bd & VLAN_BD_VALID); > - > - vio_stq(sdev, dev->buf_list + dev->add_buf_ptr, buf); > + ret =3D spapr_vlan_add_rxbuf_to_page(dev, buf); > + if (ret) { > + return ret; > + } > =20 > dev->rx_bufs++; > =20 > qemu_flush_queued_packets(qemu_get_queue(dev->nic)); > =20 > - DPRINTF("h_add_logical_lan_buffer(): Added buf ptr=3D%d rx_bufs= =3D%d" > - " bd=3D0x%016llx\n", dev->add_buf_ptr, dev->rx_bufs, > - (unsigned long long)buf); > - > return H_SUCCESS; > } > =20 --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --tbUdrdPJASQ8VKrP Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW6k1yAAoJEGw4ysog2bOSzl0P/RDTHn2shbIodrHBhWVdt9IA nLrFHJGQzWwg1aBsiV+JKadASKP8MZh3TPDfL3HbS8hmLsxjPo2OgHMAgq5Vqw8T MqtTF4+rZWCVlSCdvUki9D9HYYFznGhztiYbbYw0GDkeNHtVj1eSPvp2HRRTN1gi wUdGm0wBTscVZHbju7NP5OYAQhs5H/uKRfb3X86FlmlAiA3uCGwkfTW7GDUFeBQb tKUa2aT33uUMNMGPQ/5OuYGBSBZaZnrpsKpY1oHnGnZOjZofH5GNmEMlqQtpQdi4 guWNjwk9HNa/Wxzcd+IBwomRrCRGz02Uy+RSPfke7fiStGhzbvmkeql2+5uaaYoR IJD6gWRSnMz9k9pu1rGU/SrMUTbm7tIkeoGXkRa7BxcQR/ZqOIY8+JbzswWi4w6n G6mxxopZePbKnwGAWs1NzLJDy33xUqC5aD1qBfUIMgjGOCc97FAiAc8Sd2KOqCTP Tr8qKJMOP4Xr1ZwZYCIByRXuxDPF3fIadKMN7hfAuaDe2eviWdSos/xs7c3r1/6a NLVCuYxpZJeDQSQSCtUgWDRiQNtiDS1nOwBOow3UclqI8HatqcNbCFB6XIhQm+2Q 0FGS8bnXIA/lW277eb45NVNU4WZgWHByhTg5HuVuhlFEv4kSueeVe7ME6o42HFxm ANizwoierMc9Qn+0YShE =fLl5 -----END PGP SIGNATURE----- --tbUdrdPJASQ8VKrP--