Re: [PATCH v10 1/9] scsi: ibmvfc: add basic FPIN support
From: Tyrel Datwyler
Date: Fri Sep 11 2026 - 02:00:30 EST
On 9/10/26 10:48 PM, Tyrel Datwyler wrote:
> From: Dave Marquardt <davemarq@xxxxxxxxxxxxx>
>
> Implement support for a basic level of Fabric Performance Impact
> Notifications (FPIN) in the ibmvfc driver to enable monitoring of
> fabric congestion and link integrity events.
>
> Add async event handler for IBMVFC_AE_FPIN events that offloads FPIN
> processing to a dedicated workqueue. Convert VIOS FPIN messages to
> standard fc_els_fpin structures and pass them to fc_host_fpin_rcv() for
> processing by the FC transport layer.
>
> Introduce common FPIN conversion routines that will be reused for full
> and extended FPIN support in subsequent patches. Add KUnit test
> infrastructure to validate FPIN event handling and statistics updates.
>
> Add ibmvfc_handle_async() support for IBMVFC_AE_FPIN events, a dedicated
> workqueue for FPIN processing, FPIN message conversion to fc_els_fpin
> format, handling of link congestion, port congestion, port cleared, port
> degraded, and congestion cleared events, and a KUnit test module for
> FPIN functionality.
>
> Signed-off-by: Dave Marquardt <davemarq@xxxxxxxxxxxxx>
> [tyreld: add & operator to irqsave/restore calls]
> [tyreld: check for valid fc or nvme port in ibmvfc_find_target]
> [tyreld: remove kunit tests meant for later patchs]
> Signed-off-by: Tyrel Datwyler <tyreld@xxxxxxxxxxxxx>
> ---
<..snip..>
> @@ -6923,6 +7189,9 @@ static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
> kthread_stop(vhost->work_thread);
> free_host_mem:
> ibmvfc_free_mem(vhost);
> +free_workq:
> + destroy_workqueue(vhost->fpin_workq);
> + vhost->fpin_workq = NULL;
> free_scsi_host:
> scsi_host_put(shost);
> out:
> @@ -6953,8 +7222,6 @@ static void ibmvfc_remove(struct vio_dev *vdev)
> ibmvfc_wait_while_resetting(vhost);
> kthread_stop(vhost->work_thread);
> flush_work(&vhost->rport_add_work_q);
> - fc_remove_host(vhost->host);
> - scsi_remove_host(vhost->host);
I mucked something up my fist go add cleaning up the kunit mess, and as a result
I went back and started fresh again from Dave's v8. Anyways, the second I hit
send I realized I forgot to reincorporate the change I had in v9 to no move the
xxx_remove_host() calls back and add the destroy workqueue call above those as
well as an IBMVFC_HOST_OFFLINE check before enqueue of work.
-Tyrel
>
> spin_lock_irqsave(&vhost->host->host_lock, flags);
> ibmvfc_purge_requests(vhost, DID_ERROR);
> @@ -6963,6 +7230,10 @@ static void ibmvfc_remove(struct vio_dev *vdev)
> ibmvfc_complete_purge(&purge);
> ibmvfc_release_sub_crqs(vhost);
> ibmvfc_release_crq_queue(vhost);
> + destroy_workqueue(vhost->fpin_workq);
> + vhost->fpin_workq = NULL;
> + fc_remove_host(vhost->host);
> + scsi_remove_host(vhost->host);
>
> ibmvfc_free_mem(vhost);
> spin_lock(&ibmvfc_driver_lock);