From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37474) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bvyjw-0000Mw-8j for qemu-devel@nongnu.org; Sun, 16 Oct 2016 23:37:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bvyju-0007Gf-VQ for qemu-devel@nongnu.org; Sun, 16 Oct 2016 23:37:28 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:58943) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1bvyjt-0007Ee-RU for qemu-devel@nongnu.org; Sun, 16 Oct 2016 23:37:26 -0400 Date: Mon, 17 Oct 2016 14:36:41 +1100 From: David Gibson Message-ID: <20161017033641.GO25390@umbus.fritz.box> References: <20161011171833.20803-1-dgilbert@redhat.com> <20161011171833.20803-4-dgilbert@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="hD6P3ib1XCFtz2ni" Content-Disposition: inline In-Reply-To: <20161011171833.20803-4-dgilbert@redhat.com> Subject: Re: [Qemu-devel] [very-WIP 3/4] slirp: VMStatify sbuf List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Dr. David Alan Gilbert (git)" Cc: qemu-devel@nongnu.org, amit.shah@redhat.com, quintela@redhat.com, duanj@linux.vnet.ibm.com, pasic@linux.vnet.ibm.com --hD6P3ib1XCFtz2ni Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Oct 11, 2016 at 06:18:32PM +0100, Dr. David Alan Gilbert (git) wrot= e: > From: "Dr. David Alan Gilbert" >=20 > Convert the sbuf structure to a VMStateDescription. > Note this uses the VMSTATE_WITH_TMP mechanism to calculate > and reload the offsets based on the pointers. >=20 > Signed-off-by: Dr. David Alan Gilbert Reviewed-by: David Gibson > --- > slirp/sbuf.h | 4 +- > slirp/slirp.c | 116 ++++++++++++++++++++++++++++++++++++++--------------= ------ > 2 files changed, 78 insertions(+), 42 deletions(-) >=20 > diff --git a/slirp/sbuf.h b/slirp/sbuf.h > index efcec39..a722ecb 100644 > --- a/slirp/sbuf.h > +++ b/slirp/sbuf.h > @@ -12,8 +12,8 @@ > #define sbspace(sb) ((sb)->sb_datalen - (sb)->sb_cc) > =20 > struct sbuf { > - u_int sb_cc; /* actual chars in buffer */ > - u_int sb_datalen; /* Length of data */ > + uint32_t sb_cc; /* actual chars in buffer */ > + uint32_t sb_datalen; /* Length of data */ > char *sb_wptr; /* write pointer. points to where the next > * bytes should be written in the sbuf */ > char *sb_rptr; /* read pointer. points to where the next > diff --git a/slirp/slirp.c b/slirp/slirp.c > index 6276315..2f7802e 100644 > --- a/slirp/slirp.c > +++ b/slirp/slirp.c > @@ -1185,19 +1185,72 @@ static const VMStateDescription vmstate_slirp_tcp= =3D { > } > }; > =20 > -static void slirp_sbuf_save(QEMUFile *f, struct sbuf *sbuf) > +/* The sbuf has a pair of pointers that are migrated as offsets; > + * we calculate the offsets and restore the pointers using > + * pre_save/post_load on a tmp structure. > + */ > +struct sbuf_tmp { > + struct sbuf *parent; > + uint32_t roff, woff; > +}; > + > +static void sbuf_tmp_pre_save(void *opaque) > +{ > + struct sbuf_tmp *tmp =3D opaque; > + tmp->woff =3D tmp->parent->sb_wptr - tmp->parent->sb_data; > + tmp->roff =3D tmp->parent->sb_rptr - tmp->parent->sb_data; > +} > + > +static int sbuf_tmp_post_load(void *opaque, int version) > { > - uint32_t off; > - > - qemu_put_be32(f, sbuf->sb_cc); > - qemu_put_be32(f, sbuf->sb_datalen); > - off =3D (uint32_t)(sbuf->sb_wptr - sbuf->sb_data); > - qemu_put_sbe32(f, off); > - off =3D (uint32_t)(sbuf->sb_rptr - sbuf->sb_data); > - qemu_put_sbe32(f, off); > - qemu_put_buffer(f, (unsigned char*)sbuf->sb_data, sbuf->sb_datalen); > + struct sbuf_tmp *tmp =3D opaque; > + uint32_t requested_len =3D tmp->parent->sb_datalen; > + > + /* Allocate the buffer space used by the field after the tmp */ > + sbreserve(tmp->parent, tmp->parent->sb_datalen); > + > + if (tmp->parent->sb_datalen !=3D requested_len) { > + return -ENOMEM; > + } > + if (tmp->woff >=3D requested_len || > + tmp->roff >=3D requested_len) { > + error_report("invalid sbuf offsets r/w=3D%u/%u len=3D%u", > + tmp->roff, tmp->woff, requested_len); > + return -EINVAL; > + } > + > + tmp->parent->sb_wptr =3D tmp->parent->sb_data + tmp->woff; > + tmp->parent->sb_rptr =3D tmp->parent->sb_data + tmp->roff; > + > + return 0; > } > =20 > + > +static const VMStateDescription vmstate_slirp_sbuf_tmp =3D { > + .name =3D "slirp-sbuf-tmp", > + .post_load =3D sbuf_tmp_post_load, > + .pre_save =3D sbuf_tmp_pre_save, > + .version_id =3D 0, > + .fields =3D (VMStateField[]) { > + VMSTATE_UINT32(woff, struct sbuf_tmp), > + VMSTATE_UINT32(roff, struct sbuf_tmp), > + VMSTATE_END_OF_LIST() > + } > +}; > + > +static const VMStateDescription vmstate_slirp_sbuf =3D { > + .name =3D "slirp-sbuf", > + .version_id =3D 0, > + .fields =3D (VMStateField[]) { > + VMSTATE_UINT32(sb_cc, struct sbuf), > + VMSTATE_UINT32(sb_datalen, struct sbuf), > + VMSTATE_WITH_TMP(struct sbuf, struct sbuf_tmp, vmstate_slirp_sbu= f_tmp), > + VMSTATE_VBUFFER_UINT32(sb_data, struct sbuf, 0, NULL, 0, sb_data= len), > + VMSTATE_END_OF_LIST() > + } > +}; > + > + > static void slirp_socket_save(QEMUFile *f, struct socket *so) > { > qemu_put_be32(f, so->so_urgc); > @@ -1225,8 +1278,9 @@ static void slirp_socket_save(QEMUFile *f, struct s= ocket *so) > qemu_put_byte(f, so->so_emu); > qemu_put_byte(f, so->so_type); > qemu_put_be32(f, so->so_state); > - slirp_sbuf_save(f, &so->so_rcv); > - slirp_sbuf_save(f, &so->so_snd); > + /* TODO: Build vmstate at this level */ > + vmstate_save_state(f, &vmstate_slirp_sbuf, &so->so_rcv, 0); > + vmstate_save_state(f, &vmstate_slirp_sbuf, &so->so_snd, 0); > vmstate_save_state(f, &vmstate_slirp_tcp, so->so_tcpcb, 0); > } > =20 > @@ -1263,31 +1317,9 @@ static void slirp_state_save(QEMUFile *f, void *op= aque) > slirp_bootp_save(f, slirp); > } > =20 > -static int slirp_sbuf_load(QEMUFile *f, struct sbuf *sbuf) > -{ > - uint32_t off, sb_cc, sb_datalen; > - > - sb_cc =3D qemu_get_be32(f); > - sb_datalen =3D qemu_get_be32(f); > - > - sbreserve(sbuf, sb_datalen); > - > - if (sbuf->sb_datalen !=3D sb_datalen) > - return -ENOMEM; > - > - sbuf->sb_cc =3D sb_cc; > - > - off =3D qemu_get_sbe32(f); > - sbuf->sb_wptr =3D sbuf->sb_data + off; > - off =3D qemu_get_sbe32(f); > - sbuf->sb_rptr =3D sbuf->sb_data + off; > - qemu_get_buffer(f, (unsigned char*)sbuf->sb_data, sbuf->sb_datalen); > - > - return 0; > -} > - > static int slirp_socket_load(QEMUFile *f, struct socket *so, int version= _id) > { > + int ret =3D 0; > if (tcp_attach(so) < 0) > return -ENOMEM; > =20 > @@ -1324,11 +1356,15 @@ static int slirp_socket_load(QEMUFile *f, struct = socket *so, int version_id) > so->so_emu =3D qemu_get_byte(f); > so->so_type =3D qemu_get_byte(f); > so->so_state =3D qemu_get_be32(f); > - if (slirp_sbuf_load(f, &so->so_rcv) < 0) > - return -ENOMEM; > - if (slirp_sbuf_load(f, &so->so_snd) < 0) > - return -ENOMEM; > - return vmstate_load_state(f, &vmstate_slirp_tcp, so->so_tcpcb, 0); > + /* TODO: VMState at this level */ > + ret =3D vmstate_load_state(f, &vmstate_slirp_sbuf, &so->so_rcv, 0); > + if (!ret) { > + ret =3D vmstate_load_state(f, &vmstate_slirp_sbuf, &so->so_snd, = 0); > + } > + if (!ret) { > + ret =3D vmstate_load_state(f, &vmstate_slirp_tcp, so->so_tcpcb, = 0); > + } > + return ret; > } > =20 > static void slirp_bootp_load(QEMUFile *f, Slirp *slirp) --=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 --hD6P3ib1XCFtz2ni Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJYBEdJAAoJEGw4ysog2bOS6m8QAMFxG0ANnf26DOit2KOJUNF6 JCsml4LRSk/2iKq2y9xk7RdYrWCTrVHDXqtjQoTwfsERjuMTmxI8sGOcHZeOcqfp PJeWmUrj7VOsgIDuMRpJ+Dr3lPx7TqEU457EIAZhSIB6PWUpWRJl/3Vb8flE+caD HIY6N+UQOQIPaB0G/AF+3lYsd1WLcFfkW5XkduSKujRmR4zKlcIr9x2AUnlUJdXV 4OQTIO8LjFX1wL0DI9vFC4szXLLiSK1H37Rz6bzH2zUp5jxile5iu2FAlF1tsmC+ 0g4WuRYapv6tk5b/KA8qDEHwiuL5svppCJl/lvufck1QsB1/kICc1hSKVWmZTI8S vqfIkFs19bKXYuzo3UKvUeLa6ZolmB9cyGOghuD5M7icRKSGpL2u2JZeGOaYJucz qeniyOsh5zjvaitffqRFgU6yezIay8JjxzxFI7fR7s8M13zvHmyToLEYdJaPNrBz p+y8dKQR9IK6lfxkIBSDGBzyg95Z8V+f7o3H8aDw/Xmzj0g/EtYy69hJRgdzOGMg r4JmGrJ/dGNayaNlMwskGG8DWDtWvVjXVixkm3f6lNXWDfLosvnh4SrKQpS2b0uk ijc0/cR/wPzco5N91C3tZ6S8AQiyGZbDSRc8TWxk4dUHmfev3jB0mS7xKh/GwXNB ihEEBpAczQGFqSI4aTb3 =Jd30 -----END PGP SIGNATURE----- --hD6P3ib1XCFtz2ni--