Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Jun 2012 10:53:01 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        davidxu@freebsd.org
Cc:        Attilio Rao <attilio@freebsd.org>, svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r237660 - head/lib/libc/gen
Message-ID:  <20120628075301.GS2337@deviant.kiev.zoral.com.ua>
In-Reply-To: <4FEBC70F.40408@gmail.com>
References:  <201206272032.q5RKWjvt031174@svn.freebsd.org> <4FEBB8C9.8070006@gmail.com> <CAJ-FndBdpP4hFPyqHaU6GucXeGi3WT4d%2Bpu-9hCNEpAPZAZQgg@mail.gmail.com> <4FEBC0A2.3010708@gmail.com> <CAJ-FndD9Hc_KvHe8vC3usVDZh7MYb51gtXsHgmins8dBC3mu_w@mail.gmail.com> <4FEBC70F.40408@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--YD+BIkcXU0IoTTos
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Thu, Jun 28, 2012 at 10:53:03AM +0800, David Xu wrote:
> On 2012/6/28 10:32, Attilio Rao wrote:
> >2012/6/28, David Xu<listlog2011@gmail.com>:
> >>On 2012/6/28 10:21, Attilio Rao wrote:
> >>>2012/6/28, David Xu<listlog2011@gmail.com>:
> >>>>On 2012/6/28 4:32, Konstantin Belousov wrote:
> >>>>>Author: kib
> >>>>>Date: Wed Jun 27 20:32:45 2012
> >>>>>New Revision: 237660
> >>>>>URL: http://svn.freebsd.org/changeset/base/237660
> >>>>>
> >>>>>Log:
> >>>>>     Optimize the handling of SC_NPROCESSORS_CONF, by using auxv=20
> >>>>>     AT_NCPU
> >>>>>     value if present.
> >>>>>
> >>>>>     MFC after:	1 week
> >>>>>
> >>>>>Modified:
> >>>>>     head/lib/libc/gen/sysconf.c
> >>>>>
> >>>>>Modified: head/lib/libc/gen/sysconf.c
> >>>>>=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D
> >>>>>--- head/lib/libc/gen/sysconf.c	Wed Jun 27 20:24:25 2012 (r237659)
> >>>>>+++ head/lib/libc/gen/sysconf.c	Wed Jun 27 20:32:45 2012 (r237660)
> >>>>>@@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
> >>>>>    #include<sys/resource.h>
> >>>>>    #include<sys/socket.h>
> >>>>>
> >>>>>+#include<elf.h>
> >>>>>    #include<errno.h>
> >>>>>    #include<limits.h>
> >>>>>    #include<paths.h>
> >>>>>@@ -51,6 +52,7 @@ __FBSDID("$FreeBSD$");
> >>>>>
> >>>>>    #include "../stdlib/atexit.h"
> >>>>>    #include "tzfile.h"		/* from=20
> >>>>>    ../../../contrib/tzcode/stdtime */
> >>>>>+#include "libc_private.h"
> >>>>>
> >>>>>    #define	_PATH_ZONEINFO	TZDIR	/* from tzfile.h */
> >>>>>
> >>>>>@@ -585,6 +587,8 @@ yesno:
> >>>>>
> >>>>>    	case _SC_NPROCESSORS_CONF:
> >>>>>    	case _SC_NPROCESSORS_ONLN:
> >>>>>+		if (_elf_aux_info(AT_NCPUS,&value, sizeof(value)) =3D=3D 0)
> >>>>>+			return ((long)value);
> >>>>>    		mib[0] =3D CTL_HW;
> >>>>>    		mib[1] =3D HW_NCPU;
> >>>>>    		break;
> >>>>>
> >>>>Will this make controlling the number of CPU online or CPU hotplug
> >>>>be impossible on FreeBSD ?
> >>>If I think about hotplug CPUs I can think of other 1000
> >>>problems/races/bad situations to be fixed before this one, really.
> >>These are problems only in kernel, but kib's change is about ABI
> >>between userland and kernel, I hope we don't introduce an ABI which
> >>is not extendable road stone.
> >I'm not entirely sure I see the ABI breakage here.
> It is not breakage, it is the ABI thinks number of online cpu is fixed,
> obviously, it is not the case in future unless FreeBSD won't support
> dynamic number of online cpus.
>=20
>=20
> >If the AT_NCPUS
> >becames unconvenient and not correct at some point we can just fix
> >sysconf() to not look into the aux vector anymoe.
> If you already know this will be a problem, why do you introduce it
> and later need to fix it ?
>=20
> >  Please note that
> >AT_NCPUS is already exported nowadays. I think this is instead a
> >clever optimization to avoid the sysctl() (usual way to retrieve the
> >number of CPUs).
> But why don't you cache it in libc ? following code is enough:
>=20
> static int online_cpu;
> if (online_cpu =3D=3D 0)
>     online_cpu =3D sysctl
> return online_cpu;
>=20

Thread did evolved somewhat while I was AFK.

First, please note that the ABI which I designed there is fixable:
if kernel does not export AT_NCPUS at all, then auxv correctly handles
the situation returning an error, and libc falls back to sysctl(2).

Second, sysconf(3) is very weird API. Note the following statement from
SUSv4: "The value shall not change during the lifetime of the calling
process, [XSI] [Option Start] except that sysconf(_SC_OPEN_MAX) may
return different values before and after a call to setrlimit() which
changes the RLIMIT_NOFILE soft limit." Corresponding comment is also
present in sysconf.c.

So I do not see an issue there, esp. for advisory value which NCPUS is
anyway.

--YD+BIkcXU0IoTTos
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (FreeBSD)

iEYEARECAAYFAk/sDV0ACgkQC3+MBN1Mb4jAxwCeOOJVbcfvLsTXSgOupccMhLDZ
OmgAnie0Etxxw62u1QPnCI0lCNYFOKez
=jhGE
-----END PGP SIGNATURE-----

--YD+BIkcXU0IoTTos--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120628075301.GS2337>