From: "Daniel P. Berrangé" <berrange@redhat.com>
To: "Philippe Mathieu-Daudé" <philmd@linaro.org>
Cc: "Clément Léger" <cleger@rivosinc.com>,
"Michael Tokarev" <mjt@tls.msk.ru>,
"Paolo Bonzini" <pbonzini@redhat.com>,
qemu-devel@nongnu.org,
"Richard Henderson" <richard.henderson@linaro.org>
Subject: Re: [PATCH 2/2] qemu/osdep: handle sysconf(_SC_OPEN_MAX) return value == -1
Date: Tue, 3 Sep 2024 16:21:16 +0100 [thread overview]
Message-ID: <ZtcpbNx0SAzzW0Ta@redhat.com> (raw)
In-Reply-To: <b9b574e7-11de-4f04-a84f-40b9ffac986c@linaro.org>
On Tue, Sep 03, 2024 at 05:02:44PM +0200, Philippe Mathieu-Daudé wrote:
> On 3/9/24 15:37, Clément Léger wrote:
> > On 03/09/2024 15:34, Philippe Mathieu-Daudé wrote:
> > > On 3/9/24 09:53, Clément Léger wrote:
> > > > On 02/09/2024 21:38, Philippe Mathieu-Daudé wrote:
> > > > > On 30/8/24 13:57, Clément Léger wrote:
> > > > > > On 30/08/2024 13:31, Michael Tokarev wrote:
> > > > > > > 30.08.2024 14:14, Clément Léger wrote:
> > > > > > > > On some systems (MacOS for instance), sysconf(_SC_OPEN_MAX) can
> > > > > > > > return
> > > > > > > > -1. In that case we should fallback to using the OPEN_MAX define.
> > > > > > > > According to "man sysconf", the OPEN_MAX define should be present and
> > > > > > > > provided by either unistd.h and/or limits.h so include them for that
> > > > > > > > purpose. For other OSes, just assume a maximum of 1024 files
> > > > > > > > descriptors
> > > > > > > > as a fallback.
> > > > > > > >
> > > > > > > > Fixes: 4ec5ebea078e ("qemu/osdep: Move close_all_open_fds() to oslib-
> > > > > > > > posix")
> > > > > > > > Reported-by: Daniel P. Berrangé <berrange@redhat.com>
> > > > > > > > Signed-off-by: Clément Léger <cleger@rivosinc.com>
> > > > > > >
> > > > > > > Reviewed-by: Michael Tokarev <mjt@tls.msk.ru>
> > > > > > >
> > > > > > > > @@ -928,6 +933,13 @@ static void
> > > > > > > > qemu_close_all_open_fd_fallback(const
> > > > > > > > int *skip, unsigned int nskip,
> > > > > > > > void qemu_close_all_open_fd(const int *skip, unsigned int nskip)
> > > > > > > > {
> > > > > > > > int open_max = sysconf(_SC_OPEN_MAX);
> > > > > > > > + if (open_max == -1) {
> > > > > > > > +#ifdef CONFIG_DARWIN
> > > > > > > > + open_max = OPEN_MAX;
> > > > >
> > > > > Missing errno check.
> > > >
> > > > man sysconf states that:
> > > >
> > > > "On error, -1 is returned and errno is set to indicate the error (for
> > > > example, EINVAL, indicating that name is invalid)."
> > > >
> > > > So it seems checking for -1 is enough no ? Or were you thinking about
> > > > something else ?
> > >
> > > Mine (macOS 14.6) is:
> > >
> > > RETURN VALUES
> > > If the call to sysconf() is not successful, -1 is returned and
> > > errno is set appropriately. Otherwise, if the variable is
> > > associated with functionality that is not supported, -1 is
> > > returned and errno is not modified. Otherwise, the current
> > > variable value is returned.
> >
> > Which seems to imply the same than mine right ? -1 is always returned in
> > case of error and errno might or not be set. So checking for -1 seems
> > enough to check an error return.
>
> Yes but we can check for the unsupported case. Something like:
>
> long qemu_sysconf(int name, long unsupported_default)
> {
> int current_errno = errno;
> long retval;
>
> retval = sysconf(name);
> if (retval == -1) {
> if (errno == current_errno) {
> return unsupported_default;
> }
> perror("sysconf");
> return -1;
> }
> return retval;
> }
That looks uncessarily complicated, and IMHO makes it less
portable. eg consider macOS behaviour:
"if the variable is associated with functionality that is
not supported, -1 is returned and errno is not modified"
vs Linux documented behaviour:
"If name corresponds to a maximum or minimum limit, and
that limit is indeterminate, -1 is returned and errno
is not changed."
IMHO we should do what Clément already suggested and set a
default anytime retval == -1, and ignore errno. There is
no user benefit from turning errnos into a fatal error
via perror()
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2024-09-03 15:22 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-30 11:14 [PATCH 0/2] oslib: fix OSes support for qemu_close_all_open_fd() Clément Léger
2024-08-30 11:14 ` [PATCH 1/2] qemu/osdep: fix current process fds path for other OSes Clément Léger
2024-08-30 11:16 ` Daniel P. Berrangé
2024-08-30 11:31 ` Michael Tokarev
2024-08-30 11:14 ` [PATCH 2/2] qemu/osdep: handle sysconf(_SC_OPEN_MAX) return value == -1 Clément Léger
2024-08-30 11:18 ` Daniel P. Berrangé
2024-08-30 11:31 ` Michael Tokarev
2024-08-30 11:57 ` Clément Léger
2024-09-02 19:38 ` Philippe Mathieu-Daudé
2024-09-03 7:53 ` Clément Léger
2024-09-03 13:34 ` Philippe Mathieu-Daudé
2024-09-03 13:37 ` Clément Léger
2024-09-03 15:02 ` Philippe Mathieu-Daudé
2024-09-03 15:21 ` Daniel P. Berrangé [this message]
2024-09-03 17:56 ` Philippe Mathieu-Daudé
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=ZtcpbNx0SAzzW0Ta@redhat.com \
--to=berrange@redhat.com \
--cc=cleger@rivosinc.com \
--cc=mjt@tls.msk.ru \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.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.