[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [UNIKRAFT PATCH v2 2/9] lib/uk9p: Switch to using the new serialization
Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx> On 5/9/20 7:44 PM, Cristian Banu wrote: > This patch migrates 9p.c and 9pfs to use the new serialization > implementation. > > Signed-off-by: Cristian Banu <cristb@xxxxxxxxx> > --- > lib/9pfs/9pfs_vnops.c | 2 +- > lib/uk9p/9p.c | 302 +++++++++++++++++++++++++----------------- > lib/uk9p/9preq.c | 27 ++-- > 3 files changed, 192 insertions(+), 139 deletions(-) > > diff --git a/lib/9pfs/9pfs_vnops.c b/lib/9pfs/9pfs_vnops.c > index 5e6a7bb..6d3ece3 100644 > --- a/lib/9pfs/9pfs_vnops.c > +++ b/lib/9pfs/9pfs_vnops.c > @@ -409,7 +409,7 @@ again: > fake_request.recv.size = fd->readdir_sz; > fake_request.recv.offset = fd->readdir_off; > fake_request.state = UK_9PREQ_RECEIVED; > - rc = uk_9preq_deserialize(&fake_request, "S", &stat); > + rc = uk_9preq_readstat(&fake_request, &stat); > > if (rc == -ENOBUFS) { > /* > diff --git a/lib/uk9p/9p.c b/lib/uk9p/9p.c > index eb4c2dc..638555b 100644 > --- a/lib/uk9p/9p.c > +++ b/lib/uk9p/9p.c > @@ -40,28 +40,49 @@ > #include <uk/9preq.h> > #include <uk/9pfid.h> > > +static inline int send_and_wait_zc(struct uk_9pdev *dev, struct uk_9preq > *req, > + enum uk_9preq_zcdir zc_dir, void *zc_buf, uint32_t zc_size, > + uint32_t zc_offset) > +{ > + int rc; > + > + if ((rc = uk_9preq_ready(req, zc_dir, zc_buf, zc_size, zc_offset)) || > + (rc = uk_9pdev_request(dev, req)) || > + (rc = uk_9preq_waitreply(req))) > + return rc; > + > + return 0; > +} > + > +static inline int send_and_wait_no_zc(struct uk_9pdev *dev, > + struct uk_9preq *req) > +{ > + return send_and_wait_zc(dev, req, UK_9PREQ_ZCDIR_NONE, NULL, 0, 0); > +} > + > struct uk_9preq *uk_9p_version(struct uk_9pdev *dev, > const char *requested, struct uk_9p_str *received) > { > struct uk_9p_str requested_str; > struct uk_9preq *req; > - int rc; > + int rc = 0; > uint32_t new_msize; > > uk_9p_str_init(&requested_str, requested); > > - uk_pr_debug("TVERSION msize %u version %s\n", > - dev->msize, requested); > - > - req = uk_9pdev_call(dev, UK_9P_TVERSION, __PAGE_SIZE, "ds", > - dev->msize, &requested_str); > + req = uk_9pdev_req_create(dev, UK_9P_TVERSION, __PAGE_SIZE); > if (PTRISERR(req)) > return req; > > - rc = uk_9preq_deserialize(req, "ds", &new_msize, received); > + uk_pr_debug("TVERSION msize %u version %s\n", > + dev->msize, requested); > > - if (rc) > - return ERR2PTR(rc); > + if ((rc = uk_9preq_write32(req, dev->msize)) || > + (rc = uk_9preq_writestr(req, &requested_str)) || > + (rc = send_and_wait_no_zc(dev, req)) || > + (rc = uk_9preq_read32(req, &new_msize)) || > + (rc = uk_9preq_readstr(req, received))) > + goto free; > > uk_pr_debug("RVERSION msize %u version %.*s\n", new_msize, > received->size, received->data); > @@ -76,6 +97,10 @@ struct uk_9preq *uk_9p_version(struct uk_9pdev *dev, > uk_pr_debug("Invalid new message size.\n"); > > return req; > + > +free: > + uk_9pdev_req_remove(dev, req); > + return ERR2PTR(rc); > } > > struct uk_9pfid *uk_9p_attach(struct uk_9pdev *dev, uint32_t afid, > @@ -94,43 +119,56 @@ struct uk_9pfid *uk_9p_attach(struct uk_9pdev *dev, > uint32_t afid, > if (PTRISERR(fid)) > return fid; > > - uk_pr_debug("TATTACH fid %u afid %u uname %s aname %s n_uname %u\n", > - fid->fid, afid, uname, aname, n_uname); > - > - req = uk_9pdev_call(dev, UK_9P_TATTACH, __PAGE_SIZE, "ddssd", > - fid->fid, afid, &uname_str, &aname_str, n_uname); > + req = uk_9pdev_req_create(dev, UK_9P_TATTACH, __PAGE_SIZE); > if (PTRISERR(req)) { > uk_9pdev_fid_release(fid); > return (void *)req; > } > > - rc = uk_9preq_deserialize(req, "Q", &fid->qid); > + uk_pr_debug("TATTACH fid %u afid %u uname %s aname %s n_uname %u\n", > + fid->fid, afid, uname, aname, n_uname); > + > + rc = 0; > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = uk_9preq_write32(req, afid)) || > + (rc = uk_9preq_writestr(req, &uname_str)) || > + (rc = uk_9preq_writestr(req, &aname_str)) || > + (rc = uk_9preq_write32(req, n_uname)) || > + (rc = send_and_wait_no_zc(dev, req)) || > + (rc = uk_9preq_readqid(req, &fid->qid))) > + goto free; > + > uk_9pdev_req_remove(dev, req); > > uk_pr_debug("RATTACH qid type %u version %u path %lu\n", > fid->qid.type, fid->qid.version, fid->qid.path); > > - if (rc < 0) { > - uk_9pdev_fid_release(fid); > - return ERR2PTR(rc); > - } > - > return fid; > + > +free: > + uk_9pdev_fid_release(fid); > + uk_9pdev_req_remove(dev, req); > + return ERR2PTR(rc); > } > > int uk_9p_flush(struct uk_9pdev *dev, uint16_t oldtag) > { > struct uk_9preq *req; > + int rc = 0; > > - uk_pr_debug("TFLUSH oldtag %u\n", oldtag); > - req = uk_9pdev_call(dev, UK_9P_TFLUSH, __PAGE_SIZE, "w", oldtag); > + req = uk_9pdev_req_create(dev, UK_9P_TFLUSH, __PAGE_SIZE); > if (PTRISERR(req)) > return PTR2ERR(req); > > + uk_pr_debug("TFLUSH oldtag %u\n", oldtag); > + if ((rc = uk_9preq_write16(req, oldtag)) || > + (rc = send_and_wait_no_zc(dev, req))) > + goto out; > uk_pr_debug("RFLUSH\n"); > - uk_9pdev_req_remove(dev, req); > > - return 0; > +out: > + uk_9pdev_req_remove(dev, req); > + return rc; > } > > struct uk_9pfid *uk_9p_walk(struct uk_9pdev *dev, struct uk_9pfid *fid, > @@ -141,7 +179,7 @@ struct uk_9pfid *uk_9p_walk(struct uk_9pdev *dev, struct > uk_9pfid *fid, > struct uk_9p_str name_str; > uint16_t nwqid; > uint16_t nwname; > - int rc; > + int rc = 0; > > uk_9p_str_init(&name_str, name); > > @@ -151,51 +189,56 @@ struct uk_9pfid *uk_9p_walk(struct uk_9pdev *dev, > struct uk_9pfid *fid, > > nwname = name ? 1 : 0; > > + req = uk_9pdev_req_create(dev, UK_9P_TWALK, __PAGE_SIZE); > + if (PTRISERR(req)) { > + rc = PTR2ERR(req); > + goto out; > + } > + > if (name) { > uk_pr_debug("TWALK fid %u newfid %u nwname %d name %s\n", > fid->fid, newfid->fid, nwname, name); > - req = uk_9pdev_call(dev, UK_9P_TWALK, __PAGE_SIZE, "ddws", > - fid->fid, newfid->fid, nwname, &name_str); > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = uk_9preq_write32(req, newfid->fid)) || > + (rc = uk_9preq_write16(req, nwname)) || > + (rc = uk_9preq_writestr(req, &name_str))) > + goto out; > } else { > uk_pr_debug("TWALK fid %u newfid %u nwname %d\n", > fid->fid, newfid->fid, nwname); > - req = uk_9pdev_call(dev, UK_9P_TWALK, __PAGE_SIZE, "ddw", > - fid->fid, newfid->fid, nwname); > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = uk_9preq_write32(req, newfid->fid)) || > + (rc = uk_9preq_write16(req, nwname))) > + goto out; > } > > - if (PTRISERR(req)) { > + if ((rc = send_and_wait_no_zc(dev, req))) { > /* > * Don't clunk if request has finished with error, as the fid > * is invalid. > */ > newfid->was_removed = 1; > - rc = PTR2ERR(req); > goto out; > } > > - rc = uk_9preq_deserialize(req, "w", &nwqid); > - if (rc < 0) > - goto out_req; > + if ((rc = uk_9preq_read16(req, &nwqid))) > + goto out; > > uk_pr_debug("RWALK nwqid %u\n", nwqid); > > if (nwqid != nwname) { > rc = -ENOENT; > - goto out_req; > + goto out; > } > > - > if (nwname) { > - rc = uk_9preq_deserialize(req, "Q", &newfid->qid); > - if (rc < 0) > - goto out_req; > + if ((rc = uk_9preq_readqid(req, &newfid->qid))) > + goto out; > } else > newfid->qid = fid->qid; > > - rc = 0; > -out_req: > - uk_9pdev_req_remove(dev, req); > out: > + uk_9pdev_req_remove(dev, req); > if (rc) { > uk_9pdev_fid_release(newfid); > return ERR2PTR(rc); > @@ -207,22 +250,27 @@ out: > int uk_9p_open(struct uk_9pdev *dev, struct uk_9pfid *fid, uint8_t mode) > { > struct uk_9preq *req; > - int rc; > - > - uk_pr_debug("TOPEN fid %u mode %u\n", fid->fid, mode); > + int rc = 0; > > - req = uk_9pdev_call(dev, UK_9P_TOPEN, __PAGE_SIZE, "db", > - fid->fid, mode); > + req = uk_9pdev_req_create(dev, UK_9P_TOPEN, __PAGE_SIZE); > if (PTRISERR(req)) > return PTR2ERR(req); > > - rc = uk_9preq_deserialize(req, "Qd", &fid->qid, &fid->iounit); > - uk_9pdev_req_remove(dev, req); > + uk_pr_debug("TOPEN fid %u mode %u\n", fid->fid, mode); > + > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = uk_9preq_write8(req, mode)) || > + (rc = send_and_wait_no_zc(dev, req)) || > + (rc = uk_9preq_readqid(req, &fid->qid)) || > + (rc = uk_9preq_read32(req, &fid->iounit))) > + goto out; > > uk_pr_debug("ROPEN qid type %u version %u path %lu iounit %u\n", > fid->qid.type, fid->qid.version, fid->qid.path, > fid->iounit); > > +out: > + uk_9pdev_req_remove(dev, req); > return rc; > } > > @@ -233,63 +281,80 @@ int uk_9p_create(struct uk_9pdev *dev, struct uk_9pfid > *fid, > struct uk_9preq *req; > struct uk_9p_str name_str; > struct uk_9p_str extension_str; > - int rc; > + int rc = 0; > > uk_9p_str_init(&name_str, name); > uk_9p_str_init(&extension_str, extension); > > - uk_pr_debug("TCREATE fid %u name %s perm %u mode %u ext %s\n", > - fid->fid, name, perm, mode, extension); > - > - req = uk_9pdev_call(dev, UK_9P_TCREATE, __PAGE_SIZE, "dsdbs", > - fid->fid, &name_str, perm, mode, &extension_str); > + req = uk_9pdev_req_create(dev, UK_9P_TCREATE, __PAGE_SIZE); > if (PTRISERR(req)) > return PTR2ERR(req); > > - rc = uk_9preq_deserialize(req, "Qd", &fid->qid, &fid->iounit); > - uk_9pdev_req_remove(dev, req); > + uk_pr_debug("TOPEN fid %u mode %u\n", fid->fid, mode); > + > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = uk_9preq_writestr(req, &name_str)) || > + (rc = uk_9preq_write32(req, perm)) || > + (rc = uk_9preq_write8(req, mode)) || > + (rc = uk_9preq_writestr(req, &extension_str)) || > + (rc = send_and_wait_no_zc(dev, req)) || > + (rc = uk_9preq_readqid(req, &fid->qid)) || > + (rc = uk_9preq_read32(req, &fid->iounit))) > + goto out; > > uk_pr_debug("RCREATE qid type %u version %u path %lu iounit %u\n", > fid->qid.type, fid->qid.version, fid->qid.path, > fid->iounit); > > +out: > + uk_9pdev_req_remove(dev, req); > return rc; > } > > int uk_9p_remove(struct uk_9pdev *dev, struct uk_9pfid *fid) > { > struct uk_9preq *req; > + int rc = 0; > > /* The fid is considered invalid even if the remove fails. */ > fid->was_removed = 1; > > - uk_pr_debug("TREMOVE fid %u\n", fid->fid); > - req = uk_9pdev_call(dev, UK_9P_TREMOVE, __PAGE_SIZE, "d", fid->fid); > + req = uk_9pdev_req_create(dev, UK_9P_TREMOVE, __PAGE_SIZE); > if (PTRISERR(req)) > return PTR2ERR(req); > > - uk_9pdev_req_remove(dev, req); > + uk_pr_debug("TREMOVE fid %u\n", fid->fid); > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = send_and_wait_no_zc(dev, req))) > + goto out; > uk_pr_debug("RREMOVE\n"); > > - return 0; > +out: > + uk_9pdev_req_remove(dev, req); > + return rc; > } > > int uk_9p_clunk(struct uk_9pdev *dev, struct uk_9pfid *fid) > { > struct uk_9preq *req; > + int rc = 0; > > if (fid->was_removed) > return 0; > > - uk_pr_debug("TCLUNK fid %u\n", fid->fid); > - req = uk_9pdev_call(dev, UK_9P_TCLUNK, __PAGE_SIZE, "d", fid->fid); > + req = uk_9pdev_req_create(dev, UK_9P_TCLUNK, __PAGE_SIZE); > if (PTRISERR(req)) > return PTR2ERR(req); > > - uk_9pdev_req_remove(dev, req); > + uk_pr_debug("TCLUNK fid %u\n", fid->fid); > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = send_and_wait_no_zc(dev, req))) > + goto out; > uk_pr_debug("RCLUNK\n"); > > - return 0; > +out: > + uk_9pdev_req_remove(dev, req); > + return rc; > } > > int64_t uk_9p_read(struct uk_9pdev *dev, struct uk_9pfid *fid, > @@ -309,24 +374,12 @@ int64_t uk_9p_read(struct uk_9pdev *dev, struct > uk_9pfid *fid, > if (PTRISERR(req)) > return PTR2ERR(req); > > - rc = uk_9preq_serialize(req, "dqd", fid->fid, offset, count); > - if (rc < 0) > - goto out; > - > - rc = uk_9preq_ready(req, UK_9PREQ_ZCDIR_READ, buf, count, 11); > - if (rc < 0) > - goto out; > - > - rc = uk_9pdev_request(dev, req); > - if (rc < 0) > - goto out; > - > - rc = uk_9preq_waitreply(req); > - if (rc < 0) > - goto out; > - > - rc = uk_9preq_deserialize(req, "d", &count); > - if (rc < 0) > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = uk_9preq_write64(req, offset)) || > + (rc = uk_9preq_write32(req, count)) || > + (rc = send_and_wait_zc(dev, req, UK_9PREQ_ZCDIR_READ, buf, > + count, 11)) || > + (rc = uk_9preq_read32(req, &count))) > goto out; > > uk_pr_debug("RREAD count %u\n", count); > @@ -353,24 +406,12 @@ int64_t uk_9p_write(struct uk_9pdev *dev, struct > uk_9pfid *fid, > if (PTRISERR(req)) > return PTR2ERR(req); > > - rc = uk_9preq_serialize(req, "dqd", fid->fid, offset, count); > - if (rc < 0) > - goto out; > - > - rc = uk_9preq_ready(req, UK_9PREQ_ZCDIR_WRITE, (void *)buf, count, 23); > - if (rc < 0) > - goto out; > - > - rc = uk_9pdev_request(dev, req); > - if (rc < 0) > - goto out; > - > - rc = uk_9preq_waitreply(req); > - if (rc < 0) > - goto out; > - > - rc = uk_9preq_deserialize(req, "d", &count); > - if (rc < 0) > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = uk_9preq_write64(req, offset)) || > + (rc = uk_9preq_write32(req, count)) || > + (rc = send_and_wait_zc(dev, req, UK_9PREQ_ZCDIR_WRITE, > + (void *)buf, count, 23)) || > + (rc = uk_9preq_read32(req, &count))) > goto out; > > uk_pr_debug("RWRITE count %u\n", count); > @@ -386,45 +427,58 @@ struct uk_9preq *uk_9p_stat(struct uk_9pdev *dev, > struct uk_9pfid *fid, > struct uk_9p_stat *stat) > { > struct uk_9preq *req; > - int rc; > + int rc = 0; > uint16_t dummy; > > - uk_pr_debug("TSTAT fid %u\n", fid->fid); > - req = uk_9pdev_call(dev, UK_9P_TSTAT, __PAGE_SIZE, "d", fid->fid); > + req = uk_9pdev_req_create(dev, UK_9P_TSTAT, __PAGE_SIZE); > if (PTRISERR(req)) > return req; > > - rc = uk_9preq_deserialize(req, "wS", &dummy, stat); > - if (rc) > - return ERR2PTR(rc); > + uk_pr_debug("TSTAT fid %u\n", fid->fid); > + > + if ((rc = uk_9preq_write32(req, fid->fid)) || > + (rc = send_and_wait_no_zc(dev, req)) || > + (rc = uk_9preq_read16(req, &dummy)) || > + (rc = uk_9preq_readstat(req, stat))) > + goto out; > + > uk_pr_debug("RSTAT\n"); > > return req; > + > +out: > + uk_9pdev_req_remove(dev, req); > + return ERR2PTR(rc); > } > > int uk_9p_wstat(struct uk_9pdev *dev, struct uk_9pfid *fid, > struct uk_9p_stat *stat) > { > struct uk_9preq *req; > + int rc = 0; > + uint16_t *dummy; > > - /* > - * The packed size of stat is 61 bytes + the size occupied by the > - * strings. > - */ > - stat->size = 61; > - stat->size += stat->name.size; > - stat->size += stat->uid.size; > - stat->size += stat->gid.size; > - stat->size += stat->muid.size; > - stat->size += stat->extension.size; > - > - uk_pr_debug("TWSTAT fid %u\n", fid->fid); > - req = uk_9pdev_call(dev, UK_9P_TWSTAT, __PAGE_SIZE, "dwS", fid->fid, > - stat->size + 2, stat); > + req = uk_9pdev_req_create(dev, UK_9P_TWSTAT, __PAGE_SIZE); > if (PTRISERR(req)) > return PTR2ERR(req); > - uk_9pdev_req_remove(dev, req); > - uk_pr_debug("RWSTAT"); > > - return 0; > + uk_pr_debug("TWSTAT fid %u\n", fid->fid); > + > + if ((rc = uk_9preq_write32(req, fid->fid))) > + goto out; > + > + dummy = (uint16_t *)(req->xmit.buf + req->xmit.offset); > + if ((rc = uk_9preq_write16(req, 0)) || > + (rc = uk_9preq_writestat(req, stat))) > + goto out; > + *dummy = stat->size + 2; > + > + if ((rc = send_and_wait_no_zc(dev, req))) > + goto out; > + > + uk_pr_debug("RWSTAT\n"); > + > +out: > + uk_9pdev_req_remove(dev, req); > + return rc; > } > diff --git a/lib/uk9p/9preq.c b/lib/uk9p/9preq.c > index 0fc4b1e..8d787e7 100644 > --- a/lib/uk9p/9preq.c > +++ b/lib/uk9p/9preq.c > @@ -434,10 +434,8 @@ int uk_9preq_ready(struct uk_9preq *req, enum > uk_9preq_zcdir zc_dir, > > UK_ASSERT(req); > > - if (UK_READ_ONCE(req->state) != UK_9PREQ_INITIALIZED) { > - rc = -EIO; > - goto out; > - } > + if (UK_READ_ONCE(req->state) != UK_9PREQ_INITIALIZED) > + return -EIO; > > /* Save current offset as the size of the message. */ > total_size = req->xmit.offset; > @@ -448,10 +446,10 @@ int uk_9preq_ready(struct uk_9preq *req, enum > uk_9preq_zcdir zc_dir, > > /* Serialize the header. */ > req->xmit.offset = 0; > - rc = uk_9preq_serialize(req, "dbw", total_size_with_zc, req->xmit.type, > - req->tag); > - if (rc < 0) > - goto out; > + if ((rc = uk_9preq_write32(req, total_size_with_zc)) < 0 || > + (rc = uk_9preq_write8(req, req->xmit.type)) < 0 || > + (rc = uk_9preq_write16(req, req->tag)) < 0) > + return rc; > > /* Reset offset and size to sane values. */ > req->xmit.offset = 0; > @@ -474,8 +472,7 @@ int uk_9preq_ready(struct uk_9preq *req, enum > uk_9preq_zcdir zc_dir, > /* Update the state. */ > UK_WRITE_ONCE(req->state, UK_9PREQ_READY); > > -out: > - return rc; > + return 0; > } > > int uk_9preq_receive_cb(struct uk_9preq *req, uint32_t recv_size) > @@ -495,8 +492,10 @@ int uk_9preq_receive_cb(struct uk_9preq *req, uint32_t > recv_size) > /* Deserialize the header into request fields. */ > req->recv.offset = 0; > req->recv.size = recv_size; > - rc = _fcall_deserialize(&req->recv, "dbw", &size, > - &req->recv.type, &tag); > + if ((rc = uk_9preq_read32(req, &size)) < 0 || > + (rc = uk_9preq_read8(req, &req->recv.type)) < 0 || > + (rc = uk_9preq_read16(req, &tag)) < 0) > + return rc; > > /* Check sanity of deserialized values. */ > if (rc < 0) > @@ -557,8 +556,8 @@ int uk_9preq_error(struct uk_9preq *req) > */ > UK_BUGON(req->recv.offset != UK_9P_HEADER_SIZE); > > - rc = uk_9preq_deserialize(req, "sd", &error, &errcode); > - if (rc < 0) > + if ((rc = uk_9preq_readstr(req, &error)) < 0 || > + (rc = uk_9preq_read32(req, &errcode)) < 0) > return rc; > > uk_pr_debug("RERROR %.*s %d\n", error.size, error.data, errcode); >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |