qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH v3 0/5] Report vfio-ap configuration changes
@ 2025-03-10 15:35 Rorie Reyes
  2025-03-10 15:35 ` [RFC PATCH v3 1/5] linux-headers: NOTFORMERGE - placeholder uapi updates for AP config change Rorie Reyes
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Rorie Reyes @ 2025-03-10 15:35 UTC (permalink / raw)
  To: qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth, akrowiak, rreyes

Changelog:

v3:
- changes that were made to patch 3/5 should have been made in
patch 2/5

v2:
- removed warnings that weren't needed
- added unregister function
- removed whitelines
- changed variable names for consistency
- removed rc variable and returning 1 or 0 outright
- reversed logics for if statements
- using g_free() instead of free()
- replaced hardcoded numeric values by defining them with #define
in the header

--------------------------------------------------------------------------
This patch series creates and registers a handler that is called when
userspace is notified by the kernel that a guest's AP configuration has
changed. The handler in turn notifies the guest that its AP configuration
has changed. This allows the guest to immediately respond to AP
configuration changes rather than relying on polling or some other
inefficient mechanism for detecting config changes.

Rorie Reyes (5):
  linux-headers: NOTFORMERGE - placeholder uapi updates for AP config
    change
  hw/vfio/ap: notification handler for AP config changed event
  hw/vfio/ap: store object indicating AP config changed in a queue
  hw/vfio/ap: Storing event information for an AP configuration change
    event
  s390: implementing CHSC SEI for AP config change

 hw/vfio/ap.c                 | 79 ++++++++++++++++++++++++++++++++++++
 include/hw/s390x/ap-bridge.h | 22 ++++++++++
 linux-headers/linux/vfio.h   |  1 +
 target/s390x/ioinst.c        | 11 ++++-
 4 files changed, 111 insertions(+), 2 deletions(-)

-- 
2.48.1



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [RFC PATCH v3 1/5] linux-headers: NOTFORMERGE - placeholder uapi updates for AP config change
  2025-03-10 15:35 [RFC PATCH v3 0/5] Report vfio-ap configuration changes Rorie Reyes
@ 2025-03-10 15:35 ` Rorie Reyes
  2025-03-10 15:35 ` [RFC PATCH v3 2/5] hw/vfio/ap: notification handler for AP config changed event Rorie Reyes
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Rorie Reyes @ 2025-03-10 15:35 UTC (permalink / raw)
  To: qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth, akrowiak, rreyes

This patch adds enumeration constant VFIO_AP_CFG_CHG_IRQ_INDEX to specify
an IRQ index for signaling that a change has been made to the guest's AP
configuration. This is a placeholder for QEMU patches that use this value
since it is a linux-headers update which includes changes that aren't
merged into the kernel. Linux-headers patches should be generated using
scripts/update-linux-headers.sh.

Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
---
 linux-headers/linux/vfio.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
index 1b5e254d6a..d0426b5ec0 100644
--- a/linux-headers/linux/vfio.h
+++ b/linux-headers/linux/vfio.h
@@ -671,6 +671,7 @@ enum {
  */
 enum {
 	VFIO_AP_REQ_IRQ_INDEX,
+	VFIO_AP_CFG_CHG_IRQ_INDEX,
 	VFIO_AP_NUM_IRQS
 };
 
-- 
2.48.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC PATCH v3 2/5] hw/vfio/ap: notification handler for AP config changed event
  2025-03-10 15:35 [RFC PATCH v3 0/5] Report vfio-ap configuration changes Rorie Reyes
  2025-03-10 15:35 ` [RFC PATCH v3 1/5] linux-headers: NOTFORMERGE - placeholder uapi updates for AP config change Rorie Reyes
