[Skiboot] [RFC PATCH] FSP: Solidify timeout poll code
Benjamin Herrenschmidt
benh at kernel.crashing.org
Mon Dec 8 23:36:20 AEDT 2014
On Mon, 2014-12-08 at 17:41 +0530, Ananth N Mavinakayanahalli wrote:
> Prevent multiple callers to the timeout poller.
> Add more error checking while there.
>
> Signed-off-by: Ananth N Mavinakayanahalli <ananth at in.ibm.com>
> ---
> hw/fsp/fsp.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c
> index 8a73f2c..bc5e3e7 100644
> --- a/hw/fsp/fsp.c
> +++ b/hw/fsp/fsp.c
> @@ -91,6 +91,7 @@ static void *fsp_inbound_buf = NULL;
> static u32 fsp_inbound_off;
>
> static struct lock fsp_lock = LOCK_UNLOCKED;
> +static struct lock fsp_timeout_poller_lock = LOCK_UNLOCKED;
>
> static u64 fsp_cmdclass_resp_bitmask;
> static u64 timeout_timer;
> @@ -1904,7 +1905,7 @@ bool fsp_present(void)
> return first_fsp != NULL;
> }
>
> -static void fsp_timeout_poll(void *data __unused)
> +static void __fsp_timeout_poll(void *data __unused)
> {
> u64 now = mftb();
> u64 timeout_val = 0;
> @@ -1952,6 +1953,8 @@ static void fsp_timeout_poll(void *data __unused)
> goto next_bit;
> }
> req = list_top(&cmdclass->msgq, struct fsp_msg, link);
> + if (!req)
> + goto next_bit;
> w0 = req->word0;
> w1 = req->word1;
> mstate = req->state;
> @@ -1976,6 +1979,14 @@ static void fsp_timeout_poll(void *data __unused)
> }
> }
>
> +static void fsp_timeout_poll(void *data __unused)
> +{
> + if (try_lock(&fsp_timeout_poller_lock)) {
> + __fsp_timeout_poll(data);
> + unlock(&fsp_timeout_poller_lock);
> + }
> +}
I don't like that, we sometimes call poll in a tight loop , I'd rather
be a little bit smarter and:
/* The lowest granularity for a message timeout is 30 secs.
* So every 30secs, check if there is any message
* waiting for a response from the FSP
*/
if ((tb_compare(now, timeout_timer) == TB_AAFTERB) ||
(tb_compare(now, timeout_timer) == TB_AEQUALB))
---> take it here
timeout_timer = now + secs_to_tb(30);
else
return;
(We might need to re-check we have expired before updating timeout_timer
so we don't have two racing)
Cheers,
Ben.
> void fsp_opl(void)
> {
> struct dt_node *iplp;
>
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
More information about the Skiboot
mailing list