From: Christian Schoenebeck <qemu_oss@crudebyte.com>
To: qemu-devel@nongnu.org
Cc: "Nikita Ivanov" <nivanov@cloudlinux.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Greg Kurz" <groug@kaod.org>, "Jason Wang" <jasowang@redhat.com>,
"Michael Roth" <michael.roth@amd.com>,
"Konstantin Kostiuk" <kkostiuk@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>
Subject: Re: [PATCH] error handling: Use TFR() macro where applicable
Date: Mon, 08 Aug 2022 14:52:28 +0200 [thread overview]
Message-ID: <3206015.kY3CcG7ZbH@silver> (raw)
In-Reply-To: <877d3jupln.fsf@pond.sub.org>
On Montag, 8. August 2022 10:05:56 CEST Markus Armbruster wrote:
> Nikita Ivanov <nivanov@cloudlinux.com> writes:
> > Summing up the discussion above, I suggest the following patch for TFR()
> > macro refactoring. (The patch is sequential to the first one I introduced
> > in the start of the discussion).
> >
> >>From 6318bee052900aa93bba6620b53c7cb2290e5001 Mon Sep 17 00:00:00 2001
> >>
> > From: Nikita Ivanov <nivanov@cloudlinux.com>
> > Date: Mon, 8 Aug 2022 09:30:34 +0300
> > Subject: [PATCH] Refactoring: rename TFR() to TEMP_FAILURE_RETRY()
> >
> > glibc's unistd.h header provides the same macro with the
> > subtle difference in type casting. Adjust macro name to the
> > common standard and define conditionally.
> >
> > Signed-off-by: Nikita Ivanov <nivanov@cloudlinux.com>
> > ---
> >
> > chardev/char-fd.c | 2 +-
> > chardev/char-pipe.c | 12 +++++++++---
> > hw/9pfs/9p-local.c | 6 ++++--
> > include/qemu/osdep.h | 6 ++++--
> > net/l2tpv3.c | 8 +++++---
> > net/tap-linux.c | 2 +-
> > net/tap.c | 10 ++++++----
> > os-posix.c | 2 +-
> > qga/commands-posix.c | 2 +-
> > tests/qtest/libqtest.c | 2 +-
> > util/main-loop.c | 2 +-
> > util/osdep.c | 2 +-
> > 12 files changed, 35 insertions(+), 21 deletions(-)
> >
> > diff --git a/chardev/char-fd.c b/chardev/char-fd.c
> > index cf78454841..7f5ed9aba3 100644
> > --- a/chardev/char-fd.c
> > +++ b/chardev/char-fd.c
> > @@ -198,7 +198,7 @@ int qmp_chardev_open_file_source(char *src, int flags,
> > Error **errp)
> >
> > {
> >
> > int fd = -1;
> >
> > - TFR(fd = qemu_open_old(src, flags, 0666));
> > + TEMP_FAILURE_RETRY(fd = qemu_open_old(src, flags, 0666));
> >
> > if (fd == -1) {
> >
> > error_setg_file_open(errp, errno, src);
> >
> > }
> >
> > diff --git a/chardev/char-pipe.c b/chardev/char-pipe.c
> > index 66d3b85091..aed97e306b 100644
> > --- a/chardev/char-pipe.c
> > +++ b/chardev/char-pipe.c
> > @@ -131,8 +131,12 @@ static void qemu_chr_open_pipe(Chardev *chr,
> >
> > filename_in = g_strdup_printf("%s.in", filename);
> > filename_out = g_strdup_printf("%s.out", filename);
> >
> > - TFR(fd_in = qemu_open_old(filename_in, O_RDWR | O_BINARY));
> > - TFR(fd_out = qemu_open_old(filename_out, O_RDWR | O_BINARY));
> > + TEMP_FAILURE_RETRY(
> > + fd_in = qemu_open_old(filename_in, O_RDWR | O_BINARY)
> > + );
> > + TEMP_FAILURE_RETRY(
> > + fd_out = qemu_open_old(filename_out, O_RDWR | O_BINARY)
> > + );
>
> Style question: do we want the ");" on its own line? I think we
> generally don't do that for function and function-like macro calls.
So far scripts/checkpatch.pl doesn't complain, therefore I used this code
style in QEMU before.
BTW, another exotic function call code style (not being compalained about yet)
in approach:
https://lore.kernel.org/qemu-devel/E1oDQqv-0003d4-Hm@lizzy.crudebyte.com/
> > g_free(filename_in);
> > g_free(filename_out);
> > if (fd_in < 0 || fd_out < 0) {
> >
> > @@ -142,7 +146,9 @@ static void qemu_chr_open_pipe(Chardev *chr,
> >
> > if (fd_out >= 0) {
> >
> > close(fd_out);
> >
> > }
> >
> > - TFR(fd_in = fd_out = qemu_open_old(filename, O_RDWR | O_BINARY));
> > + TEMP_FAILURE_RETRY(
> > + fd_in = fd_out = qemu_open_old(filename, O_RDWR | O_BINARY)
> > + );
> >
> > if (fd_in < 0) {
> >
> > error_setg_file_open(errp, errno, filename);
> > return;
> >
> > diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
> > index c90ab947ba..e803c05d0c 100644
> > --- a/hw/9pfs/9p-local.c
> > +++ b/hw/9pfs/9p-local.c
> > @@ -470,7 +470,7 @@ static ssize_t local_readlink(FsContext *fs_ctx,
> > V9fsPath *fs_path,
> >
> > if (fd == -1) {
> >
> > return -1;
> >
> > }
> >
> > - TFR(tsize = read(fd, (void *)buf, bufsz));
> > + TEMP_FAILURE_RETRY(tsize = read(fd, (void *)buf, bufsz));
> >
> > close_preserve_errno(fd);
> >
> > } else if ((fs_ctx->export_flags & V9FS_SM_PASSTHROUGH) ||
> >
> > (fs_ctx->export_flags & V9FS_SM_NONE)) {
> >
> > @@ -906,7 +906,9 @@ static int local_symlink(FsContext *fs_ctx, const char
> > *oldpath,
> >
> > }
> > /* Write the oldpath (target) to the file. */
> > oldpath_size = strlen(oldpath);
> >
> > - TFR(write_size = write(fd, (void *)oldpath, oldpath_size));
> > + TEMP_FAILURE_RETRY(
> > + write_size = write(fd, (void *)oldpath, oldpath_size)
> > + );
> >
> > close_preserve_errno(fd);
> >
> > if (write_size != oldpath_size) {
> >
> > diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
> > index b1c161c035..55f2927d8b 100644
> > --- a/include/qemu/osdep.h
> > +++ b/include/qemu/osdep.h
> > @@ -242,8 +242,10 @@ void QEMU_ERROR("code path is reachable")
> >
> > #if !defined(ESHUTDOWN)
> > #define ESHUTDOWN 4099
> > #endif
> >
> > -
> > -#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
> > +#if !defined(TEMP_FAILURE_RETRY)
> > +#define TEMP_FAILURE_RETRY(expr) \
> > + do { if ((expr) != -1) break; } while (errno == EINTR)
> > +#endif
>
> GLibc's version is
>
> # define TEMP_FAILURE_RETRY(expression) \
> (__extension__
\
> ({ long int __result;
\
> do __result = (long int) (expression);
\
> while (__result == -1L && errno == EINTR);
\
> __result; }))
>
> The difference isn't just "type casting", it's also statement
> vs. expression.
>
> Is it a good idea to have the macro expand into a statement on some
> hosts, and into an expression on others? Sure, CI should catch any uses
> as expression, but delaying compile errors to CI wastes developer time.
For consistency and simplicity, I would define exactly one version (no ifdefs)
of the macro with a different macro name than glibc's TEMP_FAILURE_RETRY(),
and use that QEMU specific macro name in QEMU code everywhere.
As for statement vs. expression: The only advantage of the statement version
is if you'd need __result as an rvalue, which is not needed ATM, right? So I
would go for the expression version (with cast) for now.
The glibc history does not reveal why they chose the statement version.
Best regards,
Christian Schoenebeck
next prev parent reply other threads:[~2022-08-08 12:55 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-04 7:25 [PATCH] error handling: Use TFR() macro where applicable Nikita Ivanov
2022-08-05 11:10 ` Christian Schoenebeck
2022-08-05 11:18 ` Marc-André Lureau
2022-08-05 11:40 ` Peter Maydell
2022-08-08 7:19 ` Nikita Ivanov
2022-08-08 8:05 ` Markus Armbruster
2022-08-08 8:27 ` Nikita Ivanov
2022-08-08 12:52 ` Christian Schoenebeck [this message]
2022-08-08 13:11 ` Christian Schoenebeck
2022-08-08 14:22 ` Markus Armbruster
2022-08-08 18:00 ` Nikita Ivanov
2022-08-08 18:03 ` Nikita Ivanov
2022-08-17 14:06 ` Nikita Ivanov
2022-08-17 14:16 ` Peter Maydell
2022-08-17 14:49 ` Nikita Ivanov
2022-08-17 15:55 ` Peter Maydell
2022-08-18 14:07 ` Christian Schoenebeck
2022-08-18 14:11 ` Peter Maydell
2022-10-07 11:44 ` Nikita Ivanov
2022-10-07 14:50 ` Christian Schoenebeck
2022-10-07 15:32 ` Peter Maydell
2022-10-10 8:33 ` Nikita Ivanov
2022-10-10 9:56 ` Peter Maydell
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=3206015.kY3CcG7ZbH@silver \
--to=qemu_oss@crudebyte.com \
--cc=armbru@redhat.com \
--cc=groug@kaod.org \
--cc=jasowang@redhat.com \
--cc=kkostiuk@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=michael.roth@amd.com \
--cc=nivanov@cloudlinux.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).