@ 2025-03-10 15:35 ` Rorie Reyes
  2025-03-10 15:43   ` Anthony Krowiak
  2025-03-10 15:35 ` [RFC PATCH v3 3/5] hw/vfio/ap: store object indicating AP config changed in a queue Rorie Reyes
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Rorie Reyes @ 2025-03-10 15:35 UTC (permalink / raw)
  To: qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth, akrowiak, rreyes

Register an event notifier handler to process AP configuration
change events by queuing the event and generating a CRW to let
the guest know its AP configuration has changed

Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
---
 hw/vfio/ap.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
index c7ab4ff57a..3614657218 100644
--- a/hw/vfio/ap.c
+++ b/hw/vfio/ap.c
@@ -18,6 +18,7 @@
 #include "hw/vfio/vfio-common.h"
 #include "system/iommufd.h"
 #include "hw/s390x/ap-device.h"
+#include "hw/s390x/css.h"
 #include "qemu/error-report.h"
 #include "qemu/event_notifier.h"
 #include "qemu/main-loop.h"
@@ -37,6 +38,7 @@ struct VFIOAPDevice {
     APDevice apdev;
     VFIODevice vdev;
     EventNotifier req_notifier;
+    EventNotifier cfg_notifier;
 };
 
 OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
@@ -70,6 +72,18 @@ static void vfio_ap_req_notifier_handler(void *opaque)
     }
 }
 
+static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
+{
+    VFIOAPDevice *vapdev = opaque;
+
+    if (!event_notifier_test_and_clear(&vapdev->cfg_notifier)) {
+        return;
+    }
+
+    css_generate_css_crws(0);
+
+}
+
 static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
                                           unsigned int irq, Error **errp)
 {
@@ -85,6 +99,10 @@ static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
         notifier = &vapdev->req_notifier;
         fd_read = vfio_ap_req_notifier_handler;
         break;
+    case VFIO_AP_CFG_CHG_IRQ_INDEX:
+        notifier = &vapdev->cfg_notifier;
+        fd_read = vfio_ap_cfg_chg_notifier_handler;
+        break;
     default:
         error_setg(errp, "vfio: Unsupported device irq(%d)", irq);
         return false;
@@ -136,6 +154,9 @@ static void vfio_ap_unregister_irq_notifier(VFIOAPDevice *vapdev,
     case VFIO_AP_REQ_IRQ_INDEX:
         notifier = &vapdev->req_notifier;
         break;
+    case VFIO_AP_CFG_CHG_IRQ_INDEX:
+        notifier = &vapdev->cfg_notifier;
+        break;
     default:
         error_report("vfio: Unsupported device irq(%d)", irq);
         return;
@@ -175,6 +196,15 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp)
         warn_report_err(err);
     }
 
+    if (!vfio_ap_register_irq_notifier(vapdev, VFIO_AP_CFG_CHG_IRQ_INDEX, &err))
+    {
+        /*
+         * Report this error, but do not make it a failing condition.
+         * Lack of this IRQ in the host does not prevent normal operation.
+         */
+        warn_report_err(err);
+    }
+
     return;
 
 error:
@@ -187,6 +217,7 @@ static void vfio_ap_unrealize(DeviceState *dev)
     VFIOAPDevice *vapdev = VFIO_AP_DEVICE(dev);
 
     vfio_ap_unregister_irq_notifier(vapdev, VFIO_AP_REQ_IRQ_INDEX);
+    vfio_ap_unregister_irq_notifier(vapdev, VFIO_AP_CFG_CHG_IRQ_INDEX);
     vfio_detach_device(&vapdev->vdev);
     g_free(vapdev->vdev.name);
 }
-- 
2.48.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC PATCH v3 3/5] hw/vfio/ap: store object indicating AP config changed in a queue
  2025-03-10 15:35 [RFC PATCH v3 0/5] Report vfio-ap configuration changes Rorie Reyes
  2025-03-10 15:35 ` [RFC PATCH v3 1/5] linux-headers: NOTFORMERGE - placeholder uapi updates for AP config change Rorie Reyes
  2025-03-10 15:35 ` [RFC PATCH v3 2/5] hw/vfio/ap: notification handler for AP config changed event Rorie Reyes
@ 2025-03-10 15:35 ` Rorie Reyes
  2025-03-10 15:45   ` Anthony Krowiak
  2025-03-10 15:35 ` [RFC PATCH v3 4/5] hw/vfio/ap: Storing event information for an AP configuration change event Rorie Reyes
  2025-03-10 15:35 ` [RFC PATCH v3 5/5] s390: implementing CHSC SEI for AP config change Rorie Reyes
  4 siblings, 1 reply; 9+ messages in thread
From: Rorie Reyes @ 2025-03-10 15:35 UTC (permalink / raw)
  To: qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth, akrowiak, rreyes

Creates an object indicating that an AP configuration change event
has been received and stores it in a queue. These objects will later
be used to store event information for an AP configuration change
when the CHSC instruction is intercepted.

Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
---
 hw/vfio/ap.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
index 3614657218..ddab764ab4 100644
--- a/hw/vfio/ap.c
+++ b/hw/vfio/ap.c
@@ -41,6 +41,13 @@ struct VFIOAPDevice {
     EventNotifier cfg_notifier;
 };
 
+typedef struct APConfigChgEvent {
+    QTAILQ_ENTRY(APConfigChgEvent) next;
+} APConfigChgEvent;
+
+QTAILQ_HEAD(, APConfigChgEvent) cfg_chg_events =
+    QTAILQ_HEAD_INITIALIZER(cfg_chg_events);
+
 OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
 
 static void vfio_ap_compute_needs_reset(VFIODevice *vdev)
@@ -75,11 +82,14 @@ static void vfio_ap_req_notifier_handler(void *opaque)
 static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
 {
     VFIOAPDevice *vapdev = opaque;
+    APConfigChgEvent *cfg_chg_event = g_new0(APConfigChgEvent, 1);
 
     if (!event_notifier_test_and_clear(&vapdev->cfg_notifier)) {
         return;
     }
 
+    QTAILQ_INSERT_TAIL(&cfg_chg_events, cfg_chg_event, next);
+
     css_generate_css_crws(0);
 
 }
-- 
2.48.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC PATCH v3 4/5] hw/vfio/ap: Storing event information for an AP configuration change event
  2025-03-10 15:35 [RFC PATCH v3 0/5] Report vfio-ap configuration changes Rorie Reyes
                   ` (2 preceding siblings ...)
  2025-03-10 15:35 ` [RFC PATCH v3 3/5] hw/vfio/ap: store object indicating AP config changed in a queue Rorie Reyes
@ 2025-03-10 15:35 ` Rorie Reyes
  2025-03-10 15:56   ` Anthony Krowiak
  2025-03-10 15:35 ` [RFC PATCH v3 5/5] s390: implementing CHSC SEI for AP config change Rorie Reyes
  4 siblings, 1 reply; 9+ messages in thread
