[PATCH 3/4] vircommand: Make sysconf(_SC_OPEN_MAX) failure non-fatal

Daniel P. Berrangé berrange at redhat.com
Tue Aug 29 15:20:55 UTC 2023


On Tue, Aug 29, 2023 at 05:13:08PM +0200, Michal Privoznik wrote:
> The point of calling sysconf(_SC_OPEN_MAX) is to allocate big
> enough bitmap so that subsequent call to
> virCommandMassCloseGetFDsDir() can just set the bit instead of
> expanding memory (this code runs in a forked off child and thus
> using async-signal-unsafe functions like malloc() is a bit
> tricky).
> 
> But on some systems the limit for opened FDs is virtually
> non-existent (typically macOS Ventura started reporting EINVAL).
> 
> But with both glibc and musl using malloc() after fork() is safe.
> And with sufficiently new glib too, as it's using malloc() with
> newer releases instead of their own allocator.
> 
> Therefore, pick a sufficiently large value (glibc falls back to
> 256, [1], so 1024 should be good enough) to fall back to and make
> the error non-fatal.

That's not suitable for macOS. THey have a constant OPEN_MAX we
should be using that is way bigger than 1024.

> 
> 1: https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/getdtsz.c;h=4c5a6208067d2f9eaaac6dba652702fb4af9b7e3;hb=HEAD
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/util/vircommand.c | 8 +++-----
>  1 file changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/src/util/vircommand.c b/src/util/vircommand.c
> index 822b9487f9..8c06e19723 100644
> --- a/src/util/vircommand.c
> +++ b/src/util/vircommand.c
> @@ -500,7 +500,7 @@ virCommandMassCloseGetFDsDir(virBitmap *fds,
>              return -1;
>          }
>  
> -        ignore_value(virBitmapSetBit(fds, fd));
> +        virBitmapSetBitExpand(fds, fd);
>      }
>  
>      if (rc < 0)
> @@ -544,10 +544,8 @@ virCommandMassCloseFrom(virCommand *cmd,
>       * Therefore we can safely allocate memory here (and transitively call
>       * opendir/readdir) without a deadlock. */
>  
> -    if (openmax < 0) {
> -        virReportSystemError(errno, "%s", _("sysconf(_SC_OPEN_MAX) failed"));
> -        return -1;
> -    }
> +    if (openmax <= 0)
> +        openmax = 1024;
>  
>      fds = virBitmapNew(openmax);
>  
> -- 
> 2.41.0
> 

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 :|


More information about the libvir-list mailing list