Patchwork [1/2] uefirtvariable: add stress test for UEFI runtime interface GetVariable

login
register
mail settings
Submitter Ivan Hu
Date Dec. 27, 2012, 8:06 a.m.
Message ID <1356595595-24161-1-git-send-email-ivan.hu@canonical.com>
Download mbox | patch
Permalink /patch/208278/
State Accepted
Headers show

Comments

Ivan Hu - Dec. 27, 2012, 8:06 a.m.
This stress test tests the UEFI runtime interface GetVariable by
calling multiple times.

Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
---
 src/uefi/uefirtvariable/uefirtvariable.c |   37 ++++++++++++++++++++++--------
 1 file changed, 28 insertions(+), 9 deletions(-)
Colin King - Dec. 27, 2012, 7:51 p.m.
On 27/12/12 08:06, Ivan Hu wrote:
> This stress test tests the UEFI runtime interface GetVariable by
> calling multiple times.
>
> Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
> ---
>   src/uefi/uefirtvariable/uefirtvariable.c |   37 ++++++++++++++++++++++--------
>   1 file changed, 28 insertions(+), 9 deletions(-)
>
> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
> index 2b66371..a8b9326 100644
> --- a/src/uefi/uefirtvariable/uefirtvariable.c
> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
> @@ -80,7 +80,7 @@ static int uefirtvariable_deinit(fwts_framework *fw)
>   	return FWTS_OK;
>   }
>
> -static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *varname)
> +static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *varname, uint32_t multitesttime)
>   {
>   	long ioret;
>   	struct efi_getvariable getvariable;
> @@ -93,6 +93,8 @@ static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
>   	uint32_t attributestest;
>
>   	uint8_t data[datasize+1];
> +	uint32_t i;
> +
>   	for (dataindex = 0; dataindex < datasize; dataindex++)
>   		data[dataindex] = (uint8_t)dataindex;
>   	data[dataindex] = '\0';
> @@ -120,14 +122,15 @@ static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
>   	getvariable.Data = testdata;
>   	getvariable.status = &status;
>
> -	ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
> -	if (ioret == -1) {
> -		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariable",
> -			"Failed to get variable with UEFI runtime service.");
> -		fwts_uefi_print_status_info(fw, status);
> -		goto err_restore_env;
> +	for (i = 0; i < multitesttime; i++) {
> +		ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
> +		if (ioret == -1) {
> +			fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariable",
> +				"Failed to get variable with UEFI runtime service.");
> +			fwts_uefi_print_status_info(fw, status);
> +			goto err_restore_env;
> +		}
>   	}
> -
>   	if (*getvariable.status != EFI_SUCCESS) {
>   		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariableStatus",
>   			"Failed to get variable, return status isn't EFI_SUCCESS.");
> @@ -718,8 +721,9 @@ static int do_queryvariableinfo(uint64_t *status, uint64_t *remvarstoragesize, u
>   static int uefirtvariable_test1(fwts_framework *fw)
>   {
>   	uint64_t datasize = 10;
> +	uint32_t multitesttime = 1;
>
> -	if (getvariable_test(fw, datasize, variablenametest) == FWTS_ERROR)
> +	if (getvariable_test(fw, datasize, variablenametest, multitesttime) == FWTS_ERROR)
>   		return FWTS_ERROR;
>
>   	fwts_passed(fw, "UEFI runtime service GetVariable interface test passed.");
> @@ -799,11 +803,26 @@ static int uefirtvariable_test4(fwts_framework *fw)
>   	return FWTS_OK;
>   }
>
> +static int uefirtvariable_test5(fwts_framework *fw)
> +{
> +	uint32_t multitesttime = 1024;
> +	uint64_t datasize = 10;
> +
> +	fwts_log_info(fw, "Testing GetVariable on getting the variable multiple times.");
> +	if (getvariable_test(fw, datasize, variablenametest, multitesttime) == FWTS_ERROR)
> +		return FWTS_ERROR;
> +	fwts_passed(fw, "GetVariable on getting the variable multiple times passed.");
> +
> +	return FWTS_OK;
> +
> +}
> +
>   static fwts_framework_minor_test uefirtvariable_tests[] = {
>   	{ uefirtvariable_test1, "Test UEFI RT service get variable interface." },
>   	{ uefirtvariable_test2, "Test UEFI RT service get next variable name interface." },
>   	{ uefirtvariable_test3, "Test UEFI RT service set variable interface." },
>   	{ uefirtvariable_test4, "Test UEFI RT service query variable info interface." },
> +	{ uefirtvariable_test5, "Test UEFI RT service variable interface stress test." },
>   	{ NULL, NULL }
>   };
>
>
Seems reasonable to me.

Acked-by: Colin Ian King <colin.king@canonical.com>
Alex Hung - Jan. 2, 2013, 3:16 a.m.
On 12/27/2012 04:06 PM, Ivan Hu wrote:
> This stress test tests the UEFI runtime interface GetVariable by
> calling multiple times.
>
> Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
> ---
>   src/uefi/uefirtvariable/uefirtvariable.c |   37 ++++++++++++++++++++++--------
>   1 file changed, 28 insertions(+), 9 deletions(-)
>
> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
> index 2b66371..a8b9326 100644
> --- a/src/uefi/uefirtvariable/uefirtvariable.c
> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
> @@ -80,7 +80,7 @@ static int uefirtvariable_deinit(fwts_framework *fw)
>   	return FWTS_OK;
>   }
>
> -static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *varname)
> +static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *varname, uint32_t multitesttime)
>   {
>   	long ioret;
>   	struct efi_getvariable getvariable;
> @@ -93,6 +93,8 @@ static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
>   	uint32_t attributestest;
>
>   	uint8_t data[datasize+1];
> +	uint32_t i;
> +
>   	for (dataindex = 0; dataindex < datasize; dataindex++)
>   		data[dataindex] = (uint8_t)dataindex;
>   	data[dataindex] = '\0';
> @@ -120,14 +122,15 @@ static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
>   	getvariable.Data = testdata;
>   	getvariable.status = &status;
>
> -	ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
> -	if (ioret == -1) {
> -		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariable",
> -			"Failed to get variable with UEFI runtime service.");
> -		fwts_uefi_print_status_info(fw, status);
> -		goto err_restore_env;
> +	for (i = 0; i < multitesttime; i++) {
> +		ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
> +		if (ioret == -1) {
> +			fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariable",
> +				"Failed to get variable with UEFI runtime service.");
> +			fwts_uefi_print_status_info(fw, status);
> +			goto err_restore_env;
> +		}
>   	}
> -
>   	if (*getvariable.status != EFI_SUCCESS) {
>   		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariableStatus",
>   			"Failed to get variable, return status isn't EFI_SUCCESS.");
> @@ -718,8 +721,9 @@ static int do_queryvariableinfo(uint64_t *status, uint64_t *remvarstoragesize, u
>   static int uefirtvariable_test1(fwts_framework *fw)
>   {
>   	uint64_t datasize = 10;
> +	uint32_t multitesttime = 1;
>
> -	if (getvariable_test(fw, datasize, variablenametest) == FWTS_ERROR)
> +	if (getvariable_test(fw, datasize, variablenametest, multitesttime) == FWTS_ERROR)
>   		return FWTS_ERROR;
>
>   	fwts_passed(fw, "UEFI runtime service GetVariable interface test passed.");
> @@ -799,11 +803,26 @@ static int uefirtvariable_test4(fwts_framework *fw)
>   	return FWTS_OK;
>   }
>
> +static int uefirtvariable_test5(fwts_framework *fw)
> +{
> +	uint32_t multitesttime = 1024;
> +	uint64_t datasize = 10;
> +
> +	fwts_log_info(fw, "Testing GetVariable on getting the variable multiple times.");
> +	if (getvariable_test(fw, datasize, variablenametest, multitesttime) == FWTS_ERROR)
> +		return FWTS_ERROR;
> +	fwts_passed(fw, "GetVariable on getting the variable multiple times passed.");
> +
> +	return FWTS_OK;
> +
> +}
> +
>   static fwts_framework_minor_test uefirtvariable_tests[] = {
>   	{ uefirtvariable_test1, "Test UEFI RT service get variable interface." },
>   	{ uefirtvariable_test2, "Test UEFI RT service get next variable name interface." },
>   	{ uefirtvariable_test3, "Test UEFI RT service set variable interface." },
>   	{ uefirtvariable_test4, "Test UEFI RT service query variable info interface." },
> +	{ uefirtvariable_test5, "Test UEFI RT service variable interface stress test." },
>   	{ NULL, NULL }
>   };
>
>
Acked-by: Alex Hung <alex.hung@canonical.com>

Patch

diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
index 2b66371..a8b9326 100644
--- a/src/uefi/uefirtvariable/uefirtvariable.c
+++ b/src/uefi/uefirtvariable/uefirtvariable.c
@@ -80,7 +80,7 @@  static int uefirtvariable_deinit(fwts_framework *fw)
 	return FWTS_OK;
 }
 
