loongarch.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
To: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	"Russell King (Oracle)" <linux@armlinux.org.uk>,
	<linux-pm@vger.kernel.org>, <loongarch@lists.linux.dev>,
	<linux-acpi@vger.kernel.org>, <linux-arch@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>, <kvmarm@lists.linux.dev>,
	<x86@kernel.org>, Miguel Luis <miguel.luis@oracle.com>,
	James Morse <james.morse@arm.com>,
	Salil Mehta <salil.mehta@huawei.com>,
	"Jean-Philippe Brucker" <jean-philippe@linaro.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>, <linuxarm@huawei.com>,
	<justin.he@arm.com>, <jianyong.wu@arm.com>
Subject: Re: [PATCH v5 03/18] ACPI: processor: Register deferred CPUs from acpi_processor_get_info()
Date: Mon, 15 Apr 2024 13:23:51 +0100	[thread overview]
Message-ID: <20240415132351.00007439@huawei.com> (raw)
In-Reply-To: <CAJZ5v0iNSmV6EsBOc5oYWSTR9UvFOeg8_mj8Ofhum4Tonb3kNQ@mail.gmail.com>

On Mon, 15 Apr 2024 14:04:26 +0200
"Rafael J. Wysocki" <rafael@kernel.org> wrote:

> On Mon, Apr 15, 2024 at 1:56 PM Jonathan Cameron
> <Jonathan.Cameron@huawei.com> wrote:
> >
> > On Mon, 15 Apr 2024 13:37:08 +0200
> > "Rafael J. Wysocki" <rafael@kernel.org> wrote:
> >  
> > > On Mon, Apr 15, 2024 at 10:46 AM Jonathan Cameron
> > > <Jonathan.Cameron@huawei.com> wrote:  
> > > >
> > > > On Sat, 13 Apr 2024 01:23:48 +0200
> > > > Thomas Gleixner <tglx@linutronix.de> wrote:
> > > >  
> > > > > Russell!
> > > > >
> > > > > On Fri, Apr 12 2024 at 22:52, Russell King (Oracle) wrote:  
> > > > > > On Fri, Apr 12, 2024 at 10:54:32PM +0200, Thomas Gleixner wrote:  
> > > > > >> > As for the cpu locking, I couldn't find anything in arch_register_cpu()
> > > > > >> > that depends on the cpu_maps_update stuff nor needs the cpus_write_lock
> > > > > >> > being taken - so I've no idea why the "make_present" case takes these
> > > > > >> > locks.  
> > > > > >>
> > > > > >> Anything which updates a CPU mask, e.g. cpu_present_mask, after early
> > > > > >> boot must hold the appropriate write locks. Otherwise it would be
> > > > > >> possible to online a CPU which just got marked present, but the
> > > > > >> registration has not completed yet.  
> > > > > >
> > > > > > Yes. As far as I've been able to determine, arch_register_cpu()
> > > > > > doesn't manipulate any of the CPU masks. All it seems to be doing
> > > > > > is initialising the struct cpu, registering the embedded struct
> > > > > > device, and setting up the sysfs links to its NUMA node.
> > > > > >
> > > > > > There is nothing obvious in there which manipulates any CPU masks, and
> > > > > > this is rather my fundamental point when I said "I couldn't find
> > > > > > anything in arch_register_cpu() that depends on ...".
> > > > > >
> > > > > > If there is something, then comments in the code would be a useful aid
> > > > > > because it's highly non-obvious where such a manipulation is located,
> > > > > > and hence why the locks are necessary.  
> > > > >
> > > > > acpi_processor_hotadd_init()
> > > > > ...
> > > > >          acpi_map_cpu(pr->handle, pr->phys_id, pr->acpi_id, &pr->id);
> > > > >
> > > > > That ends up in fiddling with cpu_present_mask.
> > > > >
> > > > > I grant you that arch_register_cpu() is not, but it might rely on the
> > > > > external locking too. I could not be bothered to figure that out.
> > > > >  
> > > > > >> Define "real hotplug" :)
> > > > > >>
> > > > > >> Real physical hotplug does not really exist. That's at least true for
> > > > > >> x86, where the physical hotplug support was chased for a while, but
> > > > > >> never ended up in production.
> > > > > >>
> > > > > >> Though virtualization happily jumped on it to hot add/remove CPUs
> > > > > >> to/from a guest.
> > > > > >>
> > > > > >> There are limitations to this and we learned it the hard way on X86. At
> > > > > >> the end we came up with the following restrictions:
> > > > > >>
> > > > > >>     1) All possible CPUs have to be advertised at boot time via firmware
> > > > > >>        (ACPI/DT/whatever) independent of them being present at boot time
> > > > > >>        or not.
> > > > > >>
> > > > > >>        That guarantees proper sizing and ensures that associations
> > > > > >>        between hardware entities and software representations and the
> > > > > >>        resulting topology are stable for the lifetime of a system.
> > > > > >>
> > > > > >>        It is really required to know the full topology of the system at
> > > > > >>        boot time especially with hybrid CPUs where some of the cores
> > > > > >>        have hyperthreading and the others do not.
> > > > > >>
> > > > > >>
> > > > > >>     2) Hot add can only mark an already registered (possible) CPU
> > > > > >>        present. Adding non-registered CPUs after boot is not possible.
> > > > > >>
> > > > > >>        The CPU must have been registered in #1 already to ensure that
> > > > > >>        the system topology does not suddenly change in an incompatible
> > > > > >>        way at run-time.
> > > > > >>
> > > > > >> The same restriction would apply to real physical hotplug. I don't think
> > > > > >> that's any different for ARM64 or any other architecture.  
> > > > > >
> > > > > > This makes me wonder whether the Arm64 has been barking up the wrong
> > > > > > tree then, and whether the whole "present" vs "enabled" thing comes
> > > > > > from a misunderstanding as far as a CPU goes.
> > > > > >
> > > > > > However, there is a big difference between the two. On x86, a processor
> > > > > > is just a processor. On Arm64, a "processor" is a slice of the system
> > > > > > (includes the interrupt controller, PMUs etc) and we must enumerate
> > > > > > those even when the processor itself is not enabled. This is the whole
> > > > > > reason there's a difference between "present" and "enabled" and why
> > > > > > there's a difference between x86 cpu hotplug and arm64 cpu hotplug.
> > > > > > The processor never actually goes away in arm64, it's just prevented
> > > > > > from being used.  
> > > > >
> > > > > It's the same on X86 at least in the physical world.  
> > > >
> > > > There were public calls on this via the Linaro Open Discussions group,
> > > > so I can talk a little about how we ended up here.  Note that (in my
> > > > opinion) there is zero chance of this changing - it took us well over
> > > > a year to get to this conclusion.  So if we ever want ARM vCPU HP
> > > > we need to work within these constraints.
> > > >
> > > > The ARM architecture folk (the ones defining the ARM ARM, relevant ACPI
> > > > specs etc, not the kernel maintainers) are determined that they want
> > > > to retain the option to do real physical CPU hotplug in the future
> > > > with all the necessary work around dynamic interrupt controller
> > > > initialization, debug and many other messy corners.  
> > >
> > > That's OK, but the difference is not in the ACPi CPU enumeration/removal code.
> > >  
> > > > Thus anything defined had to be structured in a way that was 'different'
> > > > from that.  
> > >
> > > Apparently, that's where things got confused.
> > >  
> > > > I don't mind the proposed flattening of the 2 paths if the ARM kernel
> > > > maintainers are fine with it but it will remove the distinctions and
> > > > we will need to be very careful with the CPU masks - we can't handle
> > > > them the same as x86 does.  
> > >
> > > At the ACPI code level, there is no distinction.
> > >
> > > A CPU that was not available before has just become available.  The
> > > platform firmware has notified the kernel about it and now
> > > acpi_processor_add() runs.  Why would it need to use different code
> > > paths depending on what _STA bits were clear before?  
> >
> > I think we will continue to disagree on this.  To my mind and from the
> > ACPI specification, they are two different state transitions with different
> > required actions.  
> 
> Well, please be specific: What exactly do you mean here and which
> parts of the spec are you talking about?

