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);

Reply via email to