From: Christian Schoenebeck <qemu_oss@crudebyte.com>
To: qemu-devel@nongnu.org
Cc: Greg Kurz <groug@kaod.org>
Subject: Re: [PATCH 3/3] 9pfs: Improve unreclaim loop
Date: Thu, 21 Jan 2021 18:02:05 +0100 [thread overview]
Message-ID: <2741984.nYWCrkLCat@silver> (raw)
In-Reply-To: <20210121173455.45cbe7a7@bahia.lan>
On Donnerstag, 21. Januar 2021 17:34:55 CET Greg Kurz wrote:
> > > +
> > > + /*
> > > + * v9fs_reopen_fid() can yield : a reference on the fid must be
> > > held
> > > + * to ensure its pointer remains valid and we can safely pass it to
> > > + * QSIMPLEQ_NEXT(). The corresponding put_fid() can also yield so
> > > + * we must keep a reference on the next fid as well. So the logic
> > > here
> > > + * is to get a reference on a fid and only put it back during the
> > > next
> > > + * iteration after we could get a reference on the next fid. Start
> > > with + * the first one.
> > > + */
> > > + for (fidp->ref++; fidp; fidp = fidp_next) {
> > > + if (fidp->path.size == path->size &&
> > > + !memcmp(fidp->path.data, path->data, path->size)) {
> > >
> > > /* Mark the fid non reclaimable. */
> > > fidp->flags |= FID_NON_RECLAIMABLE;
> > >
> > > /* reopen the file/dir if already closed */
> > > err = v9fs_reopen_fid(pdu, fidp);
> > > if (err < 0) {
> > >
> > > + put_fid(pdu, fidp);
> > >
> > > return err;
> > >
> > > }
> > >
> > > + }
> > > +
> > > + fidp_next = QSIMPLEQ_NEXT(fidp, next);
> > > +
> > > + if (fidp_next) {
> > >
> > > /*
> > >
> > > - * Go back to head of fid list because
> > > - * the list could have got updated when
> > > - * switched to the worker thread
> > > + * Ensure the next fid survives a potential clunk request
> > > during + * put_fid() below and v9fs_reopen_fid() in the next
> > > iteration. */
> > > - if (err == 0) {
> > > - goto again;
> > > - }
> > > + fidp_next->ref++;
> >
> > Mmm, that works as intended if fidp_next matches the requested path.
> > However if it is not (like it would in the majority of cases) then the
> > loop breaks next and the bumped reference count would never be reverted.
> > Or am I missing something here?
>
> Each iteration of the loop starts with an already referenced fidp.
>
> The loop can only break if:
>
> - v9fs_reopen_fid() fails, in which case put_fid(pdu, fidp) is called
> on the error path above
> - end of list is reached, in which case the reference on fidp is
> dropped just like in all previous iterations...
Ah yes, you're right. It's fine!
So just the assert(fidp); change then, and the log comment fixes would be
nice to have. ;-) That's it.
> > > }
> > >
> > > +
> > > + /* We're done with this fid */
> > > + put_fid(pdu, fidp);
>
> ... here.
>
> > > }
> > >
> > > +
> > >
> > > return 0;
> > >
> > > }
> >
> > Best regards,
> > Christian Schoenebeck
Best regards,
Christian Schoenebeck
next prev parent reply other threads:[~2021-01-21 17:15 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-18 14:22 [PATCH 0/3] 9pfs: Improve unreclaim logic Greg Kurz
2021-01-18 14:22 ` [PATCH 1/3] 9pfs: Convert V9fsFidState::clunked to bool Greg Kurz
2021-01-18 14:42 ` Christian Schoenebeck
2021-01-18 14:22 ` [PATCH 2/3] 9pfs: Convert V9fsFidState::fid_list to QSIMPLEQ Greg Kurz
2021-01-19 13:31 ` Christian Schoenebeck
2021-01-19 14:34 ` Greg Kurz
2021-01-19 15:28 ` Christian Schoenebeck
2021-01-19 17:23 ` Greg Kurz
2021-01-18 14:23 ` [PATCH 3/3] 9pfs: Improve unreclaim loop Greg Kurz
2021-01-21 12:50 ` Christian Schoenebeck
2021-01-21 16:34 ` Greg Kurz
2021-01-21 17:02 ` Christian Schoenebeck [this message]
2021-01-21 17:05 ` [PATCH 0/3] 9pfs: Improve unreclaim logic Greg Kurz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2741984.nYWCrkLCat@silver \
--to=qemu_oss@crudebyte.com \
--cc=groug@kaod.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.