From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752439AbcD3IfL (ORCPT ); Sat, 30 Apr 2016 04:35:11 -0400 Received: from mga02.intel.com ([134.134.136.20]:23824 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752182AbcD3IfI convert rfc822-to-8bit (ORCPT ); Sat, 30 Apr 2016 04:35:08 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,555,1455004800"; d="scan'208";a="94720829" From: jeremy.compostella@intel.com (Compostella, Jeremy) To: Ingo Molnar Cc: Matt Fleming , , , , , , , , Subject: Re: [tip:efi/core] efibc: Add EFI Bootloader Control module References: <1461614832-17633-26-git-send-email-matt@codeblueprint.co.uk> <20160429095356.GA29957@gmail.com> <20160429103011.GE2839@codeblueprint.co.uk> <87lh3wejfi.fsf@jcompost-MOBL1.tl.intel.com> <20160429121635.GF2839@codeblueprint.co.uk> <87h9eked24.fsf@jcompost-MOBL1.tl.intel.com> <20160429194615.GA22691@gmail.com> Date: Sat, 30 Apr 2016 10:33:32 +0200 In-Reply-To: <20160429194615.GA22691@gmail.com> (Ingo Molnar's message of "Fri, 29 Apr 2016 21:46:15 +0200") Message-ID: <874majebs3.fsf@jcompost-MOBL1.tl.intel.com> User-Agent: Gnus/5.130012 (Ma Gnus v0.12) Emacs/25.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Ingo Molnar writes: > * Compostella, Jeremy wrote: > >> -static void efibc_set_variable(const char *name, const char *value) >> +static int efibc_set_variable(const char *name, const char *value) >> { >> int ret; >> efi_guid_t guid = LINUX_EFI_LOADER_ENTRY_GUID; >> - struct efivar_entry entry; >> + struct efivar_entry *entry; >> size_t size = (strlen(value) + 1) * sizeof(efi_char16_t); >> >> - if (size > sizeof(entry.var.Data)) >> + if (size > sizeof(entry->var.Data)) { >> pr_err("value is too large"); >> + return -1; >> + } >> >> - efibc_str_to_str16(name, entry.var.VariableName); >> - efibc_str_to_str16(value, (efi_char16_t *)entry.var.Data); >> - memcpy(&entry.var.VendorGuid, &guid, sizeof(guid)); >> + entry = kmalloc(sizeof(*entry), GFP_KERNEL); >> + if (!entry) { >> + pr_err("failed to allocate efivar entry"); >> + return -1; >> + } >> >> - ret = efivar_entry_set(&entry, >> + efibc_str_to_str16(name, entry->var.VariableName); >> + efibc_str_to_str16(value, (efi_char16_t *)entry->var.Data); >> + memcpy(&entry->var.VendorGuid, &guid, sizeof(guid)); >> + >> + ret = efivar_entry_set(entry, >> EFI_VARIABLE_NON_VOLATILE >> | EFI_VARIABLE_BOOTSERVICE_ACCESS >> | EFI_VARIABLE_RUNTIME_ACCESS, >> - size, entry.var.Data, NULL); >> + size, entry->var.Data, NULL); >> if (ret) >> pr_err("failed to set %s EFI variable: 0x%x\n", >> name, ret); >> + >> + kfree(entry); >> + return ret; >> } >> >> static int efibc_reboot_notifier_call(struct notifier_block *notifier, >> unsigned long event, void *data) >> { >> const char *reason = "shutdown"; >> + int ret; >> >> if (event == SYS_RESTART) >> reason = "reboot"; >> >> - efibc_set_variable("LoaderEntryRebootReason", reason); >> - >> - if (!data) >> - return NOTIFY_DONE; >> + ret = efibc_set_variable("LoaderEntryRebootReason", reason); >> + if (ret || !data) >> + return NOTIFY_DONE; >> >> efibc_set_variable("LoaderEntryOneShot", (char *)data); > > Hm, can reboot notifiers do non-atomic allocations? The reboot notifier chain is a blocking notifier chain. AFAIK, it allows non-atomic allocation, right ? > Why is efivar_entry so huge? efivar_entry structure include two "big" arrays of 1024 bytes each for the EFI variable name and data. Thanks, Jérémy -- One Emacs to rule them all