From: Rorie Reyes @ 2025-03-10 15:35 UTC (permalink / raw)
  To: qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth, akrowiak, rreyes

These functions can be invoked by the function that handles interception
of the CHSC SEI instruction for requests indicating the accessibility of
one or more adjunct processors has changed.

Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
---
 hw/vfio/ap.c                 | 38 ++++++++++++++++++++++++++++++++++++
 include/hw/s390x/ap-bridge.h | 22 +++++++++++++++++++++
 2 files changed, 60 insertions(+)

diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
index ddab764ab4..a152a90ca8 100644
--- a/hw/vfio/ap.c
+++ b/hw/vfio/ap.c
@@ -94,6 +94,44 @@ static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
 
 }
 
+int ap_chsc_sei_nt0_get_event(void *res)
+{
+    APConfigChgEvent *cfg_chg_event = QTAILQ_FIRST(&cfg_chg_events);
+    ChscSeiNt0Res *nt0_res  = (ChscSeiNt0Res *)res;
+
+    memset(nt0_res, 0, sizeof(*nt0_res));
+
+    if (!cfg_chg_event) {
+        return 1;
+    }
+
+    QTAILQ_REMOVE(&cfg_chg_events, cfg_chg_event, next);
+    g_free(cfg_chg_event);
+
+    /*
+     * If there are any AP configuration change events in the queue,
+     * indicate to the caller that there is pending event info in
+     * the response block
+     */
+    if (ap_chsc_sei_nt0_have_event()) {
+        nt0_res->flags |= PENDING_EVENT_INFO_BITMASK;
+    }
+
+    nt0_res->length = sizeof(ChscSeiNt0Res);
+    nt0_res->code = NT0_RES_RESPONSE_CODE;
+    nt0_res->nt = NT0_RES_NT_DEFAULT;
+    nt0_res->rs = NT0_RES_RS_AP_CHANGE;
+    nt0_res->cc = NT0_RES_CC_AP_CHANGE;
+
+    return 0;
+
+}
+
+int ap_chsc_sei_nt0_have_event(void)
+{
+    return !QTAILQ_EMPTY(&cfg_chg_events);
+}
+
 static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
                                           unsigned int irq, Error **errp)
 {
diff --git a/include/hw/s390x/ap-bridge.h b/include/hw/s390x/ap-bridge.h
index 470e439a98..f4d838bf99 100644
--- a/include/hw/s390x/ap-bridge.h
+++ b/include/hw/s390x/ap-bridge.h
@@ -16,4 +16,26 @@
 
 void s390_init_ap(void);
 
+typedef struct ChscSeiNt0Res {
+    uint16_t length;
+    uint16_t code;
+    uint8_t reserved1;
+    uint16_t reserved2;
+    uint8_t nt;
+#define PENDING_EVENT_INFO_BITMASK 0x80;
+    uint8_t flags;
+    uint8_t reserved3;
+    uint8_t rs;
+    uint8_t cc;
+} QEMU_PACKED ChscSeiNt0Res;
+
+#define NT0_RES_RESPONSE_CODE 1;
+#define NT0_RES_NT_DEFAULT    0;
+#define NT0_RES_RS_AP_CHANGE  5;
+#define NT0_RES_CC_AP_CHANGE  3;
+
+int ap_chsc_sei_nt0_get_event(void *res);
+
+int ap_chsc_sei_nt0_have_event(void);
+
 #endif
-- 
2.48.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC PATCH v3 5/5] s390: implementing CHSC SEI for AP config change
  2025-03-10 15:35 [RFC PATCH v3 0/5] Report vfio-ap configuration changes Rorie Reyes
                   ` (3 preceding siblings ...)
  2025-03-10 15:35 ` [RFC PATCH v3 4/5] hw/vfio/ap: Storing event information for an AP configuration change event Rorie Reyes
