On Mon, Sep 30, 2024 at 6:25 AM Martin Wilck <martin.wilck@xxxxxxxx> wrote: > > After commit 379a58caa199 ("scsi: fnic: Move fnic_fnic_flush_tx() to a work > queue"), it can happen that a work item is sent to an uninitialized work > queue. This may has the effect that the item being queued is never > actually queued, and any further actions depending on it will not proceed. > > The following warning is observed while the fnic driver is loaded: > > kernel: WARNING: CPU: 11 PID: 0 at ../kernel/workqueue.c:1524 __queue_work+0x373/0x410 > kernel: <IRQ> > kernel: queue_work_on+0x3a/0x50 > kernel: fnic_wq_copy_cmpl_handler+0x54a/0x730 [fnic 62fbff0c42e7fb825c60a55cde2fb91facb2ed24] > kernel: fnic_isr_msix_wq_copy+0x2d/0x60 [fnic 62fbff0c42e7fb825c60a55cde2fb91facb2ed24] > kernel: __handle_irq_event_percpu+0x36/0x1a0 > kernel: handle_irq_event_percpu+0x30/0x70 > kernel: handle_irq_event+0x34/0x60 > kernel: handle_edge_irq+0x7e/0x1a0 > kernel: __common_interrupt+0x3b/0xb0 > kernel: common_interrupt+0x58/0xa0 > kernel: </IRQ> > > It has been observed that this may break the rediscovery of fibre channel > devices after a temporary fabric failure. > > This patch fixes it by moving the work queue initialization out of > an if block in fnic_probe(). > > Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> > > Fixes: 379a58caa199 ("scsi: fnic: Move fnic_fnic_flush_tx() to a work queue") > Cc: stable@xxxxxxxxxxxxxxx > --- > drivers/scsi/fnic/fnic_main.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c > index 0044717d4486..adec0df24bc4 100644 > --- a/drivers/scsi/fnic/fnic_main.c > +++ b/drivers/scsi/fnic/fnic_main.c > @@ -830,7 +830,6 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > spin_lock_init(&fnic->vlans_lock); > INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame); > INIT_WORK(&fnic->event_work, fnic_handle_event); > - INIT_WORK(&fnic->flush_work, fnic_flush_tx); > skb_queue_head_init(&fnic->fip_frame_queue); > INIT_LIST_HEAD(&fnic->evlist); > INIT_LIST_HEAD(&fnic->vlans); > @@ -948,6 +947,7 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > > INIT_WORK(&fnic->link_work, fnic_handle_link); > INIT_WORK(&fnic->frame_work, fnic_handle_frame); > + INIT_WORK(&fnic->flush_work, fnic_flush_tx); > skb_queue_head_init(&fnic->frame_queue); > skb_queue_head_init(&fnic->tx_queue); > > -- > 2.46.1 > Reviewed-by: Lee Duncan <lduncan@xxxxxxxx>