From: Gautham R Shenoy <ego@linux.vnet.ibm.com>
To: Nicholas Piggin <npiggin@gmail.com>
Cc: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>,
Michael Ellerman <mpe@ellerman.id.au>,
Michael Neuling <mikey@neuling.org>,
Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>,
Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Akshay Adiga <akshay.adiga@linux.vnet.ibm.com>,
linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org,
linux-pm@vger.kernel.org
Subject: Re: [PATCH 1/5] powernv:idle: Move device-tree parsing to one place.
Date: Fri, 7 Jul 2017 16:55:39 +0530 [thread overview]
Message-ID: <20170707112539.GA8913@in.ibm.com> (raw)
In-Reply-To: <20170707005340.003c530b@roar.ozlabs.ibm.com>
Hello Nicholas,
On Fri, Jul 07, 2017 at 12:53:40AM +1000, Nicholas Piggin wrote:
> On Wed, 5 Jul 2017 22:08:12 +0530
> "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> wrote:
>
> > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> >
> > The details of the platform idle state are exposed by the firmware to
> > the kernel via device tree.
> >
> > In the current code, we parse the device tree twice :
> >
> > 1) During the boot up in arch/powerpc/platforms/powernv/idle.c Here,
> > the device tree is parsed to obtain the details of the
> > supported_cpuidle_states which is used to determine the default idle
> > state (which would be used when cpuidle is absent) and the deepest
> > idle state (which would be used for cpu-hotplug).
> >
> > 2) During the powernv cpuidle driver initializion
> > (drivers/cpuidle/cpuidle-powernv.c). Here we parse the device tree to
> > populate the cpuidle driver's states.
> >
> > This patch moves all the device tree parsing to the platform idle
> > code. It defines data-structures for recording the details of the
> > parsed idle states. Any other kernel subsystem that is interested in
> > the idle states (eg: cpuidle-powernv driver) can just use the
> > in-kernel data structure instead of parsing the device tree all over
> > again.
> >
> > Further, this helps to check the validity of states in one place and
> > in case of invalid states (eg : stop states whose psscr values are
> > errorenous) flag them as invalid, so that the other subsystems can be
> > prevented from using those.
> >
> > Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
>
> Hi,
>
> I think the overall direction is good. A few small things.
Thanks for reviewing the patches.
>
>
> > +
> > +#define PNV_IDLE_NAME_LEN 16
> > +struct pnv_idle_state {
> > + char name[PNV_IDLE_NAME_LEN];
> > + u32 flags;
> > + u32 latency_ns;
> > + u32 residency_ns;
> > + u64 ctrl_reg_val; /* The ctrl_reg on POWER8 would be pmicr. */
> > + u64 ctrl_reg_mask; /* On POWER9 it is psscr */
> > + bool valid;
> > +};
>
> Do we use PMICR anywhere in the idle code? What about allowing for some
> machine-specific fields?
PMICR is not used anywhere so far. I will change to to psscr_val and
psscr_mask for now. If there is a use for pmicr n the future, we can
change this to the union struct as you suggest.
>
> union {
> struct { /* p9 */
> u64 psscr_val;
> u64 psscr_mask;
> };
> struct { /* p8 */
> u64 pmicr...;
>
>
> > diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c
> > index 2abee07..b747bb5 100644
> > --- a/arch/powerpc/platforms/powernv/idle.c
> > +++ b/arch/powerpc/platforms/powernv/idle.c
> > @@ -58,6 +58,17 @@
> > static u64 pnv_deepest_stop_psscr_mask;
> > static bool deepest_stop_found;
> >
> > +/*
> > + * Data structure that stores details of
> > + * all the platform idle states.
> > + */
> > +struct pnv_idle_states pnv_idle;
> > +
> > +struct pnv_idle_states *get_pnv_idle_states(void)
> > +{
> > + return &pnv_idle;
> > +}
>
> I wouldn't have the wrapper function... but it's your code so it's
> up to you. One thing though is that this function you have called get_
> just to return the pointer, but it does not take a reference or
> allocate memory or initialize the structure. Other functions with the
> same prefix do such things. Can we make something more consistent?
I agree with the wrapper function. But then the alternative was to
declare this variable as an extern so that cpuidle can access it. Is
that preferable ?
>
> ...
>
> > +/**
> > + * get_idle_prop_u32_array: Returns an array of u32 elements
> > + * parsed from the device tree corresponding
> > + * to the property provided in variable propname.
> > + *
> > + * @np: Pointer to device tree node "/ibm,opal/power-mgt"
> > + * @nr_states: Expected number of elements.
> > + * @propname : Name of the property whose values is an array of
> > + * u32 elements
> > + *
> > + * Returns a pointer to a u32 array of size nr_states on success.
> > + * Returns NULL on failure.
> > + */
> > +static inline u32 *get_idle_prop_u32_array(struct device_node *np,
> > + int nr_states,
> > + const char *propname)
> > +{
> > + u32 *ret_array;
> > + int rc, count;
> > +
> > + count = of_property_count_u32_elems(np, propname);
> > + rc = validate_dt_prop_sizes("ibm,cpu-idle-state-flags", nr_states,
> > + propname, count);
> > + if (rc)
> > + return NULL;
> > +
> > + ret_array = kcalloc(nr_states, sizeof(*ret_array), GFP_KERNEL);
> > + if (!ret_array)
> > + return NULL;
>
> So I would say for this, how about moving the allocations into the caller?
> You're still doing most of the error handling freeing there, so I would
> say it's more balanced if you do that.
Sure, that makes sense. I will move the allocation to the main
function and remove the "inline" associated with these helpers.
>
> Also, perhaps consider dropping most of the inline keywords. Unless it's
> performance critical or does some significant optimisation due to constant
> parameters I would say avoid the keyword as a rule.
>
> [snip]
>
> There's a lot of code movement, I haven't reviewed it all carefully, but
> it looks good in general. I'll apply the patches and check the result
> in the next few days when I get a bit of time.
If it helps, I will post the subsequent version breaking this patch
into smaller ones.
>
> Thanks,
> Nick
>
--
Thanks and Regards
gautham.
next prev parent reply other threads:[~2017-07-07 11:25 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-05 16:38 [PATCH 0/5] powernv:idle: Cleanup idle states initialization Gautham R. Shenoy
2017-07-05 16:38 ` [PATCH 1/5] powernv:idle: Move device-tree parsing to one place Gautham R. Shenoy
2017-07-06 14:53 ` Nicholas Piggin
2017-07-07 11:25 ` Gautham R Shenoy [this message]
2017-07-08 8:42 ` Nicholas Piggin
2017-07-05 16:38 ` [PATCH 2/5] powernv:idle: Change return type of pnv_probe_idle_states to int Gautham R. Shenoy
2017-07-06 15:01 ` Nicholas Piggin
2017-07-07 12:26 ` Gautham R Shenoy
2017-07-05 16:38 ` [PATCH 3/5] powernv:idle: Define idle init function for power8 Gautham R. Shenoy
2017-07-06 15:06 ` Nicholas Piggin
2017-07-07 12:43 ` Gautham R Shenoy
2017-07-05 16:38 ` [PATCH 4/5] powernv:idle: Move initialization of sibling pacas to pnv_alloc_idle_core_states Gautham R. Shenoy
2017-07-06 15:16 ` Nicholas Piggin
2017-07-07 15:04 ` Gautham R Shenoy
2017-07-08 9:00 ` Nicholas Piggin
2017-07-10 4:34 ` Michael Ellerman
2017-07-05 16:38 ` [PATCH 5/5] powernv:idle: Disable LOSE_FULL_CONTEXT states when stop-api fails Gautham R. Shenoy
2017-07-06 15:29 ` Nicholas Piggin
2017-07-07 17:37 ` Gautham R Shenoy
2017-07-08 9:05 ` Nicholas Piggin
2017-07-11 5:04 ` Gautham R Shenoy
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=20170707112539.GA8913@in.ibm.com \
--to=ego@linux.vnet.ibm.com \
--cc=akshay.adiga@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mikey@neuling.org \
--cc=mpe@ellerman.id.au \
--cc=npiggin@gmail.com \
--cc=rafael@kernel.org \
--cc=shilpa.bhat@linux.vnet.ibm.com \
--cc=svaidy@linux.vnet.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.