Given we are moving on with your suggestion, lets leave this for now - too many
other things to do! :)

> 
> > Those state transitions are an ACPI level thing not
> > an arch level one.  However, I want a solution that moves things forwards
> > so I'll give pushing that entirely into the arch code a try.  
> 
> Thanks!
> 
> Though I think that there is a disconnect between us that needs to be
> clarified first.

I'm fine with accepting your approach if it works and is acceptable
to the arm kernel folk. They are getting a non trivial arch_register_cpu()
with a bunch of ACPI specific handling in it that may come as a surprise.

> 
> > >
> > > Yes, there is some arch stuff to be called and that arch stuff should
> > > figure out what to do to make things actually work.
> > >  
> > > > I'll get on with doing that, but do need input from Will / Catalin / James.
> > > > There are some quirks that need calling out as it's not quite a simple
> > > > as it appears from a high level.
> > > >
> > > > Another part of that long discussion established that there is userspace
> > > > (Android IIRC) in which the CPU present mask must include all CPUs
> > > > at boot. To change that would be userspace ABI breakage so we can't
> > > > do that.  Hence the dance around adding yet another mask to allow the
> > > > OS to understand which CPUs are 'present' but not possible to online.
> > > >
> > > > Flattening the two paths removes any distinction between calls that
> > > > are for real hotplug and those that are for this online capable path.  
> > >
> > > Which calls exactly do you mean?  
> >
> > At the moment he distinction does not exist (because x86 only supports
> > fake physical CPU HP and arm64 only vCPU HP / online capable), but if
> > the architecture is defined for arm64 physical hotplug in the future
> > we would need to do interrupt controller bring up + a lot of other stuff.
> >
> > It may be possible to do that in the arch code - will be hard to verify
> > that until that arch is defined  Today all I need to do is ensure that
> > any attempt to do present bit setting for ARM64 returns an error.
> > That looks to be straight forward.  
> 
> OK
> 
> >  
> > >  
> > > > As a side note, the indicating bit for these flows is defined in ACPI
> > > > for x86 from ACPI 6.3 as a flag in Processor Local APIC
> > > > (the ARM64 definition is a cut and paste of that text).  So someone
> > > > is interested in this distinction on x86. I can't say who but if
> > > > you have a mantis account you can easily follow the history and it
> > > > might be instructive to not everyone considering the current x86
> > > > flow the right way to do it.  
> > >
> > > So a physically absent processor is different from a physically
> > > present processor that has not been disabled.  No doubt about this.
> > >
> > > That said, I'm still unsure why these two cases require two different
> > > code paths in acpi_processor_add().  
> >
> > It might be possible to push the checking down into arch_register_cpu()
> > and have that for now reject any attempt to do physical CPU HP on arm64.
> > It is that gate that is vital to getting this accepted by ARM.
> >
> > I'm still very much stuck on the hotadd_init flag however, so any suggestions
> > on that would be very welcome!  
> 
> I need to do some investigation which will take some time I suppose.

