On 9/17/26 3:45 AM, Christian Borntraeger wrote:
Am 16.09.26 um 22:32 schrieb Eric Farman:
The ioctl to determine whether KVM_DEV_FLIC_CLEAR_IO_IRQ is present
receives the contents of the attribute struct as its payload,
rather than a pointer to the payload itself as is convention.
This may result in erroneous errors from the ioctl, which would
result in clear_io_supported being false when it otherwise could
be used (which is helpful in device recovery).
Cc: [email protected]
Fixes: 9eccb8622c ("s390x/kvm: add interface for clearing IO irqs")
Signed-off-by: Eric Farman <[email protected]>
---
hw/intc/s390_flic_kvm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c
index f833a3996a..5e6d422fba 100644
--- a/hw/intc/s390_flic_kvm.c
+++ b/hw/intc/s390_flic_kvm.c
@@ -633,7 +633,7 @@ static void kvm_s390_flic_realize(DeviceState
*dev, Error **errp)
/* Check clear_io_irq support */
test_attr.group = KVM_DEV_FLIC_CLEAR_IO_IRQ;
flic_state->clear_io_supported = !ioctl(flic_state->fd,
- KVM_HAS_DEVICE_ATTR,
test_attr);
+ KVM_HAS_DEVICE_ATTR,
&test_attr);
}
static void kvm_s390_flic_reset(DeviceState *dev)
Certainly a correct fix but maybe its not as bad. Aggregates > 8 byte
are passed as
reference. Looks like the third argument is a pointer to a stack copy
when testing, so
the old code might have worked by accident.
Ah, thanks for the assembler, I should have looked at that.
As I was testing this, I became worried that this whole part of error
recovery was broken, but I was finding that clear_io_supported was
already true even without this patch. I presumed ioctl magic, and that
seems to be the case.
Maybe drop the stable tags from this one then, since it's working "by
design"
f8c: d2 0f f0 a8 f0 d8 mvc 168(16,%r15),216(%r15)
<--- stack copy
f92: b9 14 00 20 lgfr %r2,%r0
f96: 41 40 f0 a8 la %r4,168(%r15) <-- pointer
f9a: c0 31 40 18 ae e3 lgfi %r3,1075359459
fa0: d2 07 f0 b8 f0 e8 mvc 184(8,%r15),232(%r15)
fa6: c0 e5 00 00 00 00 brasl %r14,fa6
<kvm_s390_flic_realize+0x136>
fa8: R_390_PLT32DBL ioctl+0x2
KVM_HAS_DEVICE_ATTR,
test_attr);