@ 2025-03-10 15:35 ` Rorie Reyes
  4 siblings, 0 replies; 9+ messages in thread
From: Rorie Reyes @ 2025-03-10 15:35 UTC (permalink / raw)
  To: qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth, akrowiak, rreyes

Handle interception of the CHSC SEI instruction for requests
indicating the guest's AP configuration has changed.

Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
Reviewed-by: Anthony Krowiak <akrowiak@linux.ibm.com>
Tested-by: Anthony Krowiak <akrowiak@linux.ibm.com>
---
 target/s390x/ioinst.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c
index a944f16c25..f061c6db14 100644
--- a/target/s390x/ioinst.c
+++ b/target/s390x/ioinst.c
@@ -17,6 +17,7 @@
 #include "trace.h"
 #include "hw/s390x/s390-pci-bus.h"
 #include "target/s390x/kvm/pv.h"
+#include "hw/s390x/ap-bridge.h"
 
 /* All I/O instructions but chsc use the s format */
 static uint64_t get_address_from_regs(CPUS390XState *env, uint32_t ipb,
@@ -573,13 +574,19 @@ out:
 
 static int chsc_sei_nt0_get_event(void *res)
 {
-    /* no events yet */
+    if (s390_has_feat(S390_FEAT_AP)) {
+        return ap_chsc_sei_nt0_get_event(res);
+    }
+
     return 1;
 }
 
 static int chsc_sei_nt0_have_event(void)
 {
-    /* no events yet */
+    if (s390_has_feat(S390_FEAT_AP)) {
+        return ap_chsc_sei_nt0_have_event();
+    }
+
     return 0;
 }
 
-- 
2.48.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [RFC PATCH v3 2/5] hw/vfio/ap: notification handler for AP config changed event
  2025-03-10 15:35 ` [RFC PATCH v3 2/5] hw/vfio/ap: notification handler for AP config changed event Rorie Reyes
