From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753866AbbHUMke (ORCPT ); Fri, 21 Aug 2015 08:40:34 -0400 Received: from mail-wi0-f171.google.com ([209.85.212.171]:33029 "EHLO mail-wi0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753823AbbHUMk3 (ORCPT ); Fri, 21 Aug 2015 08:40:29 -0400 Date: Fri, 21 Aug 2015 13:40:26 +0100 From: Matt Fleming To: "Lee, Chun-Yi" Cc: linux-kernel@vger.kernel.org, linux-efi@vger.kernel.org, linux-pm@vger.kernel.org, "Rafael J. Wysocki" , Matthew Garrett , Len Brown , Pavel Machek , Josh Boyer , Vojtech Pavlik , Matt Fleming , Jiri Kosina , "H. Peter Anvin" , Ingo Molnar , "Lee, Chun-Yi" Subject: Re: [PATCH v2 08/16] x86/efi: Carrying hibernation key by setup data Message-ID: <20150821124026.GB3310@codeblueprint.co.uk> References: <1439273796-25359-1-git-send-email-jlee@suse.com> <1439273796-25359-9-git-send-email-jlee@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439273796-25359-9-git-send-email-jlee@suse.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 11 Aug, at 02:16:28PM, Lee, Chun-Yi wrote: > For forwarding hibernation key from EFI stub to boot kernel, this patch > allocates setup data for carrying hibernation key, size and the status > of efi operating. This could do with some more information, and include that the key is used to validate hibernate images. But now that I think about it, is there a reason this patch hasn't been merged with patch 6? The memory leak I mentioned in patch 6 becomes a non-issue in this one, so it would be good if these two could be squashed together. > Reviewed-by: Jiri Kosina > Tested-by: Jiri Kosina > Signed-off-by: Lee, Chun-Yi > --- > arch/x86/boot/compressed/eboot.c | 26 +++++++++++++++++++++++--- > arch/x86/include/uapi/asm/bootparam.h | 1 + > 2 files changed, 24 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c > index 463aa9b..c838d09 100644 > --- a/arch/x86/boot/compressed/eboot.c > +++ b/arch/x86/boot/compressed/eboot.c > @@ -1394,18 +1394,22 @@ static void setup_hibernation_keys(struct boot_params *params) > { > unsigned long key_size; > unsigned long attributes; > + struct setup_data *setup_data, *hibernation_setup_data; > struct hibernation_keys *keys; > + unsigned long size = 0; > efi_status_t status; One thing to be aware of is that eboot.c has mainly used the "reverse-christmas-tree" style of variable declarations, with longer lines first, and shorter ones following. I haven't mentioned it before because none of your changes seemed to be too different (and it's not a tree-wide convention), but the above setup_data line goes a bit too far. Could you try and keep them ordered, longest line first? > > /* Allocate setup_data to carry keys */ > + size = sizeof(struct setup_data) + sizeof(struct hibernation_keys); > status = efi_call_early(allocate_pool, EFI_LOADER_DATA, > - sizeof(struct hibernation_keys), &keys); > + size, &hibernation_setup_data); > if (status != EFI_SUCCESS) { > efi_printk(sys_table, "Failed to alloc mem for hibernation keys\n"); > return; > } > > - memset(keys, 0, sizeof(struct hibernation_keys)); > + memset(hibernation_setup_data, 0, size); > + keys = (struct hibernation_keys *) hibernation_setup_data->data; > > status = efi_call_early(get_variable, HIBERNATION_KEY, > &EFI_HIBERNATION_GUID, &attributes, > @@ -1419,7 +1423,8 @@ static void setup_hibernation_keys(struct boot_params *params) > if (status == EFI_SUCCESS) { > efi_printk(sys_table, "Cleaned existing hibernation key\n"); > status = EFI_NOT_FOUND; > - } > + } else > + goto clean_fail; Please add braces for the 'else' clause. Also, please include a comment stating that the reason you jump to the label instead of returning is so that the EFI status error code can be recorded in hibernation_setup_data. > } > > if (status != EFI_SUCCESS) { > @@ -1436,6 +1441,21 @@ static void setup_hibernation_keys(struct boot_params *params) > if (status != EFI_SUCCESS) > efi_printk(sys_table, "Failed to set hibernation key\n"); > } > + > +clean_fail: > + hibernation_setup_data->type = SETUP_HIBERNATION_KEYS; > + hibernation_setup_data->len = sizeof(struct hibernation_keys); > + hibernation_setup_data->next = 0; > + keys->hkey_status = efi_status_to_err(status); > + > + setup_data = (struct setup_data *)params->hdr.setup_data; > + while (setup_data && setup_data->next) > + setup_data = (struct setup_data *)setup_data->next; > + > + if (setup_data) > + setup_data->next = (unsigned long)hibernation_setup_data; > + else > + params->hdr.setup_data = (unsigned long)hibernation_setup_data; This label name is a little confusing because you reach it both when the EFI boot variable was successfully created and when a bogus EFI variable failed to be deleted, i.e. it's not always reached because of a failure. How about 'setup' or simply 'out' ? -- Matt Fleming, Intel Open Source Technology Center