Message ID | 20201126132952.2287996-3-bigeasy@linutronix.de (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | scsi: Remove in_interrupt() usage. | expand |
On 26/11/2020 13:29, Sebastian Andrzej Siewior wrote: > From: "Ahmed S. Darwish"<a.darwish@linutronix.de> > > hisi_sas_task_exec() uses preemptible() to see if it's safe to block. > This does not work for CONFIG_PREEMPT_COUNT=n kernels in which > preemptible() always returns 0. > > The problem is masked when enabling some of the common Kconfig.debug > options (like CONFIG_DEBUG_ATOMIC_SLEEP), as they implicitly enable the > preemption counter. > > In general, driver leaf functions should not make logic decisions based > on the context they're called from. The caller should be the entity > responsible for explicitly indicating context. > > Since hisi_sas_task_exec() already has a gfp_t flags parameter, use it > as the explicit context marker. > > Fixes: 214e702d4b70 ("scsi: hisi_sas: Adjust task reject period during host reset") > Fixes: 550c0d89d52d ("scsi: hisi_sas: Replace in_softirq() check in hisi_sas_task_exec()") > Signed-off-by: Ahmed S. Darwish<a.darwish@linutronix.de> > Signed-off-by: Sebastian Andrzej Siewior<bigeasy@linutronix.de> > Cc: Xiaofei Tan<tanxiaofei@huawei.com> > Cc: Xiang Chen<chenxiang66@hisilicon.com> > Cc: John Garry<john.garry@huawei.com> Acked-by: John Garry <john.garry@huawei.com>
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c index c8dd8588f800e..06e65c461f027 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -585,13 +585,7 @@ static int hisi_sas_task_exec(struct sas_task *task, gfp_t gfp_flags, dev = hisi_hba->dev; if (unlikely(test_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags))) { - /* - * For IOs from upper layer, it may already disable preempt - * in the IO path, if disable preempt again in down(), - * function schedule() will report schedule_bug(), so check - * preemptible() before goto down(). - */ - if (!preemptible()) + if (!gfpflags_allow_blocking(gfp_flags)) return -EINVAL; down(&hisi_hba->sem);