-static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *varname)
+static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *varname, uint32_t multitesttime)
 {
 	long ioret;
 	struct efi_getvariable getvariable;
@@ -93,6 +93,8 @@  static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
 	uint32_t attributestest;
 
 	uint8_t data[datasize+1];
+	uint32_t i;
+
 	for (dataindex = 0; dataindex < datasize; dataindex++)
 		data[dataindex] = (uint8_t)dataindex;
 	data[dataindex] = '\0';
@@ -120,14 +122,15 @@  static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
 	getvariable.Data = testdata;
 	getvariable.status = &status;
 
-	ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
-	if (ioret == -1) {
-		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariable",
-			"Failed to get variable with UEFI runtime service.");
-		fwts_uefi_print_status_info(fw, status);
-		goto err_restore_env;
+	for (i = 0; i < multitesttime; i++) {
+		ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
+		if (ioret == -1) {
+			fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariable",
+				"Failed to get variable with UEFI runtime service.");
+			fwts_uefi_print_status_info(fw, status);
+			goto err_restore_env;
+		}
 	}
-
 	if (*getvariable.status != EFI_SUCCESS) {
 		fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariableStatus",
 			"Failed to get variable, return status isn't EFI_SUCCESS.");
@@ -718,8 +721,9 @@  static int do_queryvariableinfo(uint64_t *status, uint64_t *remvarstoragesize, u
 static int uefirtvariable_test1(fwts_framework *fw)
 {
 	uint64_t datasize = 10;
+	uint32_t multitesttime = 1;
 
-	if (getvariable_test(fw, datasize, variablenametest) == FWTS_ERROR)
+	if (getvariable_test(fw, datasize, variablenametest, multitesttime) == FWTS_ERROR)
 		return FWTS_ERROR;
 
 	fwts_passed(fw, "UEFI runtime service GetVariable interface test passed.");
@@ -799,11 +803,26 @@  static int uefirtvariable_test4(fwts_framework *fw)
 	return FWTS_OK;
 }
 
+static int uefirtvariable_test5(fwts_framework *fw)
+{
+	uint32_t multitesttime = 1024;
+	uint64_t datasize = 10;
+
+	fwts_log_info(fw, "Testing GetVariable on getting the variable multiple times.");
+	if (getvariable_test(fw, datasize, variablenametest, multitesttime) == FWTS_ERROR)
+		return FWTS_ERROR;
+	fwts_passed(fw, "GetVariable on getting the variable multiple times passed.");
+
+	return FWTS_OK;
+
+}
+
 static fwts_framework_minor_test uefirtvariable_tests[] = {
 	{ uefirtvariable_test1, "Test UEFI RT service get variable interface." },
 	{ uefirtvariable_test2, "Test UEFI RT service get next variable name interface." },
 	{ uefirtvariable_test3, "Test UEFI RT service set variable interface." },
 	{ uefirtvariable_test4, "Test UEFI RT service query variable info interface." },
+	{ uefirtvariable_test5, "Test UEFI RT service variable interface stress test." },
 	{ NULL, NULL }
 };