Re: [PATCH v3 2/3] s390/pci: Rework __zpci_event_availability() to remove conditional locking

From: Niklas Schnelle

Date: Wed Aug 05 2026 - 10:15:45 EST


On Wed, 2026-08-05 at 15:36 +0200, Heiko Carstens wrote:
> Clang's compiler based static context analysis does not work with locks
> that are conditionally taken like in __zpci_event_availability():
>
> arch/s390/pci/pci_event.c:402:10: warning: mutex 'get_zdev_by_fid(ccdf->fid).state_lock'
> is not held on every path through here [-Wthread-safety-analysis]
>
> Given that code which takes locks conditionally can be considered
> suboptimal rework __zpci_event_availability() to get rid of this.
>
> Signed-off-by: Heiko Carstens <hca@xxxxxxxxxxxxx>
> ---
> arch/s390/pci/pci_event.c | 162 ++++++++++++++++++++------------------
> 1 file changed, 85 insertions(+), 77 deletions(-)
>
> diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c
> index bead4ed5d4ab..0a9eecb62bd1 100644
> --- a/arch/s390/pci/pci_event.c
> +++ b/arch/s390/pci/pci_event.c
--- snip ---
> void zpci_event_availability(void *data)
> {
> - if (zpci_is_enabled())
> - __zpci_event_availability(data);
> + struct zpci_ccdf_avail *ccdf = data;
> + struct zpci_dev *zdev;
> +
> + if (!zpci_is_enabled())
> + return;
> + zpci_dbg(3, "avl fid:%x, fh:%x, pec:%x\n",
> + ccdf->fid, ccdf->fh, ccdf->pec);
> + if (zpci_event_avail_any_device(ccdf))
> + return;
> + zdev = get_zdev_by_fid(ccdf->fid);
> + if (!zdev)
> + return zpci_event_avail_new_device(ccdf);
> + mutex_lock(&zdev->state_lock);
> + zpci_event_avail_existing_device(zdev, ccdf);
> + mutex_unlock(&zdev->state_lock);
> + zpci_zdev_put(zdev);
> }

Thank you, this is exactly what I had in mind! And in my opinion
definitely much cleaner than even the original code.

Feel free to add:

Reviewed-by: Niklas Schnelle <schnelle@xxxxxxxxxxxxx>

Thanks,
Niklas