All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, "Lan,
	Tianyu" <tianyu.lan@intel.com>,
	Igor Mammedov <imammedo@redhat.com>,
	Jan Kiszka <jan.kiszka@web.de>, Peter Xu <peterx@redhat.com>
Subject: Re: [PATCH v1 10/11] KVM: x86: add KVM_CAP_X2APIC_API
Date: Fri, 1 Jul 2016 15:25:14 +0200	[thread overview]
Message-ID: <20160701132514.GD27840@potion> (raw)
In-Reply-To: <d2d4f8f1-990f-a004-de7b-c4fb8f86ca50@redhat.com>

2016-07-01 10:24+0200, Paolo Bonzini:
> On 30/06/2016 22:54, Radim Krčmář wrote:
>> KVM_CAP_X2APIC_API can be enabled to extend APIC ID in get/set ioctl and MSI
>> addresses to 32 bits.  Both are needed to support x2APIC.
>> 
>> The capability has to be toggleable and disabled by default, because get/set
>> ioctl shifted and truncated APIC ID to 8 bits by using a non-standard protocol
>> inspired by xAPIC and the change is not backward-compatible.
>> 
>> Changes to MSI addresses follow the format used by interrupt remapping unit.
>> The upper address word, that used to be 0, contains upper 24 bits of the LAPIC
>> address in its upper 24 bits.  Lower 8 bits are reserved as 0.
>> Using the upper address word is not backward-compatible either as we didn't
>> check that userspace zeroed the word.  Reserved bits are still not explicitly
>> checked, but non-zero data will affect LAPIC addresses, which will cause a bug.
>> 
>> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
>> ---
>>  v1:
>>  * rewritten with a toggleable capability [Paolo]
>>  * dropped MSI_ADDR_EXT_DEST_ID to enforce reserved bits
>> 
>> diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
>  [Rewritten documentation]

Will apply, thanks.

>> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
>> @@ -1365,7 +1367,7 @@ bool kvm_intr_is_single_vcpu(struct kvm *kvm, struct kvm_lapic_irq *irq,
>>  			     struct kvm_vcpu **dest_vcpu);
>>  
>>  void kvm_set_msi_irq(struct kvm_kernel_irq_routing_entry *e,
>> -		     struct kvm_lapic_irq *irq);
>> +		     struct kvm_lapic_irq *irq, bool x2apic_api);
> 
> Just pass a struct kvm as the first argument.

Ok.

>> diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c
>> @@ -111,12 +111,17 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
>>  }
>>  
>>  void kvm_set_msi_irq(struct kvm_kernel_irq_routing_entry *e,
>> -		     struct kvm_lapic_irq *irq)
>> +		     struct kvm_lapic_irq *irq, bool x2apic_api)
>>  {
>>  	trace_kvm_msi_set_irq(e->msi.address_lo, e->msi.data);
>>  
>>  	irq->dest_id = (e->msi.address_lo &
>>  			MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT;
>> +	if (x2apic_api)
>> +		/* MSI_ADDR_EXT_DEST_ID() is omitted to introduce bugs on
>> +		 * userspaces that set reserved bits 0-7.
>> +		 */
> 
> Reread Rusty's API design guidelines and come back. ;)

I still consider it as an improvement over not checking at all. ;)

> Seriously, please validate the address_hi at both places
> (KVM_SET_GSI_ROUTING and KVM_SIGNAL_MSI) and WARN here if you get
> non-zero bits 7-0.

This is of course better, will do necessary changes.

>> +		irq->dest_id |= e->msi.address_hi;
>>  	irq->vector = (e->msi.data &
>>  			MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT;
>>  	irq->dest_mode = (1 << MSI_ADDR_DEST_MODE_SHIFT) & e->msi.address_lo;
>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>> @@ -3799,6 +3800,17 @@ split_irqchip_unlock:
>> +	case KVM_CAP_X2APIC_API: {
>> +		struct kvm_enable_cap valid = {.cap = KVM_CAP_X2APIC_API};
>> +
>> +		r = -EINVAL;
>> +		if (memcmp(cap, &valid, sizeof(valid)))
>> +			break;
> 
> Nice trick, and strict argument checking in general is a good idea.
> However it's ugly to do it only for KVM_CAP_X2APIC_API and we've really
> bad at strict argument checking elsewhere.  For consistency, please
> check that args[0] is zero, and forgo other violations. :(

Ok.

Thanks.

  reply	other threads:[~2016-07-01 13:25 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-30 20:54 [PATCH v1 00/11] KVM: x86: break the xAPIC barrier Radim Krčmář
2016-06-30 20:54 ` [PATCH v1 01/11] KVM: x86: bump KVM_SOFT_MAX_VCPUS to 240 Radim Krčmář
2016-07-01  8:42   ` Paolo Bonzini
2016-06-30 20:54 ` [PATCH v1 02/11] KVM: x86: add kvm_apic_map_get_dest_lapic Radim Krčmář
2016-07-01  7:57   ` Paolo Bonzini
2016-07-01 12:39     ` Radim Krčmář
2016-06-30 20:54 ` [PATCH v1 03/11] KVM: x86: dynamic kvm_apic_map Radim Krčmář
2016-06-30 22:15   ` Andrew Honig
2016-07-01  8:42     ` Paolo Bonzini
2016-07-01 12:44       ` Radim Krčmář
2016-07-01 14:03         ` Paolo Bonzini
2016-07-01 14:38           ` Radim Krčmář
2016-07-01 15:06             ` Paolo Bonzini
2016-07-01 15:12               ` Paolo Bonzini
2016-07-01 15:43                 ` Radim Krčmář
2016-07-01 16:38                   ` Paolo Bonzini
2016-07-01 15:35               ` Radim Krčmář
2016-07-01  7:33   ` Paolo Bonzini
2016-06-30 20:54 ` [PATCH v1 04/11] KVM: x86: use u16 for logical VCPU mask in lapic Radim Krčmář
2016-07-01  7:56   ` Paolo Bonzini
2016-07-01 12:48     ` Radim Krčmář
2016-07-01 14:04       ` Paolo Bonzini
2016-06-30 20:54 ` [PATCH v1 05/11] KVM: x86: use generic function for MSI parsing Radim Krčmář
2016-07-01  8:42   ` Paolo Bonzini
2016-06-30 20:54 ` [PATCH v1 06/11] KVM: x86: use hardware-compatible format for APIC ID register Radim Krčmář
2016-07-01  8:33   ` Paolo Bonzini
2016-07-01 13:11     ` Radim Krčmář
2016-07-01 14:12       ` Paolo Bonzini
2016-07-01 14:54         ` Radim Krčmář
2016-07-01 15:07           ` Paolo Bonzini
2016-07-01 15:53             ` Radim Krčmář
2016-07-01 16:37               ` Paolo Bonzini
2016-06-30 20:54 ` [PATCH v1 07/11] KVM: VMX: optimize APIC ID read with APICv Radim Krčmář
2016-07-01  8:42   ` Paolo Bonzini
2016-06-30 20:54 ` [PATCH v1 08/11] KVM: x86: directly call recalculate_apic_map on lapic restore Radim Krčmář
2016-07-01  8:43   ` Paolo Bonzini
2016-06-30 20:54 ` [PATCH v1 09/11] KVM: x86: reset lapic base in kvm_lapic_reset Radim Krčmář
2016-07-01  8:43   ` Paolo Bonzini
2016-06-30 20:54 ` [PATCH v1 10/11] KVM: x86: add KVM_CAP_X2APIC_API Radim Krčmář
2016-07-01  8:24   ` Paolo Bonzini
2016-07-01 13:25     ` Radim Krčmář [this message]
2016-07-01 18:09   ` David Matlack
2016-07-01 18:31     ` Radim Krčmář
2016-06-30 20:54 ` [PATCH v1 11/11] KVM: x86: bump MAX_VCPUS to 288 Radim Krčmář
2016-07-01  8:43   ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160701132514.GD27840@potion \
    --to=rkrcmar@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=jan.kiszka@web.de \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=tianyu.lan@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.