Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1444442 > unrolled thread

[PATCH] efi: capsule: allocate whole capsule into virtual memory

Started byAustin Christ <austinwc@codeaurora.org>
First post2016-07-15 18:50 +0200
Last post2016-07-21 23:10 +0200
Articles 3 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] efi: capsule: allocate whole capsule into virtual memory Austin Christ <austinwc@codeaurora.org> - 2016-07-15 18:50 +0200
    Re: [PATCH] efi: capsule: allocate whole capsule into virtual memory Matt Fleming <matt@codeblueprint.co.uk> - 2016-07-21 15:20 +0200
      Re: [PATCH] efi: capsule: allocate whole capsule into virtual memory "Christ, Austin" <austinwc@codeaurora.org> - 2016-07-21 23:10 +0200

#1444442 — [PATCH] efi: capsule: allocate whole capsule into virtual memory

FromAustin Christ <austinwc@codeaurora.org>
Date2016-07-15 18:50 +0200
Subject[PATCH] efi: capsule: allocate whole capsule into virtual memory
Message-ID<rVetj-No-19@gated-at.bofh.it>
According to UEFI 2.6 section 7.5.3, the capsule should be in contiguous
virtual memory and firmware may consume the capsule immediately. To
correctly implement this functionality, the kernel driver needs to vmap
the entire capsule at the time it is made available to firmware.

The virtual allocation of the capsule update has been changed from kmap,
which was only allocating the first page of the update, to vmap and
allocates the entire data payload.

Signed-off-by: Austin Christ <austinwc@codeaurora.org>
---
 drivers/firmware/efi/capsule-loader.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
index c99c24b..c4f3c20 100644
--- a/drivers/firmware/efi/capsule-loader.c
+++ b/drivers/firmware/efi/capsule-loader.c
@@ -16,6 +16,7 @@
 #include <linux/slab.h>
 #include <linux/mutex.h>
 #include <linux/efi.h>
+#include <linux/vmalloc.h>
 
 #define NO_FURTHER_WRITE_ACTION -1
 
@@ -108,14 +109,15 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
 	int ret;
 	void *cap_hdr_temp;
 
-	cap_hdr_temp = kmap(cap_info->pages[0]);
+	cap_hdr_temp = vmap(cap_info->pages, cap_info->index,
+			VM_MAP, PAGE_KERNEL);
 	if (!cap_hdr_temp) {
 		pr_debug("%s: kmap() failed\n", __func__);
 		return -EFAULT;
 	}
 
 	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
-	kunmap(cap_info->pages[0]);
+	vunmap(cap_hdr_temp);
 	if (ret) {
 		pr_err("%s: efi_capsule_update() failed\n", __func__);
 		return ret;
-- 
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project.

[toc] | [next] | [standalone]


#1447873

FromMatt Fleming <matt@codeblueprint.co.uk>
Date2016-07-21 15:20 +0200
Message-ID<rXm3o-7UG-21@gated-at.bofh.it>
In reply to#1444442
On Fri, 15 Jul, at 10:41:31AM, Christ, Austin wrote:
> According to UEFI 2.6 section 7.5.3, the capsule should be in contiguous
> virtual memory and firmware may consume the capsule immediately. To
> correctly implement this functionality, the kernel driver needs to vmap
> the entire capsule at the time it is made available to firmware.
> 
> The virtual allocation of the capsule update has been changed from kmap,
> which was only allocating the first page of the update, to vmap and
> allocates the entire data payload.
> 
> Signed-off-by: Austin Christ <austinwc@codeaurora.org>
> ---
>  drivers/firmware/efi/capsule-loader.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
> index c99c24b..c4f3c20 100644
> --- a/drivers/firmware/efi/capsule-loader.c
> +++ b/drivers/firmware/efi/capsule-loader.c
> @@ -16,6 +16,7 @@
>  #include <linux/slab.h>
>  #include <linux/mutex.h>
>  #include <linux/efi.h>
> +#include <linux/vmalloc.h>
>  
>  #define NO_FURTHER_WRITE_ACTION -1
>  
> @@ -108,14 +109,15 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
>  	int ret;
>  	void *cap_hdr_temp;
>  
> -	cap_hdr_temp = kmap(cap_info->pages[0]);
> +	cap_hdr_temp = vmap(cap_info->pages, cap_info->index,
> +			VM_MAP, PAGE_KERNEL);
>  	if (!cap_hdr_temp) {
>  		pr_debug("%s: kmap() failed\n", __func__);
>  		return -EFAULT;
>  	}
>  
>  	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
> -	kunmap(cap_info->pages[0]);
> +	vunmap(cap_hdr_temp);
>  	if (ret) {
>  		pr_err("%s: efi_capsule_update() failed\n", __func__);
>  		return ret;

Looks OK to me but could you also update the comments above
efi_capsule_update() that mention the virtual mapping only being
required for the first page?

[toc] | [prev] | [next] | [standalone]


#1448146

From"Christ, Austin" <austinwc@codeaurora.org>
Date2016-07-21 23:10 +0200
Message-ID<rXtoe-4vY-29@gated-at.bofh.it>
In reply to#1447873
Hey Matt,


On 7/21/2016 7:12 AM, Matt Fleming wrote:
> On Fri, 15 Jul, at 10:41:31AM, Christ, Austin wrote:
>> According to UEFI 2.6 section 7.5.3, the capsule should be in contiguous
>> virtual memory and firmware may consume the capsule immediately. To
>> correctly implement this functionality, the kernel driver needs to vmap
>> the entire capsule at the time it is made available to firmware.
>>
>> The virtual allocation of the capsule update has been changed from kmap,
>> which was only allocating the first page of the update, to vmap and
>> allocates the entire data payload.
>>
>> Signed-off-by: Austin Christ <austinwc@codeaurora.org>
>> ---
>>   drivers/firmware/efi/capsule-loader.c | 6 ++++--
>>   1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
>> index c99c24b..c4f3c20 100644
>> --- a/drivers/firmware/efi/capsule-loader.c
>> +++ b/drivers/firmware/efi/capsule-loader.c
>> @@ -16,6 +16,7 @@
>>   #include <linux/slab.h>
>>   #include <linux/mutex.h>
>>   #include <linux/efi.h>
>> +#include <linux/vmalloc.h>
>>   
>>   #define NO_FURTHER_WRITE_ACTION -1
>>   
>> @@ -108,14 +109,15 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
>>   	int ret;
>>   	void *cap_hdr_temp;
>>   
>> -	cap_hdr_temp = kmap(cap_info->pages[0]);
>> +	cap_hdr_temp = vmap(cap_info->pages, cap_info->index,
>> +			VM_MAP, PAGE_KERNEL);
>>   	if (!cap_hdr_temp) {
>>   		pr_debug("%s: kmap() failed\n", __func__);
>>   		return -EFAULT;
>>   	}
>>   
>>   	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
>> -	kunmap(cap_info->pages[0]);
>> +	vunmap(cap_hdr_temp);
>>   	if (ret) {
>>   		pr_err("%s: efi_capsule_update() failed\n", __func__);
>>   		return ret;
> Looks OK to me but could you also update the comments above
> efi_capsule_update() that mention the virtual mapping only being
> required for the first page?
That's a great point. The comments will be updated in v2.

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

Thanks,
Austin

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web