@ 2025-03-10 15:43   ` Anthony Krowiak
  0 siblings, 0 replies; 9+ messages in thread
From: Anthony Krowiak @ 2025-03-10 15:43 UTC (permalink / raw)
  To: Rorie Reyes, qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth




On 3/10/25 11:35 AM, Rorie Reyes wrote:
> Register an event notifier handler to process AP configuration
> change events by queuing the event and generating a CRW to let
> the guest know its AP configuration has changed
>
> Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>

LGTM:
Reviewed-by: Anthony Krowiak <akrowiak@linux.ibm.com>

> ---
>   hw/vfio/ap.c | 31 +++++++++++++++++++++++++++++++
>   1 file changed, 31 insertions(+)
>
> diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
> index c7ab4ff57a..3614657218 100644
> --- a/hw/vfio/ap.c
> +++ b/hw/vfio/ap.c
> @@ -18,6 +18,7 @@
>   #include "hw/vfio/vfio-common.h"
>   #include "system/iommufd.h"
>   #include "hw/s390x/ap-device.h"
> +#include "hw/s390x/css.h"
>   #include "qemu/error-report.h"
>   #include "qemu/event_notifier.h"
>   #include "qemu/main-loop.h"
> @@ -37,6 +38,7 @@ struct VFIOAPDevice {
>       APDevice apdev;
>       VFIODevice vdev;
>       EventNotifier req_notifier;
> +    EventNotifier cfg_notifier;
>   };
>   
>   OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
> @@ -70,6 +72,18 @@ static void vfio_ap_req_notifier_handler(void *opaque)
>       }
>   }
>   
> +static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
> +{
> +    VFIOAPDevice *vapdev = opaque;
> +
> +    if (!event_notifier_test_and_clear(&vapdev->cfg_notifier)) {
> +        return;
> +    }
> +
> +    css_generate_css_crws(0);
> +
> +}
> +
>   static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
>                                             unsigned int irq, Error **errp)
>   {
> @@ -85,6 +99,10 @@ static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
>           notifier = &vapdev->req_notifier;
>           fd_read = vfio_ap_req_notifier_handler;
>           break;
> +    case VFIO_AP_CFG_CHG_IRQ_INDEX:
> +        notifier = &vapdev->cfg_notifier;
> +        fd_read = vfio_ap_cfg_chg_notifier_handler;
> +        break;
>       default:
>           error_setg(errp, "vfio: Unsupported device irq(%d)", irq);
>           return false;
> @@ -136,6 +154,9 @@ static void vfio_ap_unregister_irq_notifier(VFIOAPDevice *vapdev,
>       case VFIO_AP_REQ_IRQ_INDEX:
>           notifier = &vapdev->req_notifier;
>           break;
> +    case VFIO_AP_CFG_CHG_IRQ_INDEX:
> +        notifier = &vapdev->cfg_notifier;
> +        break;
>       default:
>           error_report("vfio: Unsupported device irq(%d)", irq);
>           return;
> @@ -175,6 +196,15 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp)
>           warn_report_err(err);
>       }
>   
> +    if (!vfio_ap_register_irq_notifier(vapdev, VFIO_AP_CFG_CHG_IRQ_INDEX, &err))
> +    {
> +        /*
> +         * Report this error, but do not make it a failing condition.
> +         * Lack of this IRQ in the host does not prevent normal operation.
> +         */
> +        warn_report_err(err);
> +    }
> +
>       return;
>   
>   error:
> @@ -187,6 +217,7 @@ static void vfio_ap_unrealize(DeviceState *dev)
>       VFIOAPDevice *vapdev = VFIO_AP_DEVICE(dev);
>   
>       vfio_ap_unregister_irq_notifier(vapdev, VFIO_AP_REQ_IRQ_INDEX);
> +    vfio_ap_unregister_irq_notifier(vapdev, VFIO_AP_CFG_CHG_IRQ_INDEX);
>       vfio_detach_device(&vapdev->vdev);
>       g_free(vapdev->vdev.name);
>   }



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC PATCH v3 3/5] hw/vfio/ap: store object indicating AP config changed in a queue
  2025-03-10 15:35 ` [RFC PATCH v3 3/5] hw/vfio/ap: store object indicating AP config changed in a queue Rorie Reyes
