On 9/10/26 10:48 PM, Tyrel Datwyler wrote: > From: Dave Marquardt <[email protected]> > > 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 <[email protected]> > [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 <[email protected]> > ---
<..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);
