@@ -96,6 +99,49 @@ static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
    }
  +bool ap_chsc_sei_nt0_get_event(void *res)
+{
+    ChscSeiNt0Res *nt0_res  = (ChscSeiNt0Res *)res;
+    APConfigChgEvent *cfg_chg_event;
+
+    qemu_mutex_lock(&cfg_chg_events_lock);
+
+    if (!ap_chsc_sei_nt0_have_event()) {
+        qemu_mutex_unlock(&cfg_chg_events_lock);
+        return true;
+    }
+
+    cfg_chg_event = QTAILQ_FIRST(&cfg_chg_events);
+    QTAILQ_REMOVE(&cfg_chg_events, cfg_chg_event, next);
+
+    qemu_mutex_unlock(&cfg_chg_events_lock);
+
+    memset(nt0_res, 0, sizeof(*nt0_res));
+    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 false;
+}

The boolean return values in the function above do not make logical sense. What they are effectively saying is that event information has been stored in the response when there is no event information to store (i.e., the event
queue is empty), and that event information has not been stored if the
response has been filled with event information.

After looking at the calling code in target/s390x/ionst.c, apparently the meaning of the int value originally returned from the above function was not in fact intended to be a boolean value. It looks like the caller uses this value to indicate whether the response code should be set to 0x0001 (this function returns 0) or 0x0005 (this function returns 1); so, the boolean values returned match what is expected by the caller. I think this is why your original pass at returning a boolean caused your
patch to fail; because you did what made logical sense in this function.

I think the calling code is very convoluted to say the least, so maybe what makes sense here is to continue to return an int and use #define to document the return value; for
example:

#define EVENT_INFORMATION_STORED           0
#define EVENT_INFORMATION_NOT_STORED 1

It would probably make a great deal of sense to refactor the calling code, but that could potentially open up a large can of worms, so at least this makes sense from
the perspective of reading this code.

I agree with you on that, Tony. It makes sense to return an int due to the calling code. I will make these updates and set up the appropriate definitions in the header file, 'ap-bridge.h'. I'll also reflect the same type changes in the stub file to match
+
+bool ap_chsc_sei_nt0_have_event(void)
+{
+    return !QTAILQ_EMPTY(&cfg_chg_events);
+}

It's probably fine to return boolean from the above function because it
makes sense even from the caller's perspective.

I'll keep this as is as, but I'll update the stub file to match


Reply via email to