Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1421357 > unrolled thread
| Started by | Benjamin Herrenschmidt <benh@au1.ibm.com> |
|---|---|
| First post | 2016-06-13 23:50 +0200 |
| Last post | 2016-06-14 13:40 +0200 |
| Articles | 3 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCH v6 10/11] cpuidle/powernv: Add support for POWER ISA v3 idle states Benjamin Herrenschmidt <benh@au1.ibm.com> - 2016-06-13 23:50 +0200
Re: [PATCH v6 10/11] cpuidle/powernv: Add support for POWER ISA v3 idle states Shreyas B Prabhu <shreyas@linux.vnet.ibm.com> - 2016-06-14 13:20 +0200
Re: [PATCH v6 10/11] cpuidle/powernv: Add support for POWER ISA v3 idle states Benjamin Herrenschmidt <benh@au1.ibm.com> - 2016-06-14 13:40 +0200
| From | Benjamin Herrenschmidt <benh@au1.ibm.com> |
|---|---|
| Date | 2016-06-13 23:50 +0200 |
| Subject | Re: [PATCH v6 10/11] cpuidle/powernv: Add support for POWER ISA v3 idle states |
| Message-ID | <rJHU5-3wH-1@gated-at.bofh.it> |
On Wed, 2016-06-08 at 11:54 -0500, Shreyas B. Prabhu wrote:
>
> /*
> * States for dedicated partition case.
> */
> @@ -167,6 +183,8 @@ static int powernv_add_idle_states(void)
> int nr_idle_states = 1; /* Snooze */
> int dt_idle_states;
> u32 *latency_ns, *residency_ns, *flags;
> + u64 *psscr_val = NULL;
> + const char *names[CPUIDLE_STATE_MAX];
> int i, rc;
>
> /* Currently we have snooze statically defined */
> @@ -199,12 +217,41 @@ static int powernv_add_idle_states(void)
> goto out_free_latency;
> }
>
> + rc = of_property_read_string_array(power_mgt,
> + "ibm,cpu-idle-state-names", names,
> + dt_idle_states);
Ok so from this I assume that dt_idle_states is the number of entries,
which has been checked properly to be < CPUIDLE_STATE_MAX correct ?
Beause ...
> + if (rc < 0) {
> + pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-names in DT\n");
> + goto out_free_latency;
> + }
> +
> + /*
> + * If the idle states use stop instruction, probe for psscr values
> + * which are necessary to specify required stop level.
> + */
> + if (flags[0] & (OPAL_PM_STOP_INST_FAST | OPAL_PM_STOP_INST_DEEP)) {
> + psscr_val = kcalloc(dt_idle_states, sizeof(*psscr_val),
> + GFP_KERNEL);
> + rc = of_property_read_u64_array(power_mgt,
> + "ibm,cpu-idle-state-psscr",
> + psscr_val, dt_idle_states);
Here, psscr val is only one u64 ... shouldn't you kmalloc sizeof(..) *
dt_idle_states ?
> + if (rc) {
> + pr_warn("cpuidle-powernv: missing ibm,cpu-idle-states-psscr in DT\n");
> + goto out_free_psscr;
> + }
> + }
> residency_ns = kzalloc(sizeof(*residency_ns) * dt_idle_states, GFP_KERNEL);
Just like we do here
> rc = of_property_read_u32_array(power_mgt, "ibm,cpu-idle-state-residency-ns", residency_ns, dt_idle_states);
> for (i = 0; i < dt_idle_states; i++) {
> -
> + /*
> + * If an idle state has exit latency beyond
> + * POWERNV_THRESHOLD_LATENCY_NS then don't use it
> + * in cpu-idle.
> + */
> + if (latency_ns[i] > POWERNV_THRESHOLD_LATENCY_NS)
> + continue;
> /*
> * Cpuidle accepts exit_latency and target_residency in us.
> * Use default target_residency values if f/w does not expose it.
> @@ -216,6 +263,16 @@ static int powernv_add_idle_states(void)
> powernv_states[nr_idle_states].flags = 0;
> powernv_states[nr_idle_states].target_residency = 100;
> powernv_states[nr_idle_states].enter = &nap_loop;
> + } else if ((flags[i] & OPAL_PM_STOP_INST_FAST) &&
> + !(flags[i] & OPAL_PM_TIMEBASE_STOP)) {
> + strncpy(powernv_states[nr_idle_states].name,
> + names[i], CPUIDLE_NAME_LEN);
> + strncpy(powernv_states[nr_idle_states].desc,
> + names[i], CPUIDLE_NAME_LEN);
> + powernv_states[nr_idle_states].flags = 0;
> +
> + powernv_states[nr_idle_states].enter = stop_loop;
> + stop_psscr_table[nr_idle_states] = psscr_val[i];
> }
>
> /*
> @@ -231,6 +288,16 @@ static int powernv_add_idle_states(void)
> powernv_states[nr_idle_states].flags = CPUIDLE_FLAG_TIMER_STOP;
> powernv_states[nr_idle_states].target_residency = 300000;
> powernv_states[nr_idle_states].enter = &fastsleep_loop;
> + } else if ((flags[i] & OPAL_PM_STOP_INST_DEEP) &&
> + (flags[i] & OPAL_PM_TIMEBASE_STOP)) {
> + strncpy(powernv_states[nr_idle_states].name,
> + names[i], CPUIDLE_NAME_LEN);
> + strncpy(powernv_states[nr_idle_states].desc,
> + names[i], CPUIDLE_NAME_LEN);
> +
> + powernv_states[nr_idle_states].flags = CPUIDLE_FLAG_TIMER_STOP;
> + powernv_states[nr_idle_states].enter = stop_loop;
> + stop_psscr_table[nr_idle_states] = psscr_val[i];
> }
> #endif
> powernv_states[nr_idle_states].exit_latency =
> @@ -245,6 +312,8 @@ static int powernv_add_idle_states(void)
> }
>
> kfree(residency_ns);
> +out_free_psscr:
> + kfree(psscr_val);
> out_free_latency:
> kfree(latency_ns);
> out_free_flags:
[toc] | [next] | [standalone]
| From | Shreyas B Prabhu <shreyas@linux.vnet.ibm.com> |
|---|---|
| Date | 2016-06-14 13:20 +0200 |
| Message-ID | <rJUxX-46H-11@gated-at.bofh.it> |
| In reply to | #1421357 |
On 06/14/2016 03:18 AM, Benjamin Herrenschmidt wrote:
> On Wed, 2016-06-08 at 11:54 -0500, Shreyas B. Prabhu wrote:
>>
>> /*
>> * States for dedicated partition case.
>> */
>> @@ -167,6 +183,8 @@ static int powernv_add_idle_states(void)
>> int nr_idle_states = 1; /* Snooze */
>> int dt_idle_states;
>> u32 *latency_ns, *residency_ns, *flags;
>> + u64 *psscr_val = NULL;
>> + const char *names[CPUIDLE_STATE_MAX];
>> int i, rc;
>>
>> /* Currently we have snooze statically defined */
>> @@ -199,12 +217,41 @@ static int powernv_add_idle_states(void)
>> goto out_free_latency;
>> }
>>
>> + rc = of_property_read_string_array(power_mgt,
>> + "ibm,cpu-idle-state-names", names,
>> + dt_idle_states);
>
> Ok so from this I assume that dt_idle_states is the number of entries,
> which has been checked properly to be < CPUIDLE_STATE_MAX correct ?
>
> Beause ...
>
While dt_idle_states should not be > CPUIDLE_STATE_MAX, if that were the
case we will end up corrupting memory while updating powernv_states[].
I'll add a WARN_ON for such a case and
handle adding idle states to powernv_states accordingly. Thanks for
pointing this out.
>> + if (rc < 0) {
>> + pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-names in DT\n");
>> + goto out_free_latency;
>> + }
>> +
>> + /*
>> + * If the idle states use stop instruction, probe for psscr values
>> + * which are necessary to specify required stop level.
>> + */
>> + if (flags[0] & (OPAL_PM_STOP_INST_FAST | OPAL_PM_STOP_INST_DEEP)) {
>> + psscr_val = kcalloc(dt_idle_states, sizeof(*psscr_val),
>> + GFP_KERNEL);
>> + rc = of_property_read_u64_array(power_mgt,
>> + "ibm,cpu-idle-state-psscr",
>> + psscr_val, dt_idle_states);
>
> Here, psscr val is only one u64 ... shouldn't you kmalloc sizeof(..) *
> dt_idle_states ?
I'm using kcalloc here since checkpatch script suggested kcalloc over
kzalloc for allocating memory for arrays.
I'll also include a patch to use kcalloc throughout the file for
uniformity in next version. I was originally planning to post that
cleanup separately.
Thanks,
Shreyas
[toc] | [prev] | [next] | [standalone]
| From | Benjamin Herrenschmidt <benh@au1.ibm.com> |
|---|---|
| Date | 2016-06-14 13:40 +0200 |
| Message-ID | <rJURj-4dg-5@gated-at.bofh.it> |
| In reply to | #1421777 |
<1465404871-5406-11-git-send-email-shreyas@linux.vnet.ibm.com> <1465854492.3022.30.camel@au1.ibm.com> <575FE64C.9080107@linux.vnet.ibm.com> Organization: IBM Australia Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.20.3 (3.20.3-1.fc24) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit On Tue, 2016-06-14 at 16:41 +0530, Shreyas B Prabhu wrote: > >> + psscr_val = kcalloc(dt_idle_states, sizeof(*psscr_val), > >> + GFP_KERNEL); > >> + rc = of_property_read_u64_array(power_mgt, > >> + "ibm,cpu-idle-state-psscr", > >> + psscr_val, dt_idle_states); > > > > Here, psscr val is only one u64 ... shouldn't you kmalloc sizeof(..) * > > dt_idle_states ? > > I'm using kcalloc here since checkpatch script suggested kcalloc over > kzalloc for allocating memory for arrays. > I'll also include a patch to use kcalloc throughout the file for > uniformity in next version. I was originally planning to post that > cleanup separately. Ah ok, I missed the use of kcalloc (I didn't even know its existence), my brain just read kmalloc :-) Still, I find it inconsistent that you allocate here while you use the stack for the names. Any reason for that ? Cheers, Ben.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web