linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: "Russell King (Oracle)" <linux@armlinux.org.uk>
Cc: James Morse <james.morse@arm.com>, <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>,
	<linux-riscv@lists.infradead.org>, <kvmarm@lists.linux.dev>,
	<x86@kernel.org>, Salil Mehta <salil.mehta@huawei.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.org>,
	<jianyong.wu@arm.com>, <justin.he@arm.com>,
	<gregkh@linuxfoundation.org>
Subject: Re: [RFC PATCH v2 11/35] arch_topology: Make register_cpu_capacity_sysctl() tolerant to late CPUs
Date: Thu, 30 Nov 2023 16:46:09 +0000	[thread overview]
Message-ID: <20231130164609.00000b4a@Huawei.com> (raw)
In-Reply-To: <ZTKEQz0DJuv/tqNH@shell.armlinux.org.uk>

On Fri, 20 Oct 2023 14:44:35 +0100
"Russell King (Oracle)" <linux@armlinux.org.uk> wrote:

> On Thu, Sep 14, 2023 at 01:01:26PM +0100, Jonathan Cameron wrote:
> > On Wed, 13 Sep 2023 16:37:59 +0000
> > James Morse <james.morse@arm.com> wrote:
> >   
> > > register_cpu_capacity_sysctl() adds a property to sysfs that describes
> > > the CPUs capacity. This is done from a subsys_initcall() that assumes
> > > all possible CPUs are registered.
> > > 
> > > With CPU hotplug, possible CPUs aren't registered until they become
> > > present, (or for arm64 enabled). This leads to messages during boot:
> > > | register_cpu_capacity_sysctl: too early to get CPU1 device!
> > > and once these CPUs are added to the system, the file is missing.
> > > 
> > > Move this to a cpuhp callback, so that the file is created once
> > > CPUs are brought online. This covers CPUs that are added late by
> > > mechanisms like hotplug.
> > > One observable difference is the file is now missing for offline CPUs.
> > > 
> > > Signed-off-by: James Morse <james.morse@arm.com>
> > > ---
> > > If the offline CPUs thing is a problem for the tools that consume
> > > this value, we'd need to move cpu_capacity to be part of cpu.c's
> > > common_cpu_attr_groups.  
> > 
> > I think we should do that anyway and then use an is_visible() if we want to
> > change whether it is visible in offline cpus.
> > 
> > Dynamic sysfs file creation is horrible - particularly when done
> > from an totally different file from where the rest of the attributes
> > are registered.  I'm curious what the history behind that is.
> > 
> > Whilst here, why is there a common_cpu_attr_groups which is
> > identical to the hotpluggable_cpu_attr_groups in base/cpu.c?  
> 
> Looking into doing this, the easy bit is adding the attribute group
> with an appropriate .is_visible dependent on cpu_present(), but we
> need to be able to call sysfs_update_groups() when the state of the
> .is_visible() changes.
Hi Russell,

