Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp659343imu; Wed, 9 Jan 2019 04:20:55 -0800 (PST) X-Google-Smtp-Source: ALg8bN4hv73r8K/5lEhVn74Jngl6mH03dQleAbrrdaEVHTotra+cjppqq4wexumOKXOFmyJTxiqv X-Received: by 2002:a17:902:7581:: with SMTP id j1mr5882533pll.308.1547036455025; Wed, 09 Jan 2019 04:20:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547036454; cv=none; d=google.com; s=arc-20160816; b=oLKXvRbuFn3EMMGfaE10i0kokPdlS0w3GUfxu6YOApU8u33kHTA1PqX3My0HzeidNs 2p9YUaw9I1KmI6WJNNJJhooM9Rvj6BKUY7UZE1nug3wqrfSCF5tiX+4qPSb3FkcklcQn tAgAXXOmIKmNfe6iOEUNvzcGwRuD++FJBq62SziuessS7c0yBy9Zk8Hh6Gi1cH034GOR zGplrMEuH03C7F6l95k4DFo3Sn6DKbKzBObrXgU1usVQbZ5ORan499a3ZKs3NhxJFtFI /63SsWKFao4L7oTSooE+1PoR1rwlIpxzJ/QxkwxUmTHtB6W/CCrc06/VyCCcrPoxkuXC ug2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=YOpkr+hpBtWk6t+i8YmyW5fvJkPCWYABgAtG9H0e7WQ=; b=iVyIDIjTZ3aNym2MChpmR29KiRxRnDWoXutOvr3tasxyTU191I81lJHksEHVHAIPNG Eaosk603g5fAkzq36pLRRGxia9FT6BaO+t1I6WiQcdGOU2Y0P6q9IcFhC+liehna8dL7 GLN/12DUHwiXJR2CvDLPdR2S++Lx56XdKEq+rTGsS/eyYd7M9dyUTrLj4h11L4W8nPeb YCFUgQ/Z8ED2U9qLAiwAa6YDtAa7omLA44BetRk5kpYojd/M1kBnHSEabyWZNdDiJ3nF vz1K9HKsCUQNYDUFKH8svohgWpYIeeZGW/jemOMUUjR0zY38LjzkYHaPd6QwY+dgh09G IrQw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x16si10308919pga.407.2019.01.09.04.20.38; Wed, 09 Jan 2019 04:20:54 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730343AbfAIKvp (ORCPT + 99 others); Wed, 9 Jan 2019 05:51:45 -0500 Received: from g2t1383g.austin.hpe.com ([15.233.16.89]:15685 "EHLO g2t1383g.austin.hpe.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726915AbfAIKvp (ORCPT ); Wed, 9 Jan 2019 05:51:45 -0500 X-Greylist: delayed 352 seconds by postgrey-1.27 at vger.kernel.org; Wed, 09 Jan 2019 05:51:44 EST Received: from g4t3428.houston.hpe.com (g4t3428.houston.hpe.com [15.241.140.76]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by g2t1383g.austin.hpe.com (Postfix) with ESMTPS id 67993124D; Wed, 9 Jan 2019 10:46:07 +0000 (UTC) Received: from sarge.linuxathome.me (unknown [16.214.81.200]) by g4t3428.houston.hpe.com (Postfix) with ESMTP id 1449253; Wed, 9 Jan 2019 10:46:08 +0000 (UTC) From: Hedi Berriche To: Ard Biesheuvel , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" Cc: x86@kernel.org, linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org, Hedi Berriche , Russ Anderson , Mike Travis , Dimitri Sivanich , Steve Wahl Subject: [PATCH 3/3] x86/platform/UV: use efi_runtime_sem to serialise BIOS calls Date: Wed, 9 Jan 2019 10:45:41 +0000 Message-Id: <20190109104541.25733-4-hedi.berriche@hpe.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190109104541.25733-1-hedi.berriche@hpe.com> References: <20190109104541.25733-1-hedi.berriche@hpe.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Calls into UV firmware must be protected against concurrency, use the now visible efi_runtime_sem lock to serialise them. Signed-off-by: Hedi Berriche Reviewed-by: Russ Anderson Reviewed-by: Mike Travis Reviewed-by: Dimitri Sivanich Reviewed-by: Steve Wahl --- arch/x86/include/asm/uv/bios.h | 3 ++- arch/x86/platform/uv/bios_uv.c | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/uv/bios.h b/arch/x86/include/asm/uv/bios.h index 4eee646544b2..33e94aa0b1ff 100644 --- a/arch/x86/include/asm/uv/bios.h +++ b/arch/x86/include/asm/uv/bios.h @@ -48,7 +48,8 @@ enum { BIOS_STATUS_SUCCESS = 0, BIOS_STATUS_UNIMPLEMENTED = -ENOSYS, BIOS_STATUS_EINVAL = -EINVAL, - BIOS_STATUS_UNAVAIL = -EBUSY + BIOS_STATUS_UNAVAIL = -EBUSY, + BIOS_STATUS_ABORT = -EINTR }; /* Address map parameters */ diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c index cd05af157763..92f960798e20 100644 --- a/arch/x86/platform/uv/bios_uv.c +++ b/arch/x86/platform/uv/bios_uv.c @@ -29,7 +29,8 @@ struct uv_systab *uv_systab; -s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) +s64 __uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, + u64 a4, u64 a5) { struct uv_systab *tab = uv_systab; s64 ret; @@ -44,13 +45,26 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) * If EFI_OLD_MEMMAP is set, we need to fall back to using our old EFI * callback method, which uses efi_call() directly, with the kernel page tables: */ - if (unlikely(test_bit(EFI_OLD_MEMMAP, &efi.flags))) + if (unlikely(efi_enabled(EFI_OLD_MEMMAP))) ret = efi_call((void *)__va(tab->function), (u64)which, a1, a2, a3, a4, a5); else ret = efi_call_virt_pointer(tab, function, (u64)which, a1, a2, a3, a4, a5); return ret; } + +s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) +{ + s64 ret; + + if (down_interruptible(&efi_runtime_sem)) + return BIOS_STATUS_ABORT; + + ret = __uv_bios_call(which, a1, a2, a3, a4, a5); + up(&efi_runtime_sem); + + return ret; +} EXPORT_SYMBOL_GPL(uv_bios_call); s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, @@ -59,10 +73,15 @@ s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, unsigned long bios_flags; s64 ret; + if (down_interruptible(&efi_runtime_sem)) + return BIOS_STATUS_ABORT; + local_irq_save(bios_flags); - ret = uv_bios_call(which, a1, a2, a3, a4, a5); + ret = __uv_bios_call(which, a1, a2, a3, a4, a5); local_irq_restore(bios_flags); + up(&efi_runtime_sem); + return ret; } -- 2.20.0