Larry Finger <Larry.Finger@xxxxxxxxxxxx> writes: > From: Ping-Ke Shih <pkshih@xxxxxxxxxxx> > > btcoex needs to sleep, thus it must run in thread context. > > Signed-off-by: Ping-Ke Shih <pkshih@xxxxxxxxxxx> > Signed-off-by: Larry Finger <Larry.Finger@xxxxxxxxxxxx> [...] > +void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec) > +{ > + struct rtl_priv *rtlpriv = rtl_priv(hw); > + unsigned long flags; > + struct rtl_c2hcmd *c2hcmd; > + > + while (true) { > + /* dequeue a task */ > + spin_lock_irqsave(&rtlpriv->locks.c2hcmd_lock, flags); > + > + c2hcmd = list_first_entry_or_null(&rtlpriv->c2hcmd_list, > + struct rtl_c2hcmd, list); > + > + if (c2hcmd) > + list_del(&c2hcmd->list); > + > + spin_unlock_irqrestore(&rtlpriv->locks.c2hcmd_lock, flags); > + > + /* do it */ > + if (!c2hcmd) > + break; > + > + if (rtlpriv->cfg->ops->c2h_content_parsing && exec) > + rtlpriv->cfg->ops->c2h_content_parsing(hw, > + c2hcmd->tag, c2hcmd->len, c2hcmd->val); > + > + /* free */ > + kfree(c2hcmd->val); > + > + kfree(c2hcmd); > + } > +} Never ending loops are not really preferred in kernel, with a simple bug it could cause annoying system-wide problems. Can you add a some sort of failsafe mechanism, for example bailing out from the loop if it has been running more than 200 ms or something like that? -- Kalle Valo