diff mbox series

[1/4] kvm: let split be optional for kvm_arch_irqchip_create

Message ID 20181219085038.7729-2-peterx@redhat.com
State New
Headers show
Series q35: change defaults for kernel irqchip and IR | expand

Commit Message

Peter Xu Dec. 19, 2018, 8:50 a.m. UTC
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 <peterx@redhat.com>
---
 accel/kvm/kvm-all.c | 3 ++-
 target/i386/kvm.c   | 6 +++---
 2 files changed, 5 insertions(+), 4 deletions(-)

Comments

Michael S. Tsirkin Dec. 19, 2018, 3:53 p.m. UTC | #1
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 <peterx@redhat.com>

Paolo, if you can ack this one, I can merge the rest.

> ---
>  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
Paolo Bonzini Dec. 19, 2018, 8:15 p.m. UTC | #2
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 <peterx@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
diff mbox series

Patch

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;