Sorry, somehow I missed this completely until you referred back to it :(

This is pretty much what I was thinking so thanks for doing it.

> 
> Given the comment in sysfs_update_groups() about "if an error occurs",
> rather than making this part of common_cpu_attr_groups, would it be
> better that it's part of its own set of groups, thus limiting the
> damage from a possible error? I suspect, however, that any error at
> that point means that the system is rather fatally wounded.
> 
> This is what I have so far to implement your idea, less the necessary
> sysfs_update_groups() call when we need to change the visibility of
> the attributes.

Fwiw (and I think you shouldn't add this to the critical path for your
main series for obvious reasons), I think you are right that it makes
sense to do this in a separate group, but that if we were going to see
an error I'd 'hope' we shouldn't see anything that hasn't occurred
when groups were originally added. Maybe that's overly optimistic.

Sorry again for lack of reply before now and thanks for pointing this
out.  I'd love to see this posted after the ARM vCPU HP stuff is in.

Jonathan


> 
> diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
> index 9ccb7daee78e..06c9fc6620d2 100644
> --- a/drivers/base/arch_topology.c
> +++ b/drivers/base/arch_topology.c
> @@ -215,43 +215,24 @@ static ssize_t cpu_capacity_show(struct device *dev,
>  	return sysfs_emit(buf, "%lu\n", topology_get_cpu_scale(cpu->dev.id));
>  }
>  
> -static void update_topology_flags_workfn(struct work_struct *work);
> -static DECLARE_WORK(update_topology_flags_work, update_topology_flags_workfn);
> -
>  static DEVICE_ATTR_RO(cpu_capacity);
>  
> -static int cpu_capacity_sysctl_add(unsigned int cpu)
> -{
> -	struct device *cpu_dev = get_cpu_device(cpu);
> -
> -	if (!cpu_dev)
> -		return -ENOENT;
> -
> -	device_create_file(cpu_dev, &dev_attr_cpu_capacity);
> -
> -	return 0;
> -}
> -
> -static int cpu_capacity_sysctl_remove(unsigned int cpu)
> +static umode_t cpu_present_attrs_visible(struct kobject *kobi,
> +					 struct attribute *attr, int index)
>  {
> -	struct device *cpu_dev = get_cpu_device(cpu);
> -
> -	if (!cpu_dev)
> -		return -ENOENT;
> -
> -	device_remove_file(cpu_dev, &dev_attr_cpu_capacity);
> +	struct device *dev = kobj_to_dev(kobj);
> +	struct cpu *cpu = container_of(dev, struct cpu, dev);
>  
> -	return 0;
> +	return cpu_present(cpu->dev.id) ? attr->mode : 0;
>  }
>  
> -static int register_cpu_capacity_sysctl(void)
> -{
> -	cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "topology/cpu-capacity",
> -			  cpu_capacity_sysctl_add, cpu_capacity_sysctl_remove);
> +const struct attribute_group cpu_capacity_attr_group = {
> +	.is_visible = cpu_present_attrs_visible,
> +	.attrs = cpu_capacity_attrs
> +};
>  
> -	return 0;
> -}
> -subsys_initcall(register_cpu_capacity_sysctl);
> +static void update_topology_flags_workfn(struct work_struct *work);
> +static DECLARE_WORK(update_topology_flags_work, update_topology_flags_workfn);
>  
>  static int update_topology;
>  
> diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
> index a19a8be93102..954b045705c2 100644
> --- a/drivers/base/cpu.c
> +++ b/drivers/base/cpu.c
> @@ -192,6 +192,9 @@ static const struct attribute_group crash_note_cpu_attr_group = {
>  static const struct attribute_group *common_cpu_attr_groups[] = {
>  #ifdef CONFIG_KEXEC
>  	&crash_note_cpu_attr_group,
> +#endif
> +#ifdef CONFIG_GENERIC_ARCH_TOPOLOGY
> +	&cpu_capacity_attr_group,
>  #endif
>  	NULL
>  };
> diff --git a/include/linux/cpu.h b/include/linux/cpu.h
> index e117c06e0c6b..745ad21e3dc8 100644
> --- a/include/linux/cpu.h
> +++ b/include/linux/cpu.h
> @@ -30,6 +30,8 @@ struct cpu {
>  	struct device dev;
>  };
>  
> +extern const struct attribute_group cpu_capacity_attr_group;
> +
>  extern void boot_cpu_init(void);
>  extern void boot_cpu_hotplug_init(void);
>  extern void cpu_init(void);
> 


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2023-11-30 16:46 UTC|newest]

Thread overview: 152+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-13 16:37 [RFC PATCH v2 00/35] ACPI/arm64: add support for virtual cpuhotplug James Morse
2023-09-13 16:37 ` [RFC PATCH v2 01/35] ACPI: Move ACPI_HOTPLUG_CPU to be disabled on arm64 and riscv James Morse
2023-09-14  8:54   ` Russell King (Oracle)
2023-09-13 16:37 ` [RFC PATCH v2 02/35] drivers: base: Use present CPUs in GENERIC_CPU_DEVICES James Morse
2023-09-14  8:20   ` Russell King (Oracle)
2023-09-14 10:56     ` Jonathan Cameron
2023-09-14 11:11       ` Russell King (Oracle)
2023-09-14 10:56   ` Jonathan Cameron
2023-09-13 16:37 ` [RFC PATCH v2 03/35] drivers: base: Allow parts of GENERIC_CPU_DEVICES to be overridden James Morse
2023-09-14  8:33   ` Russell King (Oracle)
2023-09-14 11:00   ` Jonathan Cameron
2023-09-14 11:05   ` Jonathan Cameron
2023-09-13 16:37 ` [RFC PATCH v2 04/35] drivers: base: Move cpu_dev_init() after node_dev_init() James Morse
2023-09-14  9:40   ` Russell King (Oracle)
2023-09-14 11:16   ` Jonathan Cameron
2023-09-13 16:37 ` [RFC PATCH v2 05/35] drivers: base: Print a warning instead of panic() when register_cpu() fails James Morse
2023-09-14  9:52   ` Russell King (Oracle)
2023-09-18  3:33   ` Gavin Shan
2023-10-20 11:16     ` Russell King (Oracle)
2023-09-13 16:37 ` [RFC PATCH v2 06/35] arm64: setup: Switch over to GENERIC_CPU_DEVICES using arch_register_cpu() James Morse
2023-09-14  9:56   ` Russell King (Oracle)
2023-09-14 11:27   ` Jonathan Cameron
2023-09-14 14:07     ` Russell King (Oracle)
2023-09-14 14:56       ` Jonathan Cameron
2023-09-13 16:37 ` [RFC PATCH v2 07/35] x86: intel_epb: Don't rely on link order James Morse
2023-09-14 10:02   ` Russell King (Oracle)
2023-09-18  3:48   ` Gavin Shan
2023-09-13 16:37 ` [RFC PATCH v2 08/35] x86/topology: Switch over to GENERIC_CPU_DEVICES James Morse
2023-09-14 10:01   ` Russell King (Oracle)
2023-09-14 11:40   ` Jonathan Cameron
2023-09-13 16:37 ` [RFC PATCH v2 09/35] LoongArch: " James Morse
2023-09-14 10:03   ` Russell King (Oracle)
2023-09-14 11:47   ` Jonathan Cameron
2023-09-13 16:37 ` [RFC PATCH v2 10/35] riscv: " James Morse
2023-09-14 10:04   ` Russell King (Oracle)
2023-09-14 11:48     ` Jonathan Cameron
2023-09-13 16:37 ` [RFC PATCH v2 11/35] arch_topology: Make register_cpu_capacity_sysctl() tolerant to late CPUs James Morse
2023-09-14 12:01   ` Jonathan Cameron
2023-10-20 11:53     ` Russell King (Oracle)
2023-10-21 10:56       ` Greg KH
2023-10-20 13:44     ` Russell King (Oracle)
2023-11-14 10:04       ` Russell King (Oracle)
2023-11-30 16:46       ` Jonathan Cameron [this message]
2023-09-13 16:38 ` [RFC PATCH v2 12/35] ACPI: Use the acpi_device_is_present() helper in more places James Morse
2023-09-14 12:04   ` Jonathan Cameron
2023-09-18  4:06   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 13/35] ACPI: Rename acpi_scan_device_not_present() to be about enumeration James Morse
2023-09-18  4:13   ` Gavin Shan
2023-10-20 16:01   ` Russell King (Oracle)
2023-10-20 16:41     ` Jonathan Cameron
2023-09-13 16:38 ` [RFC PATCH v2 14/35] ACPI: Only enumerate enabled (or functional) devices James Morse
2023-09-14 12:27   ` Jonathan Cameron
2023-09-14 13:09     ` Jonathan Cameron
2023-10-20 15:32       ` Russell King (Oracle)
2023-10-20 16:43         ` Jonathan Cameron
2023-09-18  4:38     ` Gavin Shan
2023-09-18 23:43   ` Gavin Shan
2023-10-20 15:45     ` Russell King (Oracle)
2023-09-13 16:38 ` [RFC PATCH v2 15/35] ACPI: processor: Add support for processors described as container packages James Morse
2023-09-14 13:53   ` Jonathan Cameron
2023-11-03 10:43     ` Russell King (Oracle)
2023-11-03 10:57       ` Russell King (Oracle)
2023-11-03 12:52       ` Jonathan Cameron
2023-09-18  5:02   ` Gavin Shan
2023-11-03 10:54     ` Russell King (Oracle)
2023-11-03 11:37   ` Russell King (Oracle)
2023-09-13 16:38 ` [RFC PATCH v2 16/35] ACPI: processor: Register CPUs that are online, but not described in the DSDT James Morse
2023-09-14 13:56   ` Jonathan Cameron
2023-09-18  5:12   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 17/35] ACPI: processor: Register all CPUs from acpi_processor_get_info() James Morse
2023-09-18  5:19   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 18/35] ACPI: Rename ACPI_HOTPLUG_CPU to include 'present' James Morse
2023-09-18  5:22   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 19/35] ACPI: Move acpi_bus_trim_one() before acpi_scan_hot_remove() James Morse
2023-09-14 14:10   ` Jonathan Cameron
2023-09-18  5:36   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 20/35] ACPI: Rename acpi_processor_hotadd_init and remove pre-processor guards James Morse
2023-09-14 14:17   ` Jonathan Cameron
2023-09-18  5:50     ` Gavin Shan
2023-10-23 20:01       ` Russell King (Oracle)
2023-09-13 16:38 ` [RFC PATCH v2 21/35] ACPI: Add post_eject to struct acpi_scan_handler for cpu hotplug James Morse
2023-09-14 14:28   ` Jonathan Cameron
2023-09-19  0:31   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 22/35] ACPI: Check _STA present bit before making CPUs not present James Morse
2023-09-14 14:31   ` Jonathan Cameron
2023-11-03 14:09     ` Russell King (Oracle)
2023-09-19  0:45   ` Gavin Shan
2023-11-03 14:37     ` Russell King (Oracle)
2023-09-13 16:38 ` [RFC PATCH v2 23/35] ACPI: Warn when the present bit changes but the feature is not enabled James Morse
2023-09-14 14:32   ` Jonathan Cameron
2023-09-19  0:49   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 24/35] drivers: base: Implement weak arch_unregister_cpu() James Morse
2023-09-14 14:39   ` Jonathan Cameron
2023-09-19  0:59   ` Gavin Shan
2023-10-23  8:44     ` Russell King (Oracle)
2023-10-23  8:55       ` Russell King (Oracle)
2023-09-13 16:38 ` [RFC PATCH v2 25/35] LoongArch: Use the __weak version of arch_unregister_cpu() James Morse
2023-09-14 14:41   ` Jonathan Cameron
2023-10-23  8:48     ` Russell King (Oracle)
2023-09-19  1:09   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 26/35] arm64: acpi: Move get_cpu_for_acpi_id() to a header James Morse
2023-09-14 14:43   ` Jonathan Cameron
2023-09-19  1:16   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 27/35] ACPICA: Add new MADT GICC flags fields [code first?] James Morse
2023-09-14  7:57   ` Ard Biesheuvel
2023-09-14 14:54     ` Jonathan Cameron
2023-09-14 15:34       ` Ard Biesheuvel
2023-09-14 15:49         ` Russell King (Oracle)
2023-09-15  2:29         ` Salil Mehta
2023-09-15  7:09           ` Russell King (Oracle)
2023-09-15  8:45             ` Rafael J. Wysocki
2023-09-15  9:34               ` Salil Mehta
2023-09-15 10:21                 ` Rafael J. Wysocki
2023-09-15 14:49                   ` Salil Mehta
2023-09-15 15:16                     ` Russell King (Oracle)
2023-09-15 16:46                       ` Salil Mehta
2023-09-15 13:43                 ` Russell King (Oracle)
2023-09-15 15:17                   ` Salil Mehta
2023-09-15 15:32                     ` Jonathan Cameron
2023-09-15 17:12                       ` Salil Mehta
2023-09-15 15:41                     ` Russell King (Oracle)
2023-09-15 17:07                       ` Salil Mehta
2023-09-15  9:21             ` Salil Mehta
2023-09-14 14:48   ` Jonathan Cameron
2023-09-13 16:38 ` [RFC PATCH v2 28/35] arm64, irqchip/gic-v3, ACPI: Move MADT GICC enabled check into a helper James Morse
2023-09-14  8:09   ` Russell King (Oracle)
2023-09-14 14:58   ` Jonathan Cameron
2023-09-19  1:23   ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 29/35] irqchip/gic-v3: Don't return errors from gic_acpi_match_gicc() James Morse
2023-09-14 15:02   ` Jonathan Cameron
2023-10-23 18:58     ` Russell King (Oracle)
2023-09-19  3:39   ` Gavin Shan
2023-09-19  3:51     ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 30/35] irqchip/gic-v3: Add support for ACPI's disabled but 'online capable' CPUs James Morse
2023-09-14  8:10   ` Russell King (Oracle)
2023-09-19  3:53     ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 31/35] arm64: psci: Ignore DENIED CPUs James Morse
2023-09-14 16:01   ` Jonathan Cameron
2023-09-19  4:31     ` Gavin Shan
2023-09-13 16:38 ` [RFC PATCH v2 32/35] ACPI: add support to register CPUs based on the _STA enabled bit James Morse
2023-09-14 16:13   ` Jonathan Cameron
2023-09-19 10:24     ` Russell King (Oracle)
2023-09-19  4:46   ` Gavin Shan
2023-09-19  9:55     ` Russell King (Oracle)
2023-09-13 16:38 ` [RFC PATCH v2 33/35] arm64: document virtual CPU hotplug's expectations James Morse
2023-09-14 16:41   ` Jonathan Cameron
2023-09-13 16:38 ` [RFC PATCH v2 34/35] ACPI: Add _OSC bits to advertise OS support for toggling CPU present/enabled James Morse
2023-09-14 16:50   ` Jonathan Cameron
2023-09-13 16:38 ` [RFC PATCH v2 35/35] cpumask: Add enabled cpumask for present CPUs that can be brought online James Morse
2023-09-14 16:54   ` Jonathan Cameron
2023-09-18 10:27 ` [RFC PATCH v2 00/35] ACPI/arm64: add support for virtual cpuhotplug Russell King (Oracle)
2023-09-26 13:16 ` Salil Mehta

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=20231130164609.00000b4a@Huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=gregkh@linuxfoundation.org \
    --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-riscv@lists.infradead.org \
    --cc=linux@armlinux.org.uk \
    --cc=loongarch@lists.linux.dev \
    --cc=salil.mehta@huawei.com \
    --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).