On Thu Oct 14, 2021 at 3:59 AM IST, Alex Elder wrote: > On 9/19/21 10:08 PM, Sireesh Kodali wrote: > > From: Vladimir Lypak <vladimir.lypak@xxxxxxxxx> > > > > Sometimes the pipeline clear fails, and when it does, having a hang in > > kernel is ugly. The timeout gives us a nice error message. Note that > > this shouldn't actually hang, ever. It only hangs if there is a mistake > > in the config, and the timeout is only useful when debugging. > > > > Signed-off-by: Vladimir Lypak <vladimir.lypak@xxxxxxxxx> > > Signed-off-by: Sireesh Kodali <sireeshkodali1@xxxxxxxxx> > > This is actually an item on my to-do list. All of the waits > for GSI completions should have timeouts. The only reason it > hasn't been implemented already is that I would like to be sure > all paths that could have a timeout actually have a reasonable > recovery. > > I'd say an error message after a timeout is better than a hung > task panic, but if this does time out, I'm not sure the state > of the hardware is well-defined. Early on while wiring up BAM support, I handn't quite figured out the IPA init sequence, and some of the BAM opcode stuff. This caused the driver to hang when it would reach the completion. Since this particular completion was waited for just before the probe function retured, it prevented hung up the kernel thread, and prevented the module from being `modprobe -r`ed. Since then, I've properly fixed the BAM code, the completion always returns, making the patch kinda useless for now. Since its only for debugging, I'll just drop this patch. I think the only error handling we can do at this stage is to return -EIO, and get the callee to handle de-initing everything. Regards, Sireesh > > -Alex > > > --- > > drivers/net/ipa/ipa_cmd.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/net/ipa/ipa_cmd.c b/drivers/net/ipa/ipa_cmd.c > > index 3db9e94e484f..0bdbc331fa78 100644 > > --- a/drivers/net/ipa/ipa_cmd.c > > +++ b/drivers/net/ipa/ipa_cmd.c > > @@ -658,7 +658,10 @@ u32 ipa_cmd_pipeline_clear_count(void) > > > > void ipa_cmd_pipeline_clear_wait(struct ipa *ipa) > > { > > - wait_for_completion(&ipa->completion); > > + unsigned long timeout_jiffies = msecs_to_jiffies(1000); > > + > > + if (!wait_for_completion_timeout(&ipa->completion, timeout_jiffies)) > > + dev_err(&ipa->pdev->dev, "%s time out\n", __func__); > > } > > > > void ipa_cmd_pipeline_clear(struct ipa *ipa) > >