• Ahmed S. Darwish's avatar
    scsi: libsas: Introduce a _gfp() variant of event notifiers · c2d0f1a6
    Ahmed S. Darwish authored
    sas_alloc_event() uses in_interrupt() to decide which allocation should be
    used.
    
    The usage of in_interrupt() in drivers is phased out and Linus clearly
    requested that code which changes behaviour depending on context should
    either be separated or the context be conveyed in an argument passed by the
    caller, which usually knows the context.
    
    The in_interrupt() check is also only partially correct, because it fails
    to choose the correct code path when just preemption or interrupts are
    disabled. For example, as in the following call chain:
    
      mvsas/mv_sas.c: mvs_work_queue() [process context]
      spin_lock_irqsave(mvs_info::lock, )
        -> libsas/sas_event.c: sas_notify_phy_event()
          -> sas_alloc_event()
            -> in_interrupt() = false
              -> invalid GFP_KERNEL allocation
        -> libsas/sas_event.c: sas_notify_port_event()
          -> sas_alloc_event()
            -> in_interrupt() = false
              -> invalid GFP_KERNEL allocation
    
    Introduce sas_alloc_event_gfp(), sas_notify_port_event_gfp(), and
    sas_notify_phy_event_gfp(), which all behave like the non _gfp() variants
    but use a caller-passed GFP mask for allocations.
    
    For bisectability, all callers will be modified first to pass GFP context,
    then the non _gfp() libsas API variants will be modified to take a gfp_t by
    default.
    
    Link: https://lore.kernel.org/r/20210118100955.1761652-4-a.darwish@linutronix.de
    Fixes: 1c393b97 ("scsi: libsas: Use dynamic alloced work to avoid sas event lost")
    Cc: Jason Yan <yanaijie@huawei.com>
    Reviewed-by: default avatarJohn Garry <john.garry@huawei.com>
    Signed-off-by: default avatarAhmed S. Darwish <a.darwish@linutronix.de>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    c2d0f1a6
sas_event.c 4.75 KB