Message ID | 1458563236-19269-2-git-send-email-prarit@redhat.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
On Mon, 2016-03-21 at 08:27 -0400, Prarit Bhargava wrote: > The MSR_PKG_POWER_INFO register (Intel ASDM, section 14.9.3 > "Package RAPL Domain") provides a maximum time window which the > system can support. This window is read-only and is currently > not examined when setting the time windows for the package. > Usually this field has lot of junk. It is not supported uniformly. The system provides this value from another ACPI element called PPCC. If supported this will be in $ /sys/bus/pci/devices/0000:00:04.0/power_limits $ grep . * power_limit_0_max_uw:15000000 power_limit_0_min_uw:125000 power_limit_0_step_uw:1000000 power_limit_0_tmax_us:32000000 power_limit_0_tmin_us:28000000 power_limit_1_max_uw:25000000 power_limit_1_min_uw:25000000 power_limit_1_step_uw:1000000 power_limit_1_tmax_us:0 power_limit_1_tmin_us:0 Thanks, Srinivas > This patch implements get_max_time_window_us() and checks the window > when > a user attempts to set power capping for the package. > > Before the patch it was possible to set the window to, for example, > 10000 > micro seconds: > > [root@intel-chiefriver-03 rhel7]# echo 10000 > > /sys/devices/virtual/powercap/intel-rapl/intel- > rapl\:0/constraint_0_time_window_us; > egrep ^ /sys/devices/virtual/powercap/intel-rapl/intel- > rapl\:0/constraint_0_time_window_us > > /sys/devices/virtual/powercap/intel-rapl/intel- > rapl:0/constraint_0_time_window_us:1:9765 > > but from 'turbostat -d', the package is limited to 976us: > > cpu0: MSR_PKG_POWER_INFO: 0x01200168 (45 W TDP, RAPL 36 - 0 W, > 0.000977 sec.) > > (Note, there appears to be a rounding issue in turbostat which needs > to > also be fixed. Looking at the values in the register it is clear the > value is 1/1024 = 976us.) > > After the patch we are limited by the maximum time window: > > [root@intel-chiefriver-03 rhel7]# echo 10000 > > /sys/devices/virtual/powercap/intel-rapl/intel- > rapl\:0/constraint_0_time_window_us; > egrep ^ /sys/devices/virtual/powercap/intel-rapl/intel- > rapl\:0/constraint_0_time_window_us > > -bash: echo: write error: Invalid argument > /sys/devices/virtual/powercap/intel-rapl/intel- > rapl:0/constraint_0_time_window_us:1:976 > > Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> > Cc: Prarit Bhargava <prarit@redhat.com> > Cc: Radivoje Jovanovic <radivoje.jovanovic@intel.com> > Cc: Seiichi Ikarashi <s.ikarashi@jp.fujitsu.com> > Cc: Mathias Krause <minipli@googlemail.com> > Cc: Ajay Thomas <ajay.thomas.david.rajamanickam@intel.com> > Signed-off-by: Prarit Bhargava <prarit@redhat.com> > --- > drivers/powercap/intel_rapl.c | 31 > +++++++++++++++++++++++++++++++ > drivers/powercap/powercap_sys.c | 6 ++++-- > 2 files changed, 35 insertions(+), 2 deletions(-) > > diff --git a/drivers/powercap/intel_rapl.c > b/drivers/powercap/intel_rapl.c > index 6c592dc..feb063d 100644 > --- a/drivers/powercap/intel_rapl.c > +++ b/drivers/powercap/intel_rapl.c > @@ -493,13 +493,42 @@ static int get_current_power_limit(struct > powercap_zone *power_zone, int id, > return ret; > } > > +static int get_max_time_window(struct powercap_zone *power_zone, int > id, > + u64 *data) > +{ > + struct rapl_domain *rd; > + int ret = 0; > + u64 val; > + > + get_online_cpus(); > + rd = power_zone_to_rapl_domain(power_zone); > + > + if (rapl_read_data_raw(rd, MAX_TIME_WINDOW, true, &val)) > + ret = -EIO; > + else > + *data = val; > + > + put_online_cpus(); > + return ret; > +} > + > static int set_time_window(struct powercap_zone *power_zone, int id, > u64 > window) > { > struct rapl_domain *rd; > int ret = 0; > + u64 max_window; > > get_online_cpus(); > + ret = get_max_time_window(power_zone, id, &max_window); > + if (ret < 0) > + goto out; > + > + if (window > max_window) { > + ret = -EINVAL; > + goto out; > + } > + > rd = power_zone_to_rapl_domain(power_zone); > switch (rd->rpl[id].prim_id) { > case PL1_ENABLE: > @@ -511,6 +540,7 @@ static int set_time_window(struct powercap_zone > *power_zone, int id, > default: > ret = -EINVAL; > } > +out: > put_online_cpus(); > return ret; > } > @@ -590,6 +620,7 @@ static const struct powercap_zone_constraint_ops > constraint_ops = { > .set_time_window_us = set_time_window, > .get_time_window_us = get_time_window, > .get_max_power_uw = get_max_power, > + .get_max_time_window_us = get_max_time_window, > .get_name = get_constraint_name, > }; > > diff --git a/drivers/powercap/powercap_sys.c > b/drivers/powercap/powercap_sys.c > index 14bde0d..53fad0f 100644 > --- a/drivers/powercap/powercap_sys.c > +++ b/drivers/powercap/powercap_sys.c > @@ -101,7 +101,7 @@ static ssize_t store_constraint_##_attr(struct > device *dev,\ > int err; \ > u64 value; \ > struct powercap_zone *power_zone = to_powercap_zone(dev); \ > - int id; \ > + int id, ret; \ > struct powercap_zone_constraint *pconst;\ > \ > if (!sscanf(dev_attr->attr.name, "constraint_%d_", &id)) \ > @@ -113,8 +113,10 @@ static ssize_t store_constraint_##_attr(struct > device *dev,\ > if (err) \ > return -EINVAL; \ > if (pconst && pconst->ops && pconst->ops->set_##_attr) { \ > - if (!pconst->ops->set_##_attr(power_zone, id, > value)) \ > + ret = pconst->ops->set_##_attr(power_zone, id, > value); \ > + if (!ret) \ > return count; \ > + return ret; \ > } \ > \ > return -ENODATA; \
On 03/31/2016 02:28 PM, Pandruvada, Srinivas wrote: > On Mon, 2016-03-21 at 08:27 -0400, Prarit Bhargava wrote: >> The MSR_PKG_POWER_INFO register (Intel ASDM, section 14.9.3 >> "Package RAPL Domain") provides a maximum time window which the >> system can support. This window is read-only and is currently >> not examined when setting the time windows for the package. >> > Usually this field has lot of junk. It is not supported uniformly. > The system provides this value from another ACPI element called PPCC. > If supported this will be in > > $ /sys/bus/pci/devices/0000:00:04.0/power_limits > $ grep . * > power_limit_0_max_uw:15000000 > power_limit_0_min_uw:125000 > power_limit_0_step_uw:1000000 > power_limit_0_tmax_us:32000000 > power_limit_0_tmin_us:28000000 > power_limit_1_max_uw:25000000 > power_limit_1_min_uw:25000000 > power_limit_1_step_uw:1000000 > power_limit_1_tmax_us:0 > power_limit_1_tmin_us:0 > Interesting. I'll go and take a look on my test system to see if this is supported. P. > Thanks, > Srinivas >> This patch implements get_max_time_window_us() and checks the window >> when >> a user attempts to set power capping for the package. >> >> Before the patch it was possible to set the window to, for example, >> 10000 >> micro seconds: >> >> [root@intel-chiefriver-03 rhel7]# echo 10000 > >> /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl\:0/constraint_0_time_window_us; >> egrep ^ /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl\:0/constraint_0_time_window_us >> >> /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl:0/constraint_0_time_window_us:1:9765 >> >> but from 'turbostat -d', the package is limited to 976us: >> >> cpu0: MSR_PKG_POWER_INFO: 0x01200168 (45 W TDP, RAPL 36 - 0 W, >> 0.000977 sec.) >> >> (Note, there appears to be a rounding issue in turbostat which needs >> to >> also be fixed. Looking at the values in the register it is clear the >> value is 1/1024 = 976us.) >> >> After the patch we are limited by the maximum time window: >> >> [root@intel-chiefriver-03 rhel7]# echo 10000 > >> /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl\:0/constraint_0_time_window_us; >> egrep ^ /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl\:0/constraint_0_time_window_us >> >> -bash: echo: write error: Invalid argument >> /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl:0/constraint_0_time_window_us:1:976 >> >> Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> >> Cc: Prarit Bhargava <prarit@redhat.com> >> Cc: Radivoje Jovanovic <radivoje.jovanovic@intel.com> >> Cc: Seiichi Ikarashi <s.ikarashi@jp.fujitsu.com> >> Cc: Mathias Krause <minipli@googlemail.com> >> Cc: Ajay Thomas <ajay.thomas.david.rajamanickam@intel.com> >> Signed-off-by: Prarit Bhargava <prarit@redhat.com> >> --- >> drivers/powercap/intel_rapl.c | 31 >> +++++++++++++++++++++++++++++++ >> drivers/powercap/powercap_sys.c | 6 ++++-- >> 2 files changed, 35 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/powercap/intel_rapl.c >> b/drivers/powercap/intel_rapl.c >> index 6c592dc..feb063d 100644 >> --- a/drivers/powercap/intel_rapl.c >> +++ b/drivers/powercap/intel_rapl.c >> @@ -493,13 +493,42 @@ static int get_current_power_limit(struct >> powercap_zone *power_zone, int id, >> return ret; >> } >> >> +static int get_max_time_window(struct powercap_zone *power_zone, int >> id, >> + u64 *data) >> +{ >> + struct rapl_domain *rd; >> + int ret = 0; >> + u64 val; >> + >> + get_online_cpus(); >> + rd = power_zone_to_rapl_domain(power_zone); >> + >> + if (rapl_read_data_raw(rd, MAX_TIME_WINDOW, true, &val)) >> + ret = -EIO; >> + else >> + *data = val; >> + >> + put_online_cpus(); >> + return ret; >> +} >> + >> static int set_time_window(struct powercap_zone *power_zone, int id, >> u64 >> window) >> { >> struct rapl_domain *rd; >> int ret = 0; >> + u64 max_window; >> >> get_online_cpus(); >> + ret = get_max_time_window(power_zone, id, &max_window); >> + if (ret < 0) >> + goto out; >> + >> + if (window > max_window) { >> + ret = -EINVAL; >> + goto out; >> + } >> + >> rd = power_zone_to_rapl_domain(power_zone); >> switch (rd->rpl[id].prim_id) { >> case PL1_ENABLE: >> @@ -511,6 +540,7 @@ static int set_time_window(struct powercap_zone >> *power_zone, int id, >> default: >> ret = -EINVAL; >> } >> +out: >> put_online_cpus(); >> return ret; >> } >> @@ -590,6 +620,7 @@ static const struct powercap_zone_constraint_ops >> constraint_ops = { >> .set_time_window_us = set_time_window, >> .get_time_window_us = get_time_window, >> .get_max_power_uw = get_max_power, >> + .get_max_time_window_us = get_max_time_window, >> .get_name = get_constraint_name, >> }; >> >> diff --git a/drivers/powercap/powercap_sys.c >> b/drivers/powercap/powercap_sys.c >> index 14bde0d..53fad0f 100644 >> --- a/drivers/powercap/powercap_sys.c >> +++ b/drivers/powercap/powercap_sys.c >> @@ -101,7 +101,7 @@ static ssize_t store_constraint_##_attr(struct >> device *dev,\ >> int err; \ >> u64 value; \ >> struct powercap_zone *power_zone = to_powercap_zone(dev); \ >> - int id; \ >> + int id, ret; \ >> struct powercap_zone_constraint *pconst;\ >> \ >> if (!sscanf(dev_attr->attr.name, "constraint_%d_", &id)) \ >> @@ -113,8 +113,10 @@ static ssize_t store_constraint_##_attr(struct >> device *dev,\ >> if (err) \ >> return -EINVAL; \ >> if (pconst && pconst->ops && pconst->ops->set_##_attr) { \ >> - if (!pconst->ops->set_##_attr(power_zone, id, >> value)) \ >> + ret = pconst->ops->set_##_attr(power_zone, id, >> value); \ >> + if (!ret) \ >> return count; \ >> + return ret; \ >> } \ >> \ >> return -ENODATA; \ -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 03/31/2016 02:28 PM, Pandruvada, Srinivas wrote: > On Mon, 2016-03-21 at 08:27 -0400, Prarit Bhargava wrote: >> The MSR_PKG_POWER_INFO register (Intel ASDM, section 14.9.3 >> "Package RAPL Domain") provides a maximum time window which the >> system can support. This window is read-only and is currently >> not examined when setting the time windows for the package. >> > Usually this field has lot of junk. It is not supported uniformly. > The system provides this value from another ACPI element called PPCC. > If supported this will be in > > $ /sys/bus/pci/devices/0000:00:04.0/power_limits > $ grep . * > power_limit_0_max_uw:15000000 > power_limit_0_min_uw:125000 > power_limit_0_step_uw:1000000 > power_limit_0_tmax_us:32000000 > power_limit_0_tmin_us:28000000 > power_limit_1_max_uw:25000000 > power_limit_1_min_uw:25000000 > power_limit_1_step_uw:1000000 > power_limit_1_tmax_us:0 > power_limit_1_tmin_us:0 > Thanks Srinivas. Does this mean I should check for PPCC? P. > Thanks, > Srinivas >> This patch implements get_max_time_window_us() and checks the window >> when >> a user attempts to set power capping for the package. >> >> Before the patch it was possible to set the window to, for example, >> 10000 >> micro seconds: >> >> [root@intel-chiefriver-03 rhel7]# echo 10000 > >> /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl\:0/constraint_0_time_window_us; >> egrep ^ /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl\:0/constraint_0_time_window_us >> >> /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl:0/constraint_0_time_window_us:1:9765 >> >> but from 'turbostat -d', the package is limited to 976us: >> >> cpu0: MSR_PKG_POWER_INFO: 0x01200168 (45 W TDP, RAPL 36 - 0 W, >> 0.000977 sec.) >> >> (Note, there appears to be a rounding issue in turbostat which needs >> to >> also be fixed. Looking at the values in the register it is clear the >> value is 1/1024 = 976us.) >> >> After the patch we are limited by the maximum time window: >> >> [root@intel-chiefriver-03 rhel7]# echo 10000 > >> /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl\:0/constraint_0_time_window_us; >> egrep ^ /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl\:0/constraint_0_time_window_us >> >> -bash: echo: write error: Invalid argument >> /sys/devices/virtual/powercap/intel-rapl/intel- >> rapl:0/constraint_0_time_window_us:1:976 >> >> Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> >> Cc: Prarit Bhargava <prarit@redhat.com> >> Cc: Radivoje Jovanovic <radivoje.jovanovic@intel.com> >> Cc: Seiichi Ikarashi <s.ikarashi@jp.fujitsu.com> >> Cc: Mathias Krause <minipli@googlemail.com> >> Cc: Ajay Thomas <ajay.thomas.david.rajamanickam@intel.com> >> Signed-off-by: Prarit Bhargava <prarit@redhat.com> >> --- >> drivers/powercap/intel_rapl.c | 31 >> +++++++++++++++++++++++++++++++ >> drivers/powercap/powercap_sys.c | 6 ++++-- >> 2 files changed, 35 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/powercap/intel_rapl.c >> b/drivers/powercap/intel_rapl.c >> index 6c592dc..feb063d 100644 >> --- a/drivers/powercap/intel_rapl.c >> +++ b/drivers/powercap/intel_rapl.c >> @@ -493,13 +493,42 @@ static int get_current_power_limit(struct >> powercap_zone *power_zone, int id, >> return ret; >> } >> >> +static int get_max_time_window(struct powercap_zone *power_zone, int >> id, >> + u64 *data) >> +{ >> + struct rapl_domain *rd; >> + int ret = 0; >> + u64 val; >> + >> + get_online_cpus(); >> + rd = power_zone_to_rapl_domain(power_zone); >> + >> + if (rapl_read_data_raw(rd, MAX_TIME_WINDOW, true, &val)) >> + ret = -EIO; >> + else >> + *data = val; >> + >> + put_online_cpus(); >> + return ret; >> +} >> + >> static int set_time_window(struct powercap_zone *power_zone, int id, >> u64 >> window) >> { >> struct rapl_domain *rd; >> int ret = 0; >> + u64 max_window; >> >> get_online_cpus(); >> + ret = get_max_time_window(power_zone, id, &max_window); >> + if (ret < 0) >> + goto out; >> + >> + if (window > max_window) { >> + ret = -EINVAL; >> + goto out; >> + } >> + >> rd = power_zone_to_rapl_domain(power_zone); >> switch (rd->rpl[id].prim_id) { >> case PL1_ENABLE: >> @@ -511,6 +540,7 @@ static int set_time_window(struct powercap_zone >> *power_zone, int id, >> default: >> ret = -EINVAL; >> } >> +out: >> put_online_cpus(); >> return ret; >> } >> @@ -590,6 +620,7 @@ static const struct powercap_zone_constraint_ops >> constraint_ops = { >> .set_time_window_us = set_time_window, >> .get_time_window_us = get_time_window, >> .get_max_power_uw = get_max_power, >> + .get_max_time_window_us = get_max_time_window, >> .get_name = get_constraint_name, >> }; >> >> diff --git a/drivers/powercap/powercap_sys.c >> b/drivers/powercap/powercap_sys.c >> index 14bde0d..53fad0f 100644 >> --- a/drivers/powercap/powercap_sys.c >> +++ b/drivers/powercap/powercap_sys.c >> @@ -101,7 +101,7 @@ static ssize_t store_constraint_##_attr(struct >> device *dev,\ >> int err; \ >> u64 value; \ >> struct powercap_zone *power_zone = to_powercap_zone(dev); \ >> - int id; \ >> + int id, ret; \ >> struct powercap_zone_constraint *pconst;\ >> \ >> if (!sscanf(dev_attr->attr.name, "constraint_%d_", &id)) \ >> @@ -113,8 +113,10 @@ static ssize_t store_constraint_##_attr(struct >> device *dev,\ >> if (err) \ >> return -EINVAL; \ >> if (pconst && pconst->ops && pconst->ops->set_##_attr) { \ >> - if (!pconst->ops->set_##_attr(power_zone, id, >> value)) \ >> + ret = pconst->ops->set_##_attr(power_zone, id, >> value); \ >> + if (!ret) \ >> return count; \ >> + return ret; \ >> } \ >> \ >> return -ENODATA; \ -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
T24gTW9uLCAyMDE2LTA0LTExIGF0IDA3OjMzIC0wNDAwLCBQcmFyaXQgQmhhcmdhdmEgd3JvdGU6 DQo+IA0KPiBPbiAwMy8zMS8yMDE2IDAyOjI4IFBNLCBQYW5kcnV2YWRhLCBTcmluaXZhcyB3cm90 ZToNCj4gPiBPbiBNb24sIDIwMTYtMDMtMjEgYXQgMDg6MjcgLTA0MDAsIFByYXJpdCBCaGFyZ2F2 YSB3cm90ZToNCj4gPiA+IFRoZSBNU1JfUEtHX1BPV0VSX0lORk8gcmVnaXN0ZXIgKEludGVsIEFT RE0sIHNlY3Rpb24gMTQuOS4zDQo+ID4gPiAiUGFja2FnZSBSQVBMIERvbWFpbiIpIHByb3ZpZGVz IGEgbWF4aW11bSB0aW1lIHdpbmRvdyB3aGljaCB0aGUNCj4gPiA+IHN5c3RlbSBjYW4gc3VwcG9y dC7CoMKgVGhpcyB3aW5kb3cgaXMgcmVhZC1vbmx5IGFuZCBpcyBjdXJyZW50bHkNCj4gPiA+IG5v dCBleGFtaW5lZCB3aGVuIHNldHRpbmcgdGhlIHRpbWUgd2luZG93cyBmb3IgdGhlIHBhY2thZ2Uu DQo+ID4gPiANCj4gPiBVc3VhbGx5IHRoaXMgZmllbGQgaGFzIGxvdCBvZiBqdW5rLiBJdCBpcyBu b3Qgc3VwcG9ydGVkIHVuaWZvcm1seS4NCj4gPiBUaGUgc3lzdGVtIHByb3ZpZGVzIHRoaXMgdmFs dWUgZnJvbSBhbm90aGVyIEFDUEkgZWxlbWVudCBjYWxsZWQNCj4gPiBQUENDLg0KPiA+IElmIHN1 cHBvcnRlZCB0aGlzIHdpbGwgYmUgaW7CoA0KPiA+IA0KPiA+ICQgL3N5cy9idXMvcGNpL2Rldmlj ZXMvMDAwMDowMDowNC4wL3Bvd2VyX2xpbWl0cw0KPiA+ICQgZ3JlcCAuICoNCj4gPiBwb3dlcl9s aW1pdF8wX21heF91dzoxNTAwMDAwMA0KPiA+IHBvd2VyX2xpbWl0XzBfbWluX3V3OjEyNTAwMA0K PiA+IHBvd2VyX2xpbWl0XzBfc3RlcF91dzoxMDAwMDAwDQo+ID4gcG93ZXJfbGltaXRfMF90bWF4 X3VzOjMyMDAwMDAwDQo+ID4gcG93ZXJfbGltaXRfMF90bWluX3VzOjI4MDAwMDAwDQo+ID4gcG93 ZXJfbGltaXRfMV9tYXhfdXc6MjUwMDAwMDANCj4gPiBwb3dlcl9saW1pdF8xX21pbl91dzoyNTAw MDAwMA0KPiA+IHBvd2VyX2xpbWl0XzFfc3RlcF91dzoxMDAwMDAwDQo+ID4gcG93ZXJfbGltaXRf MV90bWF4X3VzOjANCj4gPiBwb3dlcl9saW1pdF8xX3RtaW5fdXM6MA0KPiA+IA0KPiANCj4gVGhh bmtzIFNyaW5pdmFzLsKgwqBEb2VzIHRoaXMgbWVhbiBJIHNob3VsZCBjaGVjayBmb3IgUFBDQz8N CklmIHlvdXIgcGxhdGZvcm0gaGFzIHN1cHBvcnQgZm9yIHRoaXMgZWxlbWVudC4NCkFyZSB5b3Ug dHJ5aW5nIHRvIHNvbHZlIHNwZWNpZmljIHByb2JsZW0gb3IgaW1wbGVtZW50IHNvbWUgZmVhdHVy ZQ0KdXNpbmcgUkFQTD8gTWF5IGJlIHdlIGNhbiBoZWxwLCB3aGF0IHRpbWUgd2luZG93IHRvIHNl dC4NCg0KVGhhbmtzLA0KU3Jpbml2YXMNCg0KPiANCj4gUC4NCj4gDQo+ID4gVGhhbmtzLA0KPiA+ IFNyaW5pdmFzDQo+ID4gPiBUaGlzIHBhdGNoIGltcGxlbWVudHMgZ2V0X21heF90aW1lX3dpbmRv d191cygpIGFuZCBjaGVja3MgdGhlDQo+ID4gPiB3aW5kb3cNCj4gPiA+IHdoZW4NCj4gPiA+IGEg dXNlciBhdHRlbXB0cyB0byBzZXQgcG93ZXIgY2FwcGluZyBmb3IgdGhlIHBhY2thZ2UuDQo+ID4g PiANCj4gPiA+IEJlZm9yZSB0aGUgcGF0Y2ggaXQgd2FzIHBvc3NpYmxlIHRvIHNldCB0aGUgd2lu ZG93IHRvLCBmb3INCj4gPiA+IGV4YW1wbGUsDQo+ID4gPiAxMDAwMA0KPiA+ID4gbWljcm8gc2Vj b25kczoNCj4gPiA+IA0KPiA+ID4gW3Jvb3RAaW50ZWwtY2hpZWZyaXZlci0wMyByaGVsN10jIGVj aG8gMTAwMDAgPg0KPiA+ID4gL3N5cy9kZXZpY2VzL3ZpcnR1YWwvcG93ZXJjYXAvaW50ZWwtcmFw bC9pbnRlbC0NCj4gPiA+IHJhcGxcOjAvY29uc3RyYWludF8wX3RpbWVfd2luZG93X3VzOw0KPiA+ ID4gZWdyZXAgXiAvc3lzL2RldmljZXMvdmlydHVhbC9wb3dlcmNhcC9pbnRlbC1yYXBsL2ludGVs LQ0KPiA+ID4gcmFwbFw6MC9jb25zdHJhaW50XzBfdGltZV93aW5kb3dfdXMNCj4gPiA+IA0KPiA+ ID4gL3N5cy9kZXZpY2VzL3ZpcnR1YWwvcG93ZXJjYXAvaW50ZWwtcmFwbC9pbnRlbC0NCj4gPiA+ IHJhcGw6MC9jb25zdHJhaW50XzBfdGltZV93aW5kb3dfdXM6MTo5NzY1DQo+ID4gPiANCj4gPiA+ IGJ1dCBmcm9tICd0dXJib3N0YXQgLWQnLCB0aGUgcGFja2FnZSBpcyBsaW1pdGVkIHRvIDk3NnVz Og0KPiA+ID4gDQo+ID4gPiBjcHUwOiBNU1JfUEtHX1BPV0VSX0lORk86IDB4MDEyMDAxNjggKDQ1 IFcgVERQLCBSQVBMIDM2IC0gMCBXLA0KPiA+ID4gMC4wMDA5Nzcgc2VjLikNCj4gPiA+IA0KPiA+ ID4gKE5vdGUsIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSByb3VuZGluZyBpc3N1ZSBpbiB0dXJib3N0 YXQgd2hpY2gNCj4gPiA+IG5lZWRzDQo+ID4gPiB0bw0KPiA+ID4gYWxzbyBiZSBmaXhlZC7CoMKg TG9va2luZyBhdCB0aGUgdmFsdWVzIGluIHRoZSByZWdpc3RlciBpdCBpcyBjbGVhcg0KPiA+ID4g dGhlDQo+ID4gPiB2YWx1ZSBpcyAxLzEwMjQgPSA5NzZ1cy4pDQo+ID4gPiANCj4gPiA+IEFmdGVy IHRoZSBwYXRjaCB3ZSBhcmUgbGltaXRlZCBieSB0aGUgbWF4aW11bSB0aW1lIHdpbmRvdzoNCj4g PiA+IA0KPiA+ID4gW3Jvb3RAaW50ZWwtY2hpZWZyaXZlci0wMyByaGVsN10jIGVjaG8gMTAwMDAg Pg0KPiA+ID4gL3N5cy9kZXZpY2VzL3ZpcnR1YWwvcG93ZXJjYXAvaW50ZWwtcmFwbC9pbnRlbC0N Cj4gPiA+IHJhcGxcOjAvY29uc3RyYWludF8wX3RpbWVfd2luZG93X3VzOw0KPiA+ID4gZWdyZXAg XiAvc3lzL2RldmljZXMvdmlydHVhbC9wb3dlcmNhcC9pbnRlbC1yYXBsL2ludGVsLQ0KPiA+ID4g cmFwbFw6MC9jb25zdHJhaW50XzBfdGltZV93aW5kb3dfdXMNCj4gPiA+IA0KPiA+ID4gLWJhc2g6 IGVjaG86IHdyaXRlIGVycm9yOiBJbnZhbGlkIGFyZ3VtZW50DQo+ID4gPiAvc3lzL2RldmljZXMv dmlydHVhbC9wb3dlcmNhcC9pbnRlbC1yYXBsL2ludGVsLQ0KPiA+ID4gcmFwbDowL2NvbnN0cmFp bnRfMF90aW1lX3dpbmRvd191czoxOjk3Ng0KPiA+ID4gDQo+ID4gPiBDYzogIlJhZmFlbCBKLiBX eXNvY2tpIiA8cmFmYWVsLmoud3lzb2NraUBpbnRlbC5jb20+DQo+ID4gPiBDYzogUHJhcml0IEJo YXJnYXZhIDxwcmFyaXRAcmVkaGF0LmNvbT4NCj4gPiA+IENjOiBSYWRpdm9qZSBKb3Zhbm92aWMg PHJhZGl2b2plLmpvdmFub3ZpY0BpbnRlbC5jb20+DQo+ID4gPiBDYzogU2VpaWNoaSBJa2FyYXNo aSA8cy5pa2FyYXNoaUBqcC5mdWppdHN1LmNvbT4NCj4gPiA+IENjOiBNYXRoaWFzIEtyYXVzZSA8 bWluaXBsaUBnb29nbGVtYWlsLmNvbT4NCj4gPiA+IENjOiBBamF5IFRob21hcyA8YWpheS50aG9t YXMuZGF2aWQucmFqYW1hbmlja2FtQGludGVsLmNvbT4NCj4gPiA+IFNpZ25lZC1vZmYtYnk6IFBy YXJpdCBCaGFyZ2F2YSA8cHJhcml0QHJlZGhhdC5jb20+DQo+ID4gPiAtLS0NCj4gPiA+IMKgZHJp dmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmPCoMKgwqB8wqDCoMKgMzENCj4gPiA+ICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysNCj4gPiA+IMKgZHJpdmVycy9wb3dlcmNhcC9wb3dlcmNh cF9zeXMuYyB8wqDCoMKgwqA2ICsrKystLQ0KPiA+ID4gwqAyIGZpbGVzIGNoYW5nZWQsIDM1IGlu c2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pDQo+ID4gPiANCj4gPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYw0KPiA+ID4gYi9kcml2ZXJzL3Bvd2VyY2FwL2lu dGVsX3JhcGwuYw0KPiA+ID4gaW5kZXggNmM1OTJkYy4uZmViMDYzZCAxMDA2NDQNCj4gPiA+IC0t LSBhL2RyaXZlcnMvcG93ZXJjYXAvaW50ZWxfcmFwbC5jDQo+ID4gPiArKysgYi9kcml2ZXJzL3Bv d2VyY2FwL2ludGVsX3JhcGwuYw0KPiA+ID4gQEAgLTQ5MywxMyArNDkzLDQyIEBAIHN0YXRpYyBp bnQgZ2V0X2N1cnJlbnRfcG93ZXJfbGltaXQoc3RydWN0DQo+ID4gPiBwb3dlcmNhcF96b25lICpw b3dlcl96b25lLCBpbnQgaWQsDQo+ID4gPiDCoAlyZXR1cm4gcmV0Ow0KPiA+ID4gwqB9DQo+ID4g PiDCoA0KPiA+ID4gK3N0YXRpYyBpbnQgZ2V0X21heF90aW1lX3dpbmRvdyhzdHJ1Y3QgcG93ZXJj YXBfem9uZSAqcG93ZXJfem9uZSwNCj4gPiA+IGludA0KPiA+ID4gaWQsDQo+ID4gPiArCQkJwqDC oMKgwqDCoMKgwqB1NjQgKmRhdGEpDQo+ID4gPiArew0KPiA+ID4gKwlzdHJ1Y3QgcmFwbF9kb21h aW4gKnJkOw0KPiA+ID4gKwlpbnQgcmV0ID0gMDsNCj4gPiA+ICsJdTY0IHZhbDsNCj4gPiA+ICsN Cj4gPiA+ICsJZ2V0X29ubGluZV9jcHVzKCk7DQo+ID4gPiArCXJkID0gcG93ZXJfem9uZV90b19y YXBsX2RvbWFpbihwb3dlcl96b25lKTsNCj4gPiA+ICsNCj4gPiA+ICsJaWYgKHJhcGxfcmVhZF9k YXRhX3JhdyhyZCwgTUFYX1RJTUVfV0lORE9XLCB0cnVlLCAmdmFsKSkNCj4gPiA+ICsJCXJldCA9 IC1FSU87DQo+ID4gPiArCWVsc2UNCj4gPiA+ICsJCSpkYXRhID0gdmFsOw0KPiA+ID4gKw0KPiA+ ID4gKwlwdXRfb25saW5lX2NwdXMoKTsNCj4gPiA+ICsJcmV0dXJuIHJldDsNCj4gPiA+ICt9DQo+ ID4gPiArDQo+ID4gPiDCoHN0YXRpYyBpbnQgc2V0X3RpbWVfd2luZG93KHN0cnVjdCBwb3dlcmNh cF96b25lICpwb3dlcl96b25lLCBpbnQNCj4gPiA+IGlkLA0KPiA+ID4gwqAJCQkJCQkJCQ0KPiA+ ID4gdTY0DQo+ID4gPiB3aW5kb3cpDQo+ID4gPiDCoHsNCj4gPiA+IMKgCXN0cnVjdCByYXBsX2Rv bWFpbiAqcmQ7DQo+ID4gPiDCoAlpbnQgcmV0ID0gMDsNCj4gPiA+ICsJdTY0IG1heF93aW5kb3c7 DQo+ID4gPiDCoA0KPiA+ID4gwqAJZ2V0X29ubGluZV9jcHVzKCk7DQo+ID4gPiArCXJldCA9IGdl dF9tYXhfdGltZV93aW5kb3cocG93ZXJfem9uZSwgaWQsICZtYXhfd2luZG93KTsNCj4gPiA+ICsJ aWYgKHJldCA8IDApDQo+ID4gPiArCQlnb3RvIG91dDsNCj4gPiA+ICsNCj4gPiA+ICsJaWYgKHdp bmRvdyA+IG1heF93aW5kb3cpIHsNCj4gPiA+ICsJCXJldCA9IC1FSU5WQUw7DQo+ID4gPiArCQln b3RvIG91dDsNCj4gPiA+ICsJfQ0KPiA+ID4gKw0KPiA+ID4gwqAJcmQgPSBwb3dlcl96b25lX3Rv X3JhcGxfZG9tYWluKHBvd2VyX3pvbmUpOw0KPiA+ID4gwqAJc3dpdGNoIChyZC0+cnBsW2lkXS5w cmltX2lkKSB7DQo+ID4gPiDCoAljYXNlIFBMMV9FTkFCTEU6DQo+ID4gPiBAQCAtNTExLDYgKzU0 MCw3IEBAIHN0YXRpYyBpbnQgc2V0X3RpbWVfd2luZG93KHN0cnVjdA0KPiA+ID4gcG93ZXJjYXBf em9uZQ0KPiA+ID4gKnBvd2VyX3pvbmUsIGludCBpZCwNCj4gPiA+IMKgCWRlZmF1bHQ6DQo+ID4g PiDCoAkJcmV0ID0gLUVJTlZBTDsNCj4gPiA+IMKgCX0NCj4gPiA+ICtvdXQ6DQo+ID4gPiDCoAlw dXRfb25saW5lX2NwdXMoKTsNCj4gPiA+IMKgCXJldHVybiByZXQ7DQo+ID4gPiDCoH0NCj4gPiA+ IEBAIC01OTAsNiArNjIwLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdA0KPiA+ID4gcG93ZXJjYXBf em9uZV9jb25zdHJhaW50X29wcw0KPiA+ID4gY29uc3RyYWludF9vcHMgPSB7DQo+ID4gPiDCoAku c2V0X3RpbWVfd2luZG93X3VzID0gc2V0X3RpbWVfd2luZG93LA0KPiA+ID4gwqAJLmdldF90aW1l X3dpbmRvd191cyA9IGdldF90aW1lX3dpbmRvdywNCj4gPiA+IMKgCS5nZXRfbWF4X3Bvd2VyX3V3 ID0gZ2V0X21heF9wb3dlciwNCj4gPiA+ICsJLmdldF9tYXhfdGltZV93aW5kb3dfdXMgPSBnZXRf bWF4X3RpbWVfd2luZG93LA0KPiA+ID4gwqAJLmdldF9uYW1lID0gZ2V0X2NvbnN0cmFpbnRfbmFt ZSwNCj4gPiA+IMKgfTsNCj4gPiA+IMKgDQo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dl cmNhcC9wb3dlcmNhcF9zeXMuYw0KPiA+ID4gYi9kcml2ZXJzL3Bvd2VyY2FwL3Bvd2VyY2FwX3N5 cy5jDQo+ID4gPiBpbmRleCAxNGJkZTBkLi41M2ZhZDBmIDEwMDY0NA0KPiA+ID4gLS0tIGEvZHJp dmVycy9wb3dlcmNhcC9wb3dlcmNhcF9zeXMuYw0KPiA+ID4gKysrIGIvZHJpdmVycy9wb3dlcmNh cC9wb3dlcmNhcF9zeXMuYw0KPiA+ID4gQEAgLTEwMSw3ICsxMDEsNyBAQCBzdGF0aWMgc3NpemVf dA0KPiA+ID4gc3RvcmVfY29uc3RyYWludF8jI19hdHRyKHN0cnVjdA0KPiA+ID4gZGV2aWNlICpk ZXYsXA0KPiA+ID4gwqAJaW50IGVycjsgXA0KPiA+ID4gwqAJdTY0IHZhbHVlOyBcDQo+ID4gPiDC oAlzdHJ1Y3QgcG93ZXJjYXBfem9uZSAqcG93ZXJfem9uZSA9DQo+ID4gPiB0b19wb3dlcmNhcF96 b25lKGRldik7IFwNCj4gPiA+IC0JaW50IGlkOyBcDQo+ID4gPiArCWludCBpZCwgcmV0OyBcDQo+ ID4gPiDCoAlzdHJ1Y3QgcG93ZXJjYXBfem9uZV9jb25zdHJhaW50ICpwY29uc3Q7XA0KPiA+ID4g wqAJXA0KPiA+ID4gwqAJaWYgKCFzc2NhbmYoZGV2X2F0dHItPmF0dHIubmFtZSwgImNvbnN0cmFp bnRfJWRfIiwgJmlkKSkNCj4gPiA+IFwNCj4gPiA+IEBAIC0xMTMsOCArMTEzLDEwIEBAIHN0YXRp YyBzc2l6ZV90DQo+ID4gPiBzdG9yZV9jb25zdHJhaW50XyMjX2F0dHIoc3RydWN0DQo+ID4gPiBk ZXZpY2UgKmRldixcDQo+ID4gPiDCoAlpZiAoZXJyKSBcDQo+ID4gPiDCoAkJcmV0dXJuIC1FSU5W QUw7IFwNCj4gPiA+IMKgCWlmIChwY29uc3QgJiYgcGNvbnN0LT5vcHMgJiYgcGNvbnN0LT5vcHMt PnNldF8jI19hdHRyKSB7DQo+ID4gPiBcDQo+ID4gPiAtCQlpZiAoIXBjb25zdC0+b3BzLT5zZXRf IyNfYXR0cihwb3dlcl96b25lLCBpZCwNCj4gPiA+IHZhbHVlKSkgXA0KPiA+ID4gKwkJcmV0ID0g cGNvbnN0LT5vcHMtPnNldF8jI19hdHRyKHBvd2VyX3pvbmUsIGlkLA0KPiA+ID4gdmFsdWUpOyBc DQo+ID4gPiArCQlpZiAoIXJldCkgXA0KPiA+ID4gwqAJCQlyZXR1cm4gY291bnQ7IFwNCj4gPiA+ ICsJCXJldHVybiByZXQ7IFwNCj4gPiA+IMKgCX0gXA0KPiA+ID4gwqAJXA0KPiA+ID4gwqAJcmV0 dXJuIC1FTk9EQVRBOyBc -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/powercap/intel_rapl.c b/drivers/powercap/intel_rapl.c index 6c592dc..feb063d 100644 --- a/drivers/powercap/intel_rapl.c +++ b/drivers/powercap/intel_rapl.c @@ -493,13 +493,42 @@ static int get_current_power_limit(struct powercap_zone *power_zone, int id, return ret; } +static int get_max_time_window(struct powercap_zone *power_zone, int id, + u64 *data) +{ + struct rapl_domain *rd; + int ret = 0; + u64 val; + + get_online_cpus(); + rd = power_zone_to_rapl_domain(power_zone); + + if (rapl_read_data_raw(rd, MAX_TIME_WINDOW, true, &val)) + ret = -EIO; + else + *data = val; + + put_online_cpus(); + return ret; +} + static int set_time_window(struct powercap_zone *power_zone, int id, u64 window) { struct rapl_domain *rd; int ret = 0; + u64 max_window; get_online_cpus(); + ret = get_max_time_window(power_zone, id, &max_window); + if (ret < 0) + goto out; + + if (window > max_window) { + ret = -EINVAL; + goto out; + } + rd = power_zone_to_rapl_domain(power_zone); switch (rd->rpl[id].prim_id) { case PL1_ENABLE: @@ -511,6 +540,7 @@ static int set_time_window(struct powercap_zone *power_zone, int id, default: ret = -EINVAL; } +out: put_online_cpus(); return ret; } @@ -590,6 +620,7 @@ static const struct powercap_zone_constraint_ops constraint_ops = { .set_time_window_us = set_time_window, .get_time_window_us = get_time_window, .get_max_power_uw = get_max_power, + .get_max_time_window_us = get_max_time_window, .get_name = get_constraint_name, }; diff --git a/drivers/powercap/powercap_sys.c b/drivers/powercap/powercap_sys.c index 14bde0d..53fad0f 100644 --- a/drivers/powercap/powercap_sys.c +++ b/drivers/powercap/powercap_sys.c @@ -101,7 +101,7 @@ static ssize_t store_constraint_##_attr(struct device *dev,\ int err; \ u64 value; \ struct powercap_zone *power_zone = to_powercap_zone(dev); \ - int id; \ + int id, ret; \ struct powercap_zone_constraint *pconst;\ \ if (!sscanf(dev_attr->attr.name, "constraint_%d_", &id)) \ @@ -113,8 +113,10 @@ static ssize_t store_constraint_##_attr(struct device *dev,\ if (err) \ return -EINVAL; \ if (pconst && pconst->ops && pconst->ops->set_##_attr) { \ - if (!pconst->ops->set_##_attr(power_zone, id, value)) \ + ret = pconst->ops->set_##_attr(power_zone, id, value); \ + if (!ret) \ return count; \ + return ret; \ } \ \ return -ENODATA; \
The MSR_PKG_POWER_INFO register (Intel ASDM, section 14.9.3 "Package RAPL Domain") provides a maximum time window which the system can support. This window is read-only and is currently not examined when setting the time windows for the package. This patch implements get_max_time_window_us() and checks the window when a user attempts to set power capping for the package. Before the patch it was possible to set the window to, for example, 10000 micro seconds: [root@intel-chiefriver-03 rhel7]# echo 10000 > /sys/devices/virtual/powercap/intel-rapl/intel-rapl\:0/constraint_0_time_window_us; egrep ^ /sys/devices/virtual/powercap/intel-rapl/intel-rapl\:0/constraint_0_time_window_us /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/constraint_0_time_window_us:1:9765 but from 'turbostat -d', the package is limited to 976us: cpu0: MSR_PKG_POWER_INFO: 0x01200168 (45 W TDP, RAPL 36 - 0 W, 0.000977 sec.) (Note, there appears to be a rounding issue in turbostat which needs to also be fixed. Looking at the values in the register it is clear the value is 1/1024 = 976us.) After the patch we are limited by the maximum time window: [root@intel-chiefriver-03 rhel7]# echo 10000 > /sys/devices/virtual/powercap/intel-rapl/intel-rapl\:0/constraint_0_time_window_us; egrep ^ /sys/devices/virtual/powercap/intel-rapl/intel-rapl\:0/constraint_0_time_window_us -bash: echo: write error: Invalid argument /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/constraint_0_time_window_us:1:976 Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> Cc: Prarit Bhargava <prarit@redhat.com> Cc: Radivoje Jovanovic <radivoje.jovanovic@intel.com> Cc: Seiichi Ikarashi <s.ikarashi@jp.fujitsu.com> Cc: Mathias Krause <minipli@googlemail.com> Cc: Ajay Thomas <ajay.thomas.david.rajamanickam@intel.com> Signed-off-by: Prarit Bhargava <prarit@redhat.com> --- drivers/powercap/intel_rapl.c | 31 +++++++++++++++++++++++++++++++ drivers/powercap/powercap_sys.c | 6 ++++-- 2 files changed, 35 insertions(+), 2 deletions(-)