Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp3981132ybg; Mon, 28 Oct 2019 23:53:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqyUxLWNkDQkAv+AVDsC+91TH6h9bkcrYtzXnD9xtDQiTuXexdHxpiguw3fYIevt97Fm01vP X-Received: by 2002:a17:906:4a15:: with SMTP id w21mr1667963eju.294.1572331983582; Mon, 28 Oct 2019 23:53:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572331983; cv=none; d=google.com; s=arc-20160816; b=U9zBxAekTHtKGEJD5hbH2j83UrMgJcCE7R6BDDjrvIljBTObffXnwXWqM7MIlOGmia xBh6QoYUsIS+pwN4PyVMMKSuJkb5hWZulI8S1nOfVqewN5gg0vYB2tapedU5IkAWwdya tFM4JIOGxFQnxLkvy0yJz9nFYzM+Iwy0Dk+Hvcafyu7RJkWzncS38ahsT6Rjb/khTFPd HZKcp8ejEsEp+YdCNrgPGfewSW2oqZwbc0ckcJZG8hbX6u6HJ8s+w/e1vJw7rciHiIUH W0m3fjQjMK7L1UMyfM3JR6Xx7+kY17mhhmZoRBStl32wvUf3qlDgMT+pll37LKyzr2Hu yRig== 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=fbvbkyQ/dFdnFlezGOSwWMIBZKTkqCqUpLNaeTYY8oU=; b=x7iABdsYal9yzKgrTigEnpGHgDS6rUYndWYTVqMc2EIQ4PsOrGTZNDmw6iBCPRTOBF 8+iV+PFnqD9NF3sm/Ogc0SWZdww+Mt8yASEYxVa+W/AmApgzGEimiixorDKxc95bme61 Vrf9VhBGTcNinQkelhxesJj4kTLJRlE6MGWhaFOusjlor8YktTzPgrjp+Va18aClIlWe PCB4F9zcFQrCtLXWxYbLXEfPaqVUeGMCA3/PQpQ/mrWHKXbdbJy35Gx/f18kwJLIWTuD ofyclpPTvnyGLPXfDU+y8W+voGtHl53SmgxWaOVLykg/8dkfyz0cP5hCEN3hXw3OLAW+ O7sQ== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e4si11236175edc.146.2019.10.28.23.52.40; Mon, 28 Oct 2019 23:53:03 -0700 (PDT) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389127AbfJ1VFH (ORCPT + 99 others); Mon, 28 Oct 2019 17:05:07 -0400 Received: from mga04.intel.com ([192.55.52.120]:49908 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727148AbfJ1VFH (ORCPT ); Mon, 28 Oct 2019 17:05:07 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Oct 2019 14:05:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,241,1569308400"; d="scan'208";a="224759637" Received: from shrehore-mobl1.ti.intel.com (HELO localhost) ([10.251.82.5]) by fmsmga004.fm.intel.com with ESMTP; 28 Oct 2019 14:04:59 -0700 From: Jarkko Sakkinen To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-sgx@vger.kernel.org Cc: akpm@linux-foundation.org, dave.hansen@intel.com, sean.j.christopherson@intel.com, nhorman@redhat.com, npmccallum@redhat.com, serge.ayoun@intel.com, shay.katz-zamir@intel.com, haitao.huang@intel.com, andriy.shevchenko@linux.intel.com, tglx@linutronix.de, kai.svahn@intel.com, bp@alien8.de, josh@joshtriplett.org, luto@kernel.org, kai.huang@intel.com, rientjes@google.com, cedric.xing@intel.com, puiterwijk@redhat.com, Jarkko Sakkinen Subject: [PATCH v23 09/24] x86/sgx: Add functions to allocate and free EPC pages Date: Mon, 28 Oct 2019 23:03:09 +0200 Message-Id: <20191028210324.12475-10-jarkko.sakkinen@linux.intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191028210324.12475-1-jarkko.sakkinen@linux.intel.com> References: <20191028210324.12475-1-jarkko.sakkinen@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add functions for allocating page from Enclave Page Cache (EPC). A page is allocated by going through the EPC sections and returning the first free page. When a page is freed, it might have a valid state, which means that the callee has assigned it to an enclave, which are protected memory ares used to run code protected from outside access. The page is returned back to the invalid state with ENCLS[EREMOVE] [1]. [1] Intel SDM: 40.3 INTELĀ® SGX SYSTEM LEAF FUNCTION REFERENCE Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Signed-off-by: Jarkko Sakkinen --- arch/x86/kernel/cpu/sgx/main.c | 60 ++++++++++++++++++++++++++++++++++ arch/x86/kernel/cpu/sgx/sgx.h | 3 ++ 2 files changed, 63 insertions(+) diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c index f8ba10516eaf..6a37df61ae32 100644 --- a/arch/x86/kernel/cpu/sgx/main.c +++ b/arch/x86/kernel/cpu/sgx/main.c @@ -13,6 +13,66 @@ struct sgx_epc_section sgx_epc_sections[SGX_MAX_EPC_SECTIONS]; int sgx_nr_epc_sections; +static struct sgx_epc_page *__sgx_try_alloc_page(struct sgx_epc_section *section) +{ + struct sgx_epc_page *page; + + if (list_empty(§ion->page_list)) + return NULL; + + page = list_first_entry(§ion->page_list, struct sgx_epc_page, list); + list_del_init(&page->list); + return page; +} + +/** + * sgx_try_alloc_page() - Allocate an EPC page + * + * Try to grab a page from the free EPC page list. + * + * Return: + * a pointer to a &struct sgx_epc_page instance, + * -errno on error + */ +struct sgx_epc_page *sgx_try_alloc_page(void) +{ + struct sgx_epc_section *section; + struct sgx_epc_page *page; + int i; + + for (i = 0; i < sgx_nr_epc_sections; i++) { + section = &sgx_epc_sections[i]; + spin_lock(§ion->lock); + page = __sgx_try_alloc_page(section); + spin_unlock(§ion->lock); + + if (page) + return page; + } + + return ERR_PTR(-ENOMEM); +} + +/** + * sgx_free_page() - Free an EPC page + * @page: pointer a previously allocated EPC page + * + * EREMOVE an EPC page and insert it back to the list of free pages. + */ +void sgx_free_page(struct sgx_epc_page *page) +{ + struct sgx_epc_section *section = sgx_epc_section(page); + int ret; + + ret = __eremove(sgx_epc_addr(page)); + if (WARN_ONCE(ret, "EREMOVE returned %d (0x%x)", ret, ret)) + return; + + spin_lock(§ion->lock); + list_add_tail(&page->list, §ion->page_list); + spin_unlock(§ion->lock); +} + static void __init sgx_free_epc_section(struct sgx_epc_section *section) { struct sgx_epc_page *page; diff --git a/arch/x86/kernel/cpu/sgx/sgx.h b/arch/x86/kernel/cpu/sgx/sgx.h index 9d8036f997b1..a6d734a70362 100644 --- a/arch/x86/kernel/cpu/sgx/sgx.h +++ b/arch/x86/kernel/cpu/sgx/sgx.h @@ -67,4 +67,7 @@ extern struct task_struct *ksgxswapd_tsk; bool __init sgx_page_reclaimer_init(void); +struct sgx_epc_page *sgx_try_alloc_page(void); +void sgx_free_page(struct sgx_epc_page *page); + #endif /* _X86_SGX_H */ -- 2.20.1