[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] core-parking: fix build with gcc12 and NR_CPUS=1


  • To: Jan Beulich <jbeulich@xxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Date: Mon, 27 Feb 2023 19:43:06 +0000
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=47hrV022imjNL9At+nLTGFZCNqOEN0PDuu0mk4P+w08=; b=ZieN6+VSLI/Boa1uaEVNdCpvbfwPOycjMhS/H81k8ZdSh3XyPAQGXYIsQaNWcYB+N6kwfWZ1QAjoklXWKxIeNR2pj5YgfxSAmMTBSh+rmWqC4Z0UkFkbxcha6PlA5vFvakgtSH4R8O//H+zK6Pd08DJiqP0YV7+C60Z4KOtThn0MJwXMk3eG7lRGSwoODTMJwP8BLrkWXd2Tce7PHY8THpvZt7N+BVQewRo9w0iVEZ63r+nY5Uq1xyR6XX0zkYx3Ahkn81/i4/AD6Jy8orXXrdYQ9EC7LcS+PYu512yQzSNLCX9RsDCfNNY862kxE080YTOdOPZFEFhGFVvJs9EwVA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=R5RycFx9unkv3Lqwb8ABzHNJE/Y+4f06BbPA0M7U+9Dkt7DrTxW48toki7/qRguO69k+zPL9Ez+CLAid67l2epplYqKIFj8ZEgF6Vp5DvHB7Ew8PMBhrfqcJx0vRXnQ7EF1hXHI7zMvDLf2snNHqEcRQ294GR6d/Wpet5zlZPn5CdXcaCPV3WvxFKO0kKHEq6VfAJwvfFsjDRjVkSbTMNbfvhczWw0ywXfC535gqcGDR8qZc0vXkPDaHY/E0lMW+gl33Ju9abW5uPMoNSVRRFX2Vyg6dRi5dJJtrPLvh40rnlTyrzwubC0dnqDK5tBIWmDoOK9n6PIH2IgF/SXnbqA==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: Wei Liu <wl@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>
  • Delivery-date: Mon, 27 Feb 2023 19:43:51 +0000
  • Ironport-data: A9a23:ghROsa0+8XkRN88SpfbD5e5wkn2cJEfYwER7XKvMYLTBsI5bpzVSy DQWUG+HO62ONDT8e493Ot7k8ktT68eEnYVhSgA+pC1hF35El5HIVI+TRqvS04F+DeWYFR46s J9OAjXkBJppJpMJjk71atANlVEliefTAOK6ULWeUsxIbVcMYD87jh5+kPIOjIdtgNyoayuAo tq3qMDEULOf82cc3lk8tuTS+HuDgNyo4GlD5gZkOqgQ1LPjvyJ94Kw3dPnZw0TQGuG4LsbiL 87fwbew+H/u/htFIrtJRZ6iLyXm6paLVeS/oiI+t5qK23CulQRrukoPD9IOaF8/ttm8t4sZJ OOhF3CHYVxB0qXkwIzxWvTDes10FfUuFLTveRBTvSEPpqFvnrSFL/hGVSkL0YMkFulfBTgez e0jAggxUBGsuseu/J+lS/NjmZF2RCXrFNt3VnBI6xj8VKxja7aTBqLA6JlfwSs6gd1IEbDGf c0FZDFzbRPGJRpSJlMQD5F4l+Ct7pX9W2QA9BTJ+uxqvi6Kk1IZPLvFabI5fvSjQ8lPk1nej WXB52njWTkRNcCFyCrD+XWp7gPKtXqjAdtMT+Dlr5aGhnW8/XUVMzgnVmKnuNSBtXeVZPNvN 3Ubr39GQa8asRbDosPGdx+yrWOAvxUcc8FNCOB84waIooLE7gDcCmUaQzppbN09qNRwVTEsz kWOnd7iGXpoqrL9YW2Z3qeZq3W1Iyd9BW0fYS4JSyMV7t+lp5s85i8jVf5mGa+xy9fzSTf5x mnQqDBk3upNy8kWy6+84FbLxSq2oYTERRI04QORWX+56gR+Z8iuYInABUXn0Mus5b2xFjGp1 EXoUeDHhAzSJflhTBCwfdg=
  • Ironport-hdrordr: A9a23:5GDFq6CbTIuLncPlHeiisseALOsnbusQ8zAXPh9KJCC9I/bzqy nxpp8mPEfP+U4ssHFJo7C90dq7MAjhHP9OkMEs1NiZLW3bUQeTQr2KqLGSugEIeBeOvdK1t5 0QFJSWYeeYZTQUsS+52njfLz9K+qjlzEncv5a6854bd3AJV0gP1WZEIzfeNnczaBhNBJI/Gp bZzs1bpwC4cXBSQtWnCmIDV+3jocSOsJ79exYJCzMu9QHL1FqTmfPHOind+i1bfyJEwL8k/2 SAuwvl5p+7u/X+5g7A23TV55F2nsKk7tdYHsSDhuUcNz2poAe1Y4ZKXaGEoVkO0auSwWdvtO OJjwYrPsx15X+UVHqyuwHR1w7p1ytrw2P+yHeD6EGT7vDRdXYfMY5slIhZehzW5w4Lp9dnyp 9G2Gqfqt5+EQ7ApiLg/NLFPisa2HZc4EBS0NL7vUYvErf2W4Uh77D3O3klVavoKRiKqLzP1t MeSP00qswmNm9yJEqpxFWHiObcI0jbWC32DnTq8/blrwR+jTR3yVAVy9cYmWpF/JUhS4Nc7+ CBKahwkqpSJ/VmGp6VKd1xNPdfMFa9NS7kISaXOxDqBasHM3XCp9r+56g0/vijfNgNwIEpkJ rMXVtEvSpqEnieQPGmzdlO6FTAUW+9VTPixoVX4IV4oKT1QP7uPTeYQF4jnsO8q7EUA9HdWf y0JJVKasWTW1fGCMJMxUnzSpNSIX4RXIkcvcs6QUuHpobRJojjpoXgAYTuzXrWYEUZs0/Ecw o+tWLIVbp9B2iQKwHFqQmUXW/xcUri+p81GLTG/oEoufgwCrE=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 09/09/2022 3:30 pm, Jan Beulich wrote:
> Gcc12 takes issue with core_parking_remove()'s
>
>    for ( ; i < cur_idle_nums; ++i )
>        core_parking_cpunum[i] = core_parking_cpunum[i + 1];
>
> complaining that the right hand side array access is past the bounds of
> 1. Clearly the compiler can't know that cur_idle_nums can only ever be
> zero in this case (as the sole CPU cannot be parked).
>
> Arrange for core_parking.c's contents to not be needed altogether, and
> then disable its building when NR_CPUS == 1.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> v2: Disable building of core_parking.c altogether.
>
> --- a/xen/arch/x86/Kconfig
> +++ b/xen/arch/x86/Kconfig
> @@ -10,7 +10,7 @@ config X86
>     select ALTERNATIVE_CALL
>     select ARCH_MAP_DOMAIN_PAGE
>     select ARCH_SUPPORTS_INT128
> -    select CORE_PARKING
> +    select CORE_PARKING if NR_CPUS > 1

The appropriate change is:

diff --git a/xen/arch/x86/Kconfig b/xen/arch/x86/Kconfig
index 6a7825f4ba3c..2a5c3304e2b0 100644
--- a/xen/arch/x86/Kconfig
+++ b/xen/arch/x86/Kconfig
@@ -10,7 +10,7 @@ config X86
        select ALTERNATIVE_CALL
        select ARCH_MAP_DOMAIN_PAGE
        select ARCH_SUPPORTS_INT128
-       select CORE_PARKING
+       imply CORE_PARKING
        select HAS_ALTERNATIVE
        select HAS_COMPAT
        select HAS_CPUFREQ
diff --git a/xen/common/Kconfig b/xen/common/Kconfig
index f1ea3199c8eb..855c843113e3 100644
--- a/xen/common/Kconfig
+++ b/xen/common/Kconfig
@@ -10,6 +10,7 @@ config COMPAT
 
 config CORE_PARKING
        bool
+       depends on NR_CPUS > 1
 
 config GRANT_TABLE
        bool "Grant table support" if EXPERT


The core parking code really does malfunction with NR_CPUS == 1, so
really does need a hard dependency.

It turns out our version of Kbuild does understand the imply keyword,
which is the right way to spell "I want this feature unless something
else happens to rule it out".

As noted in the kbuild docs, select should only be used for immutable
properties (this arch has $X), whereas imply should be used for all "I
want $Y".  Most places we use select ought to use imply instead.



>     select HAS_ALTERNATIVE
>     select HAS_COMPAT
>     select HAS_CPUFREQ
> --- a/xen/arch/x86/platform_hypercall.c
> +++ b/xen/arch/x86/platform_hypercall.c
> @@ -727,12 +727,17 @@ ret_t do_platform_op(
>         case XEN_CORE_PARKING_SET:
>             idle_nums = min_t(uint32_t,
>                     op->u.core_parking.idle_nums, num_present_cpus() -
> 1);
> -            ret = continue_hypercall_on_cpu(
> -                    0, core_parking_helper, (void *)(unsigned
> long)idle_nums);
> +            if ( CONFIG_NR_CPUS > 1 )
> +                ret = continue_hypercall_on_cpu(
> +                        0, core_parking_helper,
> +                        (void *)(unsigned long)idle_nums);
> +            else if ( idle_nums )
> +                ret = -EINVAL;
>             break;
>
>         case XEN_CORE_PARKING_GET:
> -            op->u.core_parking.idle_nums = get_cur_idle_nums();
> +            op->u.core_parking.idle_nums = CONFIG_NR_CPUS > 1
> +                                           ? get_cur_idle_nums() : 0;

These don't look right.

If the core parking feature isn't available, it should uniformly fail,
not report success on the get side and fail on the set side.

>             ret = __copy_field_to_guest(u_xenpf_op, op, u.core_parking) ?
>                   -EFAULT : 0;
>             break;
> --- a/xen/arch/x86/sysctl.c
> +++ b/xen/arch/x86/sysctl.c
> @@ -157,7 +157,7 @@ long arch_do_sysctl(
>         long (*fn)(void *);
>         void *hcpu;
>
> -        switch ( op )
> +        switch ( op | -(CONFIG_NR_CPUS == 1) )

Extending what Julien has said...

We use this pattern exactly twice, and I would probably ack a patch
disallowing it in the coding style.

Its a trick that is too clever for its own good.  To anyone who hasn't
encountered it, its straight obfuscation, and even I, who knows how the
trick works, still has to reverse engineer the expression every single
time to figure out which way it ends up resolving.

~Andrew



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.