@ 2025-03-10 15:45   ` Anthony Krowiak
  0 siblings, 0 replies; 9+ messages in thread
From: Anthony Krowiak @ 2025-03-10 15:45 UTC (permalink / raw)
  To: Rorie Reyes, qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth




On 3/10/25 11:35 AM, Rorie Reyes wrote:
> Creates an object indicating that an AP configuration change event
> has been received and stores it in a queue. These objects will later
> be used to store event information for an AP configuration change
> when the CHSC instruction is intercepted.
>
> Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
> ---
>   hw/vfio/ap.c | 10 ++++++++++
>   1 file changed, 10 insertions(+)
>
> diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
> index 3614657218..ddab764ab4 100644
> --- a/hw/vfio/ap.c
> +++ b/hw/vfio/ap.c
> @@ -41,6 +41,13 @@ struct VFIOAPDevice {
>       EventNotifier cfg_notifier;
>   };
>   
> +typedef struct APConfigChgEvent {
> +    QTAILQ_ENTRY(APConfigChgEvent) next;
> +} APConfigChgEvent;
> +
> +QTAILQ_HEAD(, APConfigChgEvent) cfg_chg_events =
> +    QTAILQ_HEAD_INITIALIZER(cfg_chg_events);
> +
>   OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
>   
>   static void vfio_ap_compute_needs_reset(VFIODevice *vdev)
> @@ -75,11 +82,14 @@ static void vfio_ap_req_notifier_handler(void *opaque)
>   static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
>   {
>       VFIOAPDevice *vapdev = opaque;
> +    APConfigChgEvent *cfg_chg_event = g_new0(APConfigChgEvent, 1);

It doesn't make sense to allocate this before the check below. If the
event_notifier_test_and_clear() fails, you'll have allocated this for no
reason. Allocate cfg_cgh_event prior to inserting it into the queue
below.

>   
>       if (!event_notifier_test_and_clear(&vapdev->cfg_notifier)) {
>           return;
>       }
>   
> +    QTAILQ_INSERT_TAIL(&cfg_chg_events, cfg_chg_event, next);
> +
>       css_generate_css_crws(0);
>   
>   }



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC PATCH v3 4/5] hw/vfio/ap: Storing event information for an AP configuration change event
  2025-03-10 15:35 ` [RFC PATCH v3 4/5] hw/vfio/ap: Storing event information for an AP configuration change event Rorie Reyes
