linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
To: Eduardo Valentin <edubezval@gmail.com>, Rui Zhang <rui.zhang@intel.com>
Cc: Linux PM <linux-pm@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	rjw@rjwysocki.net
Subject: Re: [RFC PATCH 1/1] acpi: processor_driver: register cooling device per package
Date: Tue, 17 May 2016 10:19:44 -0700	[thread overview]
Message-ID: <1463505584.28729.198.camel@linux.intel.com> (raw)
In-Reply-To: <1463120370-2553-1-git-send-email-edubezval@gmail.com>

On Thu, 2016-05-12 at 23:19 -0700, Eduardo Valentin wrote:
> The current throttling strategy is to apply cooling levels
> on all processors in a package. Therefore, if one cooling
> device is requested to cap the frequency, the same request
> is applied to all sibling processors in the same package.
> 
> For this reason, this patch removes the redundant cooling
> devices, registering only one cooling device per package.
> 
> Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
> ---
> Srinivas,
> 
> This is the outcome of our discussion on the Processor cooling
> device.
> As per your suggestion, I am now attempting to register a single
> cooling device per package.
> 
> The only thing is about the sysfs links. Now the Processor cooling
> device would look like:
> $ ls /sys/class/thermal/cooling_device0/
> cur_state  device.0  device.1  device.2  device.3  max_state  power  
> subsystem	type  uevent
> 
> Instead of:
> 
> $ ls /sys/class/thermal/cooling_device0/
> cur_state  device  max_state  power  subsystem	type  uevent
> 
> This is obviously to keep a link between the cooling device and
> its affected devices. Would this break userspace?
> 
Conceptually it is fine and should work. I need to run some tests
before I confirm.
Hopefully I can do in next 2 weeks.

Thanks,
Srinivas
> BR,
> 
> Eduardo Valentin
> 
>  drivers/acpi/processor_driver.c | 40
> +++++++++++++++++++++++++++++++++++++---
>  1 file changed, 37 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/acpi/processor_driver.c
> b/drivers/acpi/processor_driver.c
> index 11154a3..e1e17de 100644
> --- a/drivers/acpi/processor_driver.c
> +++ b/drivers/acpi/processor_driver.c
> @@ -160,9 +160,29 @@ static struct notifier_block acpi_cpu_notifier =
> {
>  };
>  
>  #ifdef CONFIG_ACPI_CPU_FREQ_PSS
> +static struct thermal_cooling_device *
> +acpi_pss_register_cooling(struct acpi_processor *pr, struct
> acpi_device *device)
> +{
> +	int i, cpu = pr->id;
> +
> +	for_each_online_cpu(i) {
> +		if (topology_physical_package_id(i) ==
> +		    topology_physical_package_id(cpu)) {
> +			struct acpi_processor *pre =
> per_cpu(processors, i);
> +
> +			if (pre->cdev && !IS_ERR(pre->cdev))
> +				return pre->cdev;
> +		}
> +	}
> +
> +	return thermal_cooling_device_register("Processor", device,
> +					       &processor_cooling_op
> s);
> +}
> +
>  static int acpi_pss_perf_init(struct acpi_processor *pr,
>  		struct acpi_device *device)
>  {
> +	char cpu_id[15];
>  	int result = 0;
>  
>  	acpi_processor_ppc_has_changed(pr, 0);
> @@ -172,8 +192,7 @@ static int acpi_pss_perf_init(struct
> acpi_processor *pr,
>  	if (pr->flags.throttling)
>  		pr->flags.limit = 1;
>  
> -	pr->cdev = thermal_cooling_device_register("Processor",
> device,
> -						   &processor_coolin
> g_ops);
> +	pr->cdev = acpi_pss_register_cooling(pr, device);
>  	if (IS_ERR(pr->cdev)) {
>  		result = PTR_ERR(pr->cdev);
>  		return result;
> @@ -191,9 +210,10 @@ static int acpi_pss_perf_init(struct
> acpi_processor *pr,
>  		goto err_thermal_unregister;
>  	}
>  
> +	snprintf(cpu_id, sizeof(cpu_id), "device.%d", pr->id);
>  	result = sysfs_create_link(&pr->cdev->device.kobj,
>  				   &device->dev.kobj,
> -				   "device");
> +				   cpu_id);
>  	if (result) {
>  		dev_err(&pr->cdev->device,
>  			"Failed to create sysfs link 'device'\n");
> @@ -213,11 +233,25 @@ static int acpi_pss_perf_init(struct
> acpi_processor *pr,
>  static void acpi_pss_perf_exit(struct acpi_processor *pr,
>  		struct acpi_device *device)
>  {
> +	char cpu_id[15];
> +	int i;
> +
>  	if (pr->cdev) {
>  		sysfs_remove_link(&device->dev.kobj,
> "thermal_cooling");
> +		snprintf(cpu_id, sizeof(cpu_id), "device.%d", pr-
> >id);
>  		sysfs_remove_link(&pr->cdev->device.kobj, "device");
>  		thermal_cooling_device_unregister(pr->cdev);
>  		pr->cdev = NULL;
> +
> +		for_each_online_cpu(i) {
> +			if (topology_physical_package_id(i) ==
> +			    topology_physical_package_id(pr->id)) {
> +				struct acpi_processor *pre;
> +
> +				pre = per_cpu(processors, i);
> +				pre->cdev = NULL;
> +			}
> +		}
>  	}
>  }
>  #else

      reply	other threads:[~2016-05-17 17:18 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-13  6:19 [RFC PATCH 1/1] acpi: processor_driver: register cooling device per package Eduardo Valentin
2016-05-17 17:19 ` Srinivas Pandruvada [this message]

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=1463505584.28729.198.camel@linux.intel.com \
    --to=srinivas.pandruvada@linux.intel.com \
    --cc=edubezval@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    --cc=rui.zhang@intel.com \
    /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).