Skip to content

Commit f30e5f7

Browse files
Martin Wilckmartinkpetersen
authored andcommitted
scsi: fnic: Move flush_work initialization out of if block
After commit 379a58c ("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@suse.com> Fixes: 379a58c ("scsi: fnic: Move fnic_fnic_flush_tx() to a work queue") Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20240930133014.71615-1-mwilck@suse.com Reviewed-by: Lee Duncan <lduncan@suse.com> Reviewed-by: Karan Tilak Kumar <kartilak@cisco.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent d5130c5 commit f30e5f7

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

drivers/scsi/fnic/fnic_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,6 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
830830
spin_lock_init(&fnic->vlans_lock);
831831
INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame);
832832
INIT_WORK(&fnic->event_work, fnic_handle_event);
833-
INIT_WORK(&fnic->flush_work, fnic_flush_tx);
834833
skb_queue_head_init(&fnic->fip_frame_queue);
835834
INIT_LIST_HEAD(&fnic->evlist);
836835
INIT_LIST_HEAD(&fnic->vlans);
@@ -948,6 +947,7 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
948947

949948
INIT_WORK(&fnic->link_work, fnic_handle_link);
950949
INIT_WORK(&fnic->frame_work, fnic_handle_frame);
950+
INIT_WORK(&fnic->flush_work, fnic_flush_tx);
951951
skb_queue_head_init(&fnic->frame_queue);
952952
skb_queue_head_init(&fnic->tx_queue);
953953

0 commit comments

Comments
 (0)