On 19/12/18 16:53, Michael S. Tsirkin wrote: > On Wed, Dec 19, 2018 at 04:50:35PM +0800, Peter Xu wrote: >> This patch allows the kvm_arch_irqchip_create() to return 0 if the >> split irqchip is specified but not forced by the user. Also, modify >> kvm_irqchip_create() similiarly. >> >> This patch should have no functional change for existing code since >> currently if split is specified it must be forced by the user so we'll >> always have machine_kernel_irqchip_required() returns true. However it >> could potentially be used in follow up patches when we want to turn >> split kernel irqchip as default for QEMU 4.0 which could trigger the >> case that kernel_irqchip_required=N while kernel_irqchip_split=Y. When >> with that, we'll first try with split irqchip, and falls back to >> normal kernel irqchip when split capability is not provided by the >> kernel. >> >> This brings us benefit that we can even run a default QEMU 4.0 on old >> kernels that does not support split irqchip (<4.4) but at the same >> time enable split irqchip for new kernels (>=4.4) as default. >> >> Signed-off-by: Peter Xu <pet...@redhat.com> > > Paolo, if you can ack this one, I can merge the rest.
If I understand the code well, there is no change needed in the rest of the code; having the semantics I asked for simply requires dropping this patch. However, the commit messages need some adjustment. Paolo > >> --- >> accel/kvm/kvm-all.c | 3 ++- >> target/i386/kvm.c | 6 +++--- >> 2 files changed, 5 insertions(+), 4 deletions(-) >> >> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c >> index 4880a05399..b008364041 100644 >> --- a/accel/kvm/kvm-all.c >> +++ b/accel/kvm/kvm-all.c >> @@ -1468,7 +1468,8 @@ static void kvm_irqchip_create(MachineState *machine, >> KVMState *s) >> * in-kernel irqchip for us */ >> ret = kvm_arch_irqchip_create(machine, s); >> if (ret == 0) { >> - if (machine_kernel_irqchip_split(machine)) { >> + if (machine_kernel_irqchip_required(machine) && >> + machine_kernel_irqchip_split(machine)) { >> perror("Split IRQ chip mode not supported."); >> exit(1); >> } else { >> diff --git a/target/i386/kvm.c b/target/i386/kvm.c >> index 739cf8c8ea..8f919f8f9f 100644 >> --- a/target/i386/kvm.c >> +++ b/target/i386/kvm.c >> @@ -3685,9 +3685,9 @@ int kvm_arch_irqchip_create(MachineState *ms, KVMState >> *s) >> if (machine_kernel_irqchip_split(ms)) { >> ret = kvm_vm_enable_cap(s, KVM_CAP_SPLIT_IRQCHIP, 0, 24); >> if (ret) { >> - error_report("Could not enable split irqchip mode: %s", >> - strerror(-ret)); >> - exit(1); >> + assert(ret < 0); >> + /* If split not required, return 0 instead to retry */ >> + return machine_kernel_irqchip_required(ms) ? ret : 0; >> } else { >> DPRINTF("Enabled KVM_CAP_SPLIT_IRQCHIP\n"); >> kvm_split_irqchip = true; >> -- >> 2.17.1