@ 2025-03-10 15:56   ` Anthony Krowiak
  0 siblings, 0 replies; 9+ messages in thread
From: Anthony Krowiak @ 2025-03-10 15:56 UTC (permalink / raw)
  To: Rorie Reyes, qemu-devel, qemu-s390x
  Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
	clg, thuth




On 3/10/25 11:35 AM, Rorie Reyes wrote:
> These functions can be invoked by the function that handles interception
> of the CHSC SEI instruction for requests indicating the accessibility of
> one or more adjunct processors has changed.
>
> Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
> ---
>   hw/vfio/ap.c                 | 38 ++++++++++++++++++++++++++++++++++++
>   include/hw/s390x/ap-bridge.h | 22 +++++++++++++++++++++
>   2 files changed, 60 insertions(+)
>
> diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
> index ddab764ab4..a152a90ca8 100644
> --- a/hw/vfio/ap.c
> +++ b/hw/vfio/ap.c
> @@ -94,6 +94,44 @@ static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
>   
>   }
>   
> +int ap_chsc_sei_nt0_get_event(void *res)
> +{
> +    APConfigChgEvent *cfg_chg_event = QTAILQ_FIRST(&cfg_chg_events);

You're assuming that the queue has elements in it. Shouldn't you check
first?

> +    ChscSeiNt0Res *nt0_res  = (ChscSeiNt0Res *)res;
> +
> +    memset(nt0_res, 0, sizeof(*nt0_res));
> +
> +    if (!cfg_chg_event) {

Okay, so I see you are checking whether the QTAILQ_FIRST() call above
returned anything. Why not call the ap_chsc_sei_nt0_have_event() 
function here instead, then follow that with the call to QTAILQ_FIRST() 
if there are any elements in the queue. Also, maybe forego the memset() 
call above until you verify that there are elements in the queue; if 
not, then the memset() call is unnecessary.
> +        return 1;
> +    }
> +
> +    QTAILQ_REMOVE(&cfg_chg_events, cfg_chg_event, next);
> +    g_free(cfg_chg_event);
> +
> +    /*
> +     * If there are any AP configuration change events in the queue,
> +     * indicate to the caller that there is pending event info in
> +     * the response block
> +     */
> +    if (ap_chsc_sei_nt0_have_event()) {
> +        nt0_res->flags |= PENDING_EVENT_INFO_BITMASK;
> +    }
> +
> +    nt0_res->length = sizeof(ChscSeiNt0Res);
> +    nt0_res->code = NT0_RES_RESPONSE_CODE;
> +    nt0_res->nt = NT0_RES_NT_DEFAULT;
> +    nt0_res->rs = NT0_RES_RS_AP_CHANGE;
> +    nt0_res->cc = NT0_RES_CC_AP_CHANGE;
> +
> +    return 0;
> +
> +}
> +
> +int ap_chsc_sei_nt0_have_event(void)
> +{
> +    return !QTAILQ_EMPTY(&cfg_chg_events);
> +}
> +
>   static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
>                                             unsigned int irq, Error **errp)
>   {
> diff --git a/include/hw/s390x/ap-bridge.h b/include/hw/s390x/ap-bridge.h
> index 470e439a98..f4d838bf99 100644
> --- a/include/hw/s390x/ap-bridge.h
> +++ b/include/hw/s390x/ap-bridge.h
> @@ -16,4 +16,26 @@
>   
>   void s390_init_ap(void);
>   
> +typedef struct ChscSeiNt0Res {
> +    uint16_t length;
> +    uint16_t code;
> +    uint8_t reserved1;
> +    uint16_t reserved2;
> +    uint8_t nt;
> +#define PENDING_EVENT_INFO_BITMASK 0x80;
> +    uint8_t flags;
> +    uint8_t reserved3;
> +    uint8_t rs;
> +    uint8_t cc;
> +} QEMU_PACKED ChscSeiNt0Res;
> +
> +#define NT0_RES_RESPONSE_CODE 1;
> +#define NT0_RES_NT_DEFAULT    0;
> +#define NT0_RES_RS_AP_CHANGE  5;
> +#define NT0_RES_CC_AP_CHANGE  3;
> +
> +int ap_chsc_sei_nt0_get_event(void *res);
> +
> +int ap_chsc_sei_nt0_have_event(void);
> +
>   #endif



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2025-03-10 15:57 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-10 15:35 [RFC PATCH v3 0/5] Report vfio-ap configuration changes Rorie Reyes
2025-03-10 15:35 ` [RFC PATCH v3 1/5] linux-headers: NOTFORMERGE - placeholder uapi updates for AP config change Rorie Reyes
2025-03-10 15:35 ` [RFC PATCH v3 2/5] hw/vfio/ap: notification handler for AP config changed event Rorie Reyes
2025-03-10 15:43   ` Anthony Krowiak
2025-03-10 15:35 ` [RFC PATCH v3 3/5] hw/vfio/ap: store object indicating AP config changed in a queue Rorie Reyes
2025-03-10 15:45   ` Anthony Krowiak
2025-03-10 15:35 ` [RFC PATCH v3 4/5] hw/vfio/ap: Storing event information for an AP configuration change event Rorie Reyes
2025-03-10 15:56   ` Anthony Krowiak
2025-03-10 15:35 ` [RFC PATCH v3 5/5] s390: implementing CHSC SEI for AP config change Rorie Reyes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).