From: Eric Farman <farman@linux.ibm.com>
To: Matthew Rosato <mjrosato@linux.ibm.com>,
linux-s390@vger.kernel.org, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org
Cc: Halil Pasic <pasic@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
stable@vger.kernel.org
Subject: Re: [PATCH v4 7/9] s390/vfio_ccw: move cp cleanup out of not operational
Date: Sat, 25 Jul 2026 20:59:04 -0400 [thread overview]
Message-ID: <63b789b2-d66c-4630-a099-3dfd58bbd5b0@linux.ibm.com> (raw)
In-Reply-To: <685bd45f-379e-4878-b76a-6c7a13f1c036@linux.ibm.com>
On 7/25/26 12:39 PM, Matthew Rosato wrote:
> On 7/25/26 11:27 AM, Eric Farman wrote:
>> The fsm_notoper() routine is called when the device has been
>> lost, and is (by definition) no longer operational. Since this
>> can happen asynchronously from the normal behavior of the
>> driver, the cleanup may happen when holding other locks
>> in the calling sequence (notably, the cio subchannel lock).
>>
>> Push the cleanup of the private->cp resources to a workqueue,
>> where it can be done out from under that lock sequence and
>> (soon) under its own serialization mechanism.
>>
>> Fixes: 204b394a23ad ("vfio/ccw: Move FSM open/close to MDEV open/close")
>> Cc: stable@vger.kernel.org
>> Signed-off-by: Eric Farman <farman@linux.ibm.com>
>
> Doesn't this need a cancel of the workqueue before the vfio_ccw_private
> gets freed, maybe in vfio_ccw_mdev_release_dev()?
Yeah, seems the existing flush_workqueue() call in vfio_ccw_sch_quiesce
has some restrictions on how it'd possibly get there, so probably not as
certain a situation as is called for. I'll fix.
>> ---
>> drivers/s390/cio/vfio_ccw_drv.c | 9 +++++++++
>> drivers/s390/cio/vfio_ccw_fsm.c | 3 +--
>> drivers/s390/cio/vfio_ccw_ops.c | 1 +
>> drivers/s390/cio/vfio_ccw_private.h | 3 +++
>> 4 files changed, 14 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c
>> index 1a095085bc72..c197ad5ab580 100644
>> --- a/drivers/s390/cio/vfio_ccw_drv.c
>> +++ b/drivers/s390/cio/vfio_ccw_drv.c
>> @@ -125,6 +125,15 @@ void vfio_ccw_crw_todo(struct work_struct *work)
>> eventfd_signal(private->crw_trigger);
>> }
>>
>> +void vfio_ccw_notoper_todo(struct work_struct *work)
>> +{
>> + struct vfio_ccw_private *private;
>> +
>> + private = container_of(work, struct vfio_ccw_private, notoper_work);
>> +
>> + cp_free(&private->cp);
>> +}
>> +
>> /*
>> * Css driver callbacks
>> */
>> diff --git a/drivers/s390/cio/vfio_ccw_fsm.c b/drivers/s390/cio/vfio_ccw_fsm.c
>> index 4d7988ea47ef..4d47a3c7b9a0 100644
>> --- a/drivers/s390/cio/vfio_ccw_fsm.c
>> +++ b/drivers/s390/cio/vfio_ccw_fsm.c
>> @@ -170,8 +170,7 @@ static void fsm_notoper(struct vfio_ccw_private *private,
>> css_sched_sch_todo(sch, SCH_TODO_UNREG);
>> private->state = VFIO_CCW_STATE_NOT_OPER;
>>
>> - /* This is usually handled during CLOSE event */
>> - cp_free(&private->cp);
>> + queue_work(vfio_ccw_work_q, &private->notoper_work);
>> }
>>
>> /*
>> diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c
>> index 032a1cdf4df7..6c74d596be9d 100644
>> --- a/drivers/s390/cio/vfio_ccw_ops.c
>> +++ b/drivers/s390/cio/vfio_ccw_ops.c
>> @@ -54,6 +54,7 @@ static int vfio_ccw_mdev_init_dev(struct vfio_device *vdev)
>> INIT_LIST_HEAD(&private->crw);
>> INIT_WORK(&private->io_work, vfio_ccw_sch_io_todo);
>> INIT_WORK(&private->crw_work, vfio_ccw_crw_todo);
>> + INIT_WORK(&private->notoper_work, vfio_ccw_notoper_todo);
>>
>> private->cp.guest_cp = kzalloc_objs(struct ccw1, CCWCHAIN_LEN_MAX);
>> if (!private->cp.guest_cp)
>> diff --git a/drivers/s390/cio/vfio_ccw_private.h b/drivers/s390/cio/vfio_ccw_private.h
>> index 0501d4bbcdbd..e2256402b089 100644
>> --- a/drivers/s390/cio/vfio_ccw_private.h
>> +++ b/drivers/s390/cio/vfio_ccw_private.h
>> @@ -102,6 +102,7 @@ struct vfio_ccw_parent {
>> * @req_trigger: eventfd ctx for signaling userspace to return device
>> * @io_work: work for deferral process of I/O handling
>> * @crw_work: work for deferral process of CRW handling
>> + * @notoper_work: work for deferred processing in not-operational state
>> */
>> struct vfio_ccw_private {
>> struct vfio_device vdev;
>> @@ -125,11 +126,13 @@ struct vfio_ccw_private {
>> struct eventfd_ctx *req_trigger;
>> struct work_struct io_work;
>> struct work_struct crw_work;
>> + struct work_struct notoper_work;
>> } __aligned(8);
>>
>> int vfio_ccw_sch_quiesce(struct subchannel *sch);
>> void vfio_ccw_sch_io_todo(struct work_struct *work);
>> void vfio_ccw_crw_todo(struct work_struct *work);
>> +void vfio_ccw_notoper_todo(struct work_struct *work);
>>
>> extern struct mdev_driver vfio_ccw_mdev_driver;
>>
>
next prev parent reply other threads:[~2026-07-26 0:59 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-25 15:26 [PATCH v4 0/9] s390/vfio_ccw fixes Eric Farman
2026-07-25 15:26 ` [PATCH v4 1/9] s390/vfio_ccw: free all memory if cp_init() fails Eric Farman
2026-07-25 15:42 ` sashiko-bot
2026-07-25 15:26 ` [PATCH v4 2/9] s390/vfio_ccw: limit the number of channel program segments Eric Farman
2026-07-25 15:39 ` sashiko-bot
2026-07-25 15:26 ` [PATCH v4 3/9] s390/vfio_ccw: fix out of bounds check on CCW array Eric Farman
2026-07-25 15:33 ` sashiko-bot
2026-07-25 16:09 ` Matthew Rosato
2026-07-25 15:27 ` [PATCH v4 4/9] s390/vfio_ccw: ensure first IDAW remains constant Eric Farman
2026-07-25 15:44 ` sashiko-bot
2026-07-25 15:27 ` [PATCH v4 5/9] s390/vfio_ccw: calculate idal length based on idaw type Eric Farman
2026-07-25 15:34 ` sashiko-bot
2026-07-25 15:27 ` [PATCH v4 6/9] s390/vfio_ccw: ensure index for read/write regions are within range Eric Farman
2026-07-25 15:42 ` sashiko-bot
2026-07-25 16:27 ` Matthew Rosato
2026-07-25 15:27 ` [PATCH v4 7/9] s390/vfio_ccw: move cp cleanup out of not operational Eric Farman
2026-07-25 15:42 ` sashiko-bot
2026-07-25 16:39 ` Matthew Rosato
2026-07-26 0:59 ` Eric Farman [this message]
2026-07-25 15:27 ` [PATCH v4 8/9] s390/vfio_ccw: implement a channel program mutex Eric Farman
2026-07-25 15:43 ` sashiko-bot
2026-07-25 17:04 ` Matthew Rosato
2026-07-25 15:27 ` [PATCH v4 9/9] s390/vfio_ccw: implement a crw lock Eric Farman
2026-07-25 15:46 ` sashiko-bot
2026-07-25 17:03 ` Matthew Rosato
2026-07-26 0:01 ` Eric Farman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=63b789b2-d66c-4630-a099-3dfd58bbd5b0@linux.ibm.com \
--to=farman@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mjrosato@linux.ibm.com \
--cc=pasic@linux.ibm.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox