diff mbox

[1/2] arm/arm64: kvm: drop inappropriate use of kvm_is_mmio_pfn()

Message ID 1415608436-5127-1-git-send-email-ard.biesheuvel@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Ard Biesheuvel Nov. 10, 2014, 8:33 a.m. UTC
Instead of using kvm_is_mmio_pfn() to decide whether a host region
should be stage 2 mapped with device attributes, add a new static
function kvm_is_device_pfn() that disregards RAM pages with the
reserved bit set, as those should usually not be mapped as device
memory.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 arch/arm/kvm/mmu.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Christoffer Dall Nov. 10, 2014, 10:57 a.m. UTC | #1
On Mon, Nov 10, 2014 at 09:33:55AM +0100, Ard Biesheuvel wrote:
> Instead of using kvm_is_mmio_pfn() to decide whether a host region
> should be stage 2 mapped with device attributes, add a new static
> function kvm_is_device_pfn() that disregards RAM pages with the
> reserved bit set, as those should usually not be mapped as device
> memory.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
>  arch/arm/kvm/mmu.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> index 57a403a5c22b..b007438242e2 100644
> --- a/arch/arm/kvm/mmu.c
> +++ b/arch/arm/kvm/mmu.c
> @@ -834,6 +834,11 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
>  	return kvm_vcpu_dabt_iswrite(vcpu);
>  }
>  
> +static bool kvm_is_device_pfn(unsigned long pfn)
> +{
> +	return !pfn_valid(pfn);
> +}

So this works for Magnus' use case, because a device tree memreserve
results in reserved, but valid, existing pages being backed by a struct
page?

> +
>  static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>  			  struct kvm_memory_slot *memslot, unsigned long hva,
>  			  unsigned long fault_status)
> @@ -904,7 +909,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>  	if (is_error_pfn(pfn))
>  		return -EFAULT;
>  
> -	if (kvm_is_mmio_pfn(pfn))
> +	if (kvm_is_device_pfn(pfn))
>  		mem_type = PAGE_S2_DEVICE;
>  
>  	spin_lock(&kvm->mmu_lock);
> -- 
> 1.8.3.2
> 

If my understanding above is correct, then:

Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ard Biesheuvel Nov. 10, 2014, 11:15 a.m. UTC | #2
On 10 November 2014 11:57, Christoffer Dall <christoffer.dall@linaro.org> wrote:
> On Mon, Nov 10, 2014 at 09:33:55AM +0100, Ard Biesheuvel wrote:
>> Instead of using kvm_is_mmio_pfn() to decide whether a host region
>> should be stage 2 mapped with device attributes, add a new static
>> function kvm_is_device_pfn() that disregards RAM pages with the
>> reserved bit set, as those should usually not be mapped as device
>> memory.
>>
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>> ---
>>  arch/arm/kvm/mmu.c | 7 ++++++-
>>  1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
>> index 57a403a5c22b..b007438242e2 100644
>> --- a/arch/arm/kvm/mmu.c
>> +++ b/arch/arm/kvm/mmu.c
>> @@ -834,6 +834,11 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
>>       return kvm_vcpu_dabt_iswrite(vcpu);
>>  }
>>
>> +static bool kvm_is_device_pfn(unsigned long pfn)
>> +{
>> +     return !pfn_valid(pfn);
>> +}
>
> So this works for Magnus' use case, because a device tree memreserve
> results in reserved, but valid, existing pages being backed by a struct
> page?
>

That is the idea, yes, but it would be good if he could confirm that
it works as expected.

Also, there may be some corner cases where pfn_valid returns false for
regions that are in fact mapped as MT_NORMAL by the host kernel, i.e.,
UEFI configuration tables, for instance, so this test may require
further refinement. But it at least eliminates the false positives for
plain memreserve regions.


>> +
>>  static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>>                         struct kvm_memory_slot *memslot, unsigned long hva,
>>                         unsigned long fault_status)
>> @@ -904,7 +909,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>>       if (is_error_pfn(pfn))
>>               return -EFAULT;
>>
>> -     if (kvm_is_mmio_pfn(pfn))
>> +     if (kvm_is_device_pfn(pfn))
>>               mem_type = PAGE_S2_DEVICE;
>>
>>       spin_lock(&kvm->mmu_lock);
>> --
>> 1.8.3.2
>>
>
> If my understanding above is correct, then:
>
> Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Christoffer Dall Nov. 21, 2014, 11:24 a.m. UTC | #3
On Mon, Nov 10, 2014 at 09:33:55AM +0100, Ard Biesheuvel wrote:
> Instead of using kvm_is_mmio_pfn() to decide whether a host region
> should be stage 2 mapped with device attributes, add a new static
> function kvm_is_device_pfn() that disregards RAM pages with the
> reserved bit set, as those should usually not be mapped as device
> memory.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
>  arch/arm/kvm/mmu.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> index 57a403a5c22b..b007438242e2 100644
> --- a/arch/arm/kvm/mmu.c
> +++ b/arch/arm/kvm/mmu.c
> @@ -834,6 +834,11 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
>  	return kvm_vcpu_dabt_iswrite(vcpu);
>  }
>  
> +static bool kvm_is_device_pfn(unsigned long pfn)
> +{
> +	return !pfn_valid(pfn);
> +}
> +
>  static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>  			  struct kvm_memory_slot *memslot, unsigned long hva,
>  			  unsigned long fault_status)
> @@ -904,7 +909,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>  	if (is_error_pfn(pfn))
>  		return -EFAULT;
>  
> -	if (kvm_is_mmio_pfn(pfn))
> +	if (kvm_is_device_pfn(pfn))
>  		mem_type = PAGE_S2_DEVICE;
>  
>  	spin_lock(&kvm->mmu_lock);
> -- 
> 1.8.3.2
> 
Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ard Biesheuvel Dec. 1, 2014, 9:16 a.m. UTC | #4
On 21 November 2014 at 12:24, Christoffer Dall
<christoffer.dall@linaro.org> wrote:
> On Mon, Nov 10, 2014 at 09:33:55AM +0100, Ard Biesheuvel wrote:
>> Instead of using kvm_is_mmio_pfn() to decide whether a host region
>> should be stage 2 mapped with device attributes, add a new static
>> function kvm_is_device_pfn() that disregards RAM pages with the
>> reserved bit set, as those should usually not be mapped as device
>> memory.
>>
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>> ---
>>  arch/arm/kvm/mmu.c | 7 ++++++-
>>  1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
>> index 57a403a5c22b..b007438242e2 100644
>> --- a/arch/arm/kvm/mmu.c
>> +++ b/arch/arm/kvm/mmu.c
>> @@ -834,6 +834,11 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
>>       return kvm_vcpu_dabt_iswrite(vcpu);
>>  }
>>
>> +static bool kvm_is_device_pfn(unsigned long pfn)
>> +{
>> +     return !pfn_valid(pfn);
>> +}
>> +
>>  static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>>                         struct kvm_memory_slot *memslot, unsigned long hva,
>>                         unsigned long fault_status)
>> @@ -904,7 +909,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>>       if (is_error_pfn(pfn))
>>               return -EFAULT;
>>
>> -     if (kvm_is_mmio_pfn(pfn))
>> +     if (kvm_is_device_pfn(pfn))
>>               mem_type = PAGE_S2_DEVICE;
>>
>>       spin_lock(&kvm->mmu_lock);
>> --
>> 1.8.3.2
>>
> Acked-by: Christoffer Dall <christoffer.dall@linaro.org>

These 2 patches are now in 3.18-rc7, so they can be dropped from the
kvmarm queue/next/etc branches

Thanks,
Ard.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Paolo Bonzini Dec. 1, 2014, 9:54 a.m. UTC | #5
On 01/12/2014 10:16, Ard Biesheuvel wrote:
> On 21 November 2014 at 12:24, Christoffer Dall
> <christoffer.dall@linaro.org> wrote:
>> On Mon, Nov 10, 2014 at 09:33:55AM +0100, Ard Biesheuvel wrote:
>>> Instead of using kvm_is_mmio_pfn() to decide whether a host region
>>> should be stage 2 mapped with device attributes, add a new static
>>> function kvm_is_device_pfn() that disregards RAM pages with the
>>> reserved bit set, as those should usually not be mapped as device
>>> memory.
>>>
>>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>>> ---
>>>  arch/arm/kvm/mmu.c | 7 ++++++-
>>>  1 file changed, 6 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
>>> index 57a403a5c22b..b007438242e2 100644
>>> --- a/arch/arm/kvm/mmu.c
>>> +++ b/arch/arm/kvm/mmu.c
>>> @@ -834,6 +834,11 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
>>>       return kvm_vcpu_dabt_iswrite(vcpu);
>>>  }
>>>
>>> +static bool kvm_is_device_pfn(unsigned long pfn)
>>> +{
>>> +     return !pfn_valid(pfn);
>>> +}
>>> +
>>>  static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>>>                         struct kvm_memory_slot *memslot, unsigned long hva,
>>>                         unsigned long fault_status)
>>> @@ -904,7 +909,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>>>       if (is_error_pfn(pfn))
>>>               return -EFAULT;
>>>
>>> -     if (kvm_is_mmio_pfn(pfn))
>>> +     if (kvm_is_device_pfn(pfn))
>>>               mem_type = PAGE_S2_DEVICE;
>>>
>>>       spin_lock(&kvm->mmu_lock);
>>> --
>>> 1.8.3.2
>>>
>> Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
> 
> These 2 patches are now in 3.18-rc7, so they can be dropped from the
> kvmarm queue/next/etc branches

If they are in queue, they can be dropped.  If they are in next, please
leave them in as the next branch should not be rebased.  Duplicate
commits are generally harmless.

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Christoffer Dall Dec. 1, 2014, 12:23 p.m. UTC | #6
On Mon, Dec 01, 2014 at 10:54:44AM +0100, Paolo Bonzini wrote:
> 
> 
> On 01/12/2014 10:16, Ard Biesheuvel wrote:
> > On 21 November 2014 at 12:24, Christoffer Dall
> > <christoffer.dall@linaro.org> wrote:
> >> On Mon, Nov 10, 2014 at 09:33:55AM +0100, Ard Biesheuvel wrote:
> >>> Instead of using kvm_is_mmio_pfn() to decide whether a host region
> >>> should be stage 2 mapped with device attributes, add a new static
> >>> function kvm_is_device_pfn() that disregards RAM pages with the
> >>> reserved bit set, as those should usually not be mapped as device
> >>> memory.
> >>>
> >>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> >>> ---
> >>>  arch/arm/kvm/mmu.c | 7 ++++++-
> >>>  1 file changed, 6 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> >>> index 57a403a5c22b..b007438242e2 100644
> >>> --- a/arch/arm/kvm/mmu.c
> >>> +++ b/arch/arm/kvm/mmu.c
> >>> @@ -834,6 +834,11 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
> >>>       return kvm_vcpu_dabt_iswrite(vcpu);
> >>>  }
> >>>
> >>> +static bool kvm_is_device_pfn(unsigned long pfn)
> >>> +{
> >>> +     return !pfn_valid(pfn);
> >>> +}
> >>> +
> >>>  static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
> >>>                         struct kvm_memory_slot *memslot, unsigned long hva,
> >>>                         unsigned long fault_status)
> >>> @@ -904,7 +909,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
> >>>       if (is_error_pfn(pfn))
> >>>               return -EFAULT;
> >>>
> >>> -     if (kvm_is_mmio_pfn(pfn))
> >>> +     if (kvm_is_device_pfn(pfn))
> >>>               mem_type = PAGE_S2_DEVICE;
> >>>
> >>>       spin_lock(&kvm->mmu_lock);
> >>> --
> >>> 1.8.3.2
> >>>
> >> Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
> > 
> > These 2 patches are now in 3.18-rc7, so they can be dropped from the
> > kvmarm queue/next/etc branches
> 
> If they are in queue, they can be dropped.  If they are in next, please
> leave them in as the next branch should not be rebased.  Duplicate
> commits are generally harmless.
> 
They are in kvmarm/next and will stay there ;)

-Christoffer
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 57a403a5c22b..b007438242e2 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -834,6 +834,11 @@  static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
 	return kvm_vcpu_dabt_iswrite(vcpu);
 }
 
+static bool kvm_is_device_pfn(unsigned long pfn)
+{
+	return !pfn_valid(pfn);
+}
+
 static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
 			  struct kvm_memory_slot *memslot, unsigned long hva,
 			  unsigned long fault_status)
@@ -904,7 +909,7 @@  static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
 	if (is_error_pfn(pfn))
 		return -EFAULT;
 
-	if (kvm_is_mmio_pfn(pfn))
+	if (kvm_is_device_pfn(pfn))
 		mem_type = PAGE_S2_DEVICE;
 
 	spin_lock(&kvm->mmu_lock);