I'll do so as well once I've gotten the rest sorted out.  That whole
structure seems overly complex and liable to race, though maybe sufficient
locking happens to be held that it's not a problem.

Jonathan




  reply	other threads:[~2024-04-15 12:23 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-12 14:37 [PATCH v5 00/18] ACPI/arm64: add support for virtual cpu hotplug Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 01/18] cpu: Do not warn on arch_register_cpu() returning -EPROBE_DEFER Jonathan Cameron
2024-04-12 17:42   ` Rafael J. Wysocki
2024-04-22  3:53   ` Gavin Shan
2024-04-12 14:37 ` [PATCH v5 02/18] ACPI: processor: Set the ACPI_COMPANION for the struct cpu instance Jonathan Cameron
2024-04-12 18:10   ` Rafael J. Wysocki
2024-04-15 15:48     ` Jonathan Cameron
2024-04-15 16:16       ` Rafael J. Wysocki
2024-04-15 16:19         ` Rafael J. Wysocki
2024-04-15 16:50           ` Jonathan Cameron
2024-04-15 17:34             ` Jonathan Cameron
2024-04-15 17:41               ` Rafael J. Wysocki
2024-04-16 17:35                 ` Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 03/18] ACPI: processor: Register deferred CPUs from acpi_processor_get_info() Jonathan Cameron
2024-04-12 18:30   ` Rafael J. Wysocki
2024-04-12 20:16     ` Russell King (Oracle)
2024-04-12 20:54       ` Thomas Gleixner
2024-04-12 21:52         ` Russell King (Oracle)
2024-04-12 23:23           ` Thomas Gleixner
2024-04-15  8:45             ` Jonathan Cameron
2024-04-15  9:16               ` Jonathan Cameron
2024-04-15  9:31                 ` Jonathan Cameron
2024-04-15 11:57                 ` Jonathan Cameron
2024-04-15 11:37               ` Rafael J. Wysocki
2024-04-15 11:56                 ` Jonathan Cameron
2024-04-15 12:04                   ` Rafael J. Wysocki
2024-04-15 12:23                     ` Jonathan Cameron [this message]
2024-04-16 17:41                       ` Jonathan Cameron
2024-04-16 19:02                         ` Rafael J. Wysocki
2024-04-17 10:39                           ` Jonathan Cameron
2024-04-15 12:37                     ` Salil Mehta
2024-04-15 12:41                       ` Rafael J. Wysocki
2024-04-15 11:51         ` Salil Mehta
2024-04-15 12:51           ` Rafael J. Wysocki
2024-04-15 15:31             ` Salil Mehta
2024-04-15 16:38               ` Rafael J. Wysocki
2024-04-17 15:01                 ` Salil Mehta
2024-04-17 16:19                   ` Rafael J. Wysocki
2024-04-15 10:52     ` Jonathan Cameron
2024-04-15 11:11       ` Jonathan Cameron
2024-04-15 11:52       ` Rafael J. Wysocki
2024-04-15 11:07     ` Salil Mehta
2024-04-16 14:00   ` Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 04/18] ACPI: Rename acpi_processor_hotadd_init and remove pre-processor guards Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 05/18] ACPI: utils: Add an acpi_sta_enabled() helper and use it in acpi_processor_make_present() Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 06/18] ACPI: scan: Add parameter to allow defering some actions in acpi_scan_check_and_detach Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 07/18] ACPI: Add post_eject to struct acpi_scan_handler for cpu hotplug Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 08/18] ACPI: convert acpi_processor_post_eject() to use IS_ENABLED() Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 09/18] ACPI: Check _STA present bit before making CPUs not present Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 10/18] ACPI: Warn when the present bit changes but the feature is not enabled Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 11/18] arm64: acpi: Move get_cpu_for_acpi_id() to a header Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 12/18] irqchip/gic-v3: Don't return errors from gic_acpi_match_gicc() Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 13/18] irqchip/gic-v3: Add support for ACPI's disabled but 'online capable' CPUs Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 14/18] arm64: psci: Ignore DENIED CPUs Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 15/18] arm64: arch_register_cpu() variant to allow checking of ACPI _STA Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 16/18] ACPI: add support to (un)register CPUs based on the _STA enabled bit Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 17/18] arm64: document virtual CPU hotplug's expectations Jonathan Cameron
2024-04-12 14:37 ` [PATCH v5 18/18] cpumask: Add enabled cpumask for present CPUs that can be brought online Jonathan Cameron

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=20240415132351.00007439@huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=catalin.marinas@arm.com \
    --cc=james.morse@arm.com \
    --cc=jean-philippe@linaro.org \
    --cc=jianyong.wu@arm.com \
    --cc=justin.he@arm.com \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=linuxarm@huawei.com \
    --cc=loongarch@lists.linux.dev \
    --cc=miguel.luis@oracle.com \
    --cc=rafael@kernel.org \
    --cc=salil.mehta@huawei.com \
    --cc=tglx@linutronix.de \
    --cc=will@kernel.org \
    --cc=x86@kernel.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).