This patch series adds FPIN (fabric performance impact notification) support to the ibmvfc (IBM Virtual Fibre Channel) driver. This comes in three flavors:
- basic, to recognize existing FPIN messages from the virtual I/O server (VIOS) (patch 1) - full, supporting additional FPIN information and using its own asynchronous sub-queue and interrupt (patches 3-8) - extended, supporting FC-LS-5 (patch 9) Full and extended FPIN support requires a new asynchronous sub-queue with its own interrupt. The asynchronous sub-queue support requires ibmvfc to also support a new IBMVFC_NOOP command, which the driver recognizes and ignores (patch 2). The asynchronous sub-queue work is split across four patches: patch 3 defines the necessary data structures, patch 5 adds the interrupt and drain routines for the queue, patch 6 extends channel registration and deregistration to accommodate the new queue, and patch 7 fixes IRQ cleanup on registration failure. Patch 8 wires everything together, registering the async sub-queue during channel initialization and advertising support to VIOS during NPIV login. All three modes convert an incoming FPIN message from VIOS to an FC extended link service message, in some cases using default values for information not provided by the VIOS FPIN message but expected in the FC ELS message. This FC ELS message is passed to fc_host_rcv_fpin for updating statistics and sending the information upstream by netlink multicast, where it may be read by listeners including the DM multipath daemon "multipathd." Signed-off-by: Dave Marquardt <[email protected]> Signed-off-by: Tyrel Datwyler <[email protected]> --- Changes in v9: - Fix ibmvfc_find_target() to check for either a valid rport or nvme_remote_port so nvme targets are not silently dropped (patch 1) - Restore xxx_host_remove() ordering and destroy async work queue prior to these calls. Check that the host is not offline prior to enqueuing new async work (patch 1) - Link to v8: https://lore.kernel.org/linux-scsi/[email protected] Changes in v8: - Split patch 6 into two patches: extend channel registration/deregistration for async subq (patch 6), and clear sub-CRQ IRQ on registration failure and guard teardown (patch 7) - Fixed NULL dereference in ibmvfc_deregister_channel() when called on an unallocated queue: guard memset() behind scrq->msgs.handle check - Fixed variable-shadowing bug in ibmvfc_register_channel() error path where H_FREE_SUB_CRQ hcall result clobbered the return code - Deregister and re-register async sub-CRQ in ibmvfc_reenable_crq_queue() and ibmvfc_reset_crq() alongside SCSI channel queues - Link to v7: https://patch.msgid.link/[email protected] Changes in v7: - Removed CRQ valid bit clearing to callers of ibmvfc_handle_async in all cases - Added validity checks that IBMVFC_ASYNC_ID_IS_ASSOC_ID is clear before using node_name - Fixed error path cleanup in ibmvfc_init_sub_crqs - Deregister and reregister async sub-CRQ in CRQ reset and reenable code. - Moved work queue destruction after sub CRQs teardown in ibmvfc_remove - Modified async event handling code to use a tagged union rather than void *. - Use WQ_UNBOUND rather than WQ_PERCPU for fpin workqueue, as FPIN events should be rare. Hold q_lock only in ibmvfc_drain_async_subq(), like ibmvfc_drain_sub_crq(). - Hardened KUnit tests to use host_lock and kref. - Link to v6: https://patch.msgid.link/[email protected] Changes in v6: - Use alloc_workqueue rather than devm_alloc_workqueue, and add explicit destroy_workqueue calls - Moved ibmvfc_find_target into patch 1 - Link to v5: https://patch.msgid.link/[email protected] Changes in v5: - Incorporate changes for NVME-over-FC. - Removed now redundant fabric login patch. - Link to v4: https://patch.msgid.link/[email protected] Changes in v4: - Refactored channel registration - Check whether async work queue is allocated before using or freeing - Fixed work queue allocation/destruction - Skip basic KUnit test when there are no ibmvfc devices available - Fix target not found condition in ibmvfc_process_async_work - Link to v3: https://patch.msgid.link/[email protected] Changes in v3: - Fixed latent bug, exposed by VFC_NOOP, related to dataless CRQs and events - Fixed FPIN TLV descriptor length calculations - Use safe list walker to walk targets in ibmvfc_process_async_work - Added write memory barriers after clearing CRQ valid field - Use per-vhost work queue for FPIN work - Link to v2: https://patch.msgid.link/[email protected] Highlights of changes in v2: - Refactored mostly common FPIN conversion routines and async event processing into single routines with wrappers for differences. - Moved FPIN processing to a work queue to avoid conflicts with fc_host_fpin_rcv and memory allocation - Set descriptor sizes correctly - Use target WWPN for basic FPIN descriptor - Split patch 4 into 3 patches, for definition, allocation, and use of the asynchronous sub-queue for events - Link to v1: https://patch.msgid.link/[email protected] To: "James E.J. Bottomley" <[email protected]> To: "Martin K. Petersen" <[email protected]> To: Madhavan Srinivasan <[email protected]> To: Michael Ellerman <[email protected]> To: Nicholas Piggin <[email protected]> To: "Christophe Leroy (CS GROUP)" <[email protected]> To: Tyrel Datwyler <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] --- Dave Marquardt (9): scsi: ibmvfc: add basic FPIN support scsi: ibmvfc: add NOOP command support scsi: ibmvfc: add FPIN extended flag and async sub-CRQ queue handle scsi: ibmvfc: extend async event handlers for async sub-CRQ events scsi: ibmvfc: add interrupt routine for asynchronous sub CRQ scsi: ibmvfc: extend channel reg/dereg helpers for async sub-CRQ scsi: ibmvfc: fix IRQ leak and guard deregister on channel reg failure scsi: ibmvfc: register and use asynchronous sub CRQ for events scsi: ibmvfc: handle extended FPIN events drivers/scsi/Kconfig | 10 + drivers/scsi/ibmvscsi/Makefile | 1 + drivers/scsi/ibmvscsi/ibmvfc-core.c | 724 ++++++++++++++++++++++++--- drivers/scsi/ibmvscsi/ibmvfc.h | 63 +++ drivers/scsi/ibmvscsi/ibmvfc_kunit.c | 408 +++++++++++++++ 5 files changed, 1144 insertions(+), 62 deletions(-) create mode 100644 drivers/scsi/ibmvscsi/ibmvfc_kunit.c -- 2.55.0
