Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1681037pxb; Thu, 4 Feb 2021 21:10:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJzB2nnlVn32SUMcDxskB5bB8Y08WPWinTYN0OiGaOGgjOWU1vHMYqEf1U3fTpvfhBM0n/fC X-Received: by 2002:a05:6402:3582:: with SMTP id y2mr1871703edc.345.1612501852822; Thu, 04 Feb 2021 21:10:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612501852; cv=none; d=google.com; s=arc-20160816; b=CRnafdOjqjVrxwbiyqVyXw1FdMAiZs/HnMT3TfeNIb8B8940RhWgAtDjFkRPV0JBOV +risBNHMpO1pp8MUiMrG/tFT74lbjgN6aIMEpy0OQN9DJ/1yBx7gl2Mq9RWk0umIPyhg gslIUs7rNqzpQG/CRxJhFsSTPsIHnm9SUVeiBwI+Ek3N3B8kaYogd6vx2SVEjfzgs618 kwHkWme5p1nnHFKlS9wUvQff9GsAYYiKDg2ND+N+QoNydFKUMhKH/Nix9OdJNNM6/gtt NI8LUQDGyEwrWTpOZiOXIk1szOP909rHoj16LvWN8WcLJTqxZWOZQzMg2DK9ScOdMv2b oGkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :ironport-sdr:ironport-sdr; bh=/ObHvCb5C2L7NppHcR1uw0st6/wh0/1EJw/jNmkXwAY=; b=qFtRa3WiV9IwAPzvVdfHwRdVF9y6z5KaF5265Jf8T66PmW2znzQc0i2edGLoGM5U8j GGE5jTVJ79s7hdCOIbWRUBHiIutJNg4dOpyr4E8lKnX37kxb5IyS7Ov9K3admqZv2Ex3 L7AcbTTBEdkbIeg4xCxkysV9ysbYosVszy+DsQNxBb0KHN6UGSyGrxxN+jIJGVCFNtLW HekSF9ruRP9xU+CeQHyliLcgLLnta97JembxLeUvlf1mU6c2mmY7ed1wK713d0vb5tNu RqJAFhmvc0hrWZTw7jPNQX3Yguk26/NC+bVm+PCGLriI2iOwStaS9I1yALcWN1WUZbRc dw7A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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. [23.128.96.18]) by mx.google.com with ESMTP id w14si4703239ede.222.2021.02.04.21.10.29; Thu, 04 Feb 2021 21:10:52 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S230383AbhBEFJe (ORCPT + 99 others); Fri, 5 Feb 2021 00:09:34 -0500 Received: from mga14.intel.com ([192.55.52.115]:17158 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229586AbhBEFJc (ORCPT ); Fri, 5 Feb 2021 00:09:32 -0500 IronPort-SDR: ccm8DfQLeuRjHZ5nAVIavyiEtW3tUANwxuSMty2b3ol0JpLBlkDmJQrjbdtCbqdTTyQN62iXkA Pf6GmtG1NwFw== X-IronPort-AV: E=McAfee;i="6000,8403,9885"; a="180604155" X-IronPort-AV: E=Sophos;i="5.81,154,1610438400"; d="scan'208";a="180604155" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Feb 2021 21:08:50 -0800 IronPort-SDR: koN305Gqr94Z4GLnY5LoMO3p/XMNqW7bb2DorlARIPH9s9Fq9f3cDZ3tQ43DCwl8Jk9hI1t2kn jZSheEJyZ5hw== X-IronPort-AV: E=Sophos;i="5.81,154,1610438400"; d="scan'208";a="397325467" Received: from iweiny-desk2.sc.intel.com (HELO localhost) ([10.3.52.147]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Feb 2021 21:08:50 -0800 Date: Thu, 4 Feb 2021 21:08:50 -0800 From: Ira Weiny To: Jarkko Sakkinen Cc: Dave Hansen , Sean Christopherson , Jethro Beekman , linux-kernel@vger.kernel.org, linux-sgx@vger.kernel.org Subject: Re: [PATCH V3] x86: Remove unnecessary kmap() from sgx_ioc_enclave_init() Message-ID: <20210205050850.GC5033@iweiny-DESK2.sc.intel.com> References: <20210202194719.3525076-1-ira.weiny@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.11.1 (2018-12-01) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Feb 03, 2021 at 12:45:33AM +0200, Jarkko Sakkinen wrote: > On Tue, Feb 02, 2021 at 11:47:19AM -0800, ira.weiny@intel.com wrote: > > From: Ira Weiny > > > > kmap is inefficient and we are trying to reduce the usage in the kernel. > > There is no readily apparent reason why initp_page needs to be allocated > > and kmap'ed() but sigstruct needs to be page aligned and token > > 512 byte aligned. > > > > kmalloc() can give us this alignment but we need to allocate PAGE_SIZE > > bytes to do so. Rather than change this kmap() to kmap_local_page() use > > kmalloc() instead. > > > > Remove the alloc_page()/kmap() and replace with kmalloc() to get a > > kernel address to use. > > > > In addition add a comment to document the alignment requirements so that > > others like myself don't attempt to 'fix' this again. Finally, add 2 > > BUILD_BUG_ON's to ensure future changes to sigstruct and token do not go > > unnoticed and cause a bug. > > > > Cc: Dave Hansen > > Cc: Sean Christopherson > > Cc: Jethro Beekman > > Signed-off-by: Ira Weiny > > > > --- > > Changes from v2[1]: > > When allocating a power of 2 size kmalloc() now guarantees the > > alignment of the respective size. So go back to using kmalloc() but > > with a PAGE_SIZE allocation to get the alignment. This also follows > > the pattern in sgx_ioc_enclave_create() > > > > Changes from v1[1]: > > Use page_address() instead of kcmalloc() to ensure sigstruct is > > page aligned > > Use BUILD_BUG_ON to ensure token and sigstruct don't collide. > > > > [1] https://lore.kernel.org/lkml/20210129001459.1538805-1-ira.weiny@intel.com/ > > [2] https://lore.kernel.org/lkml/20210202013725.3514671-1-ira.weiny@intel.com/ > > --- > > arch/x86/kernel/cpu/sgx/ioctl.c | 15 +++++++++------ > > 1 file changed, 9 insertions(+), 6 deletions(-) > > > > diff --git a/arch/x86/kernel/cpu/sgx/ioctl.c b/arch/x86/kernel/cpu/sgx/ioctl.c > > index 90a5caf76939..e0c3301ccd67 100644 > > --- a/arch/x86/kernel/cpu/sgx/ioctl.c > > +++ b/arch/x86/kernel/cpu/sgx/ioctl.c > > @@ -604,7 +604,6 @@ static long sgx_ioc_enclave_init(struct sgx_encl *encl, void __user *arg) > > { > > struct sgx_sigstruct *sigstruct; > > struct sgx_enclave_init init_arg; > > - struct page *initp_page; > > void *token; > > int ret; > > > > @@ -615,11 +614,16 @@ static long sgx_ioc_enclave_init(struct sgx_encl *encl, void __user *arg) > > if (copy_from_user(&init_arg, arg, sizeof(init_arg))) > > return -EFAULT; > > > > - initp_page = alloc_page(GFP_KERNEL); > > - if (!initp_page) > > + /* > > + * sigstruct must be on a page boundry and token on a 512 byte boundry > > + * kmalloc() gives us this alignment when allocating PAGE_SIZE bytes > > + */ > > + sigstruct = kmalloc(PAGE_SIZE, GFP_KERNEL); > > + if (!sigstruct) > > return -ENOMEM; > > > > - sigstruct = kmap(initp_page); > > + BUILD_BUG_ON(sizeof(*sigstruct) > (PAGE_SIZE/2)); > > + BUILD_BUG_ON(SGX_LAUNCH_TOKEN_SIZE > (PAGE_SIZE/2)); > > Please remove these. I don't see why these would be a bad thing as they don't have any run time implications. But I've removed them for v4 because getting rid of the kmap() is more important for me right now. Ira > > > token = (void *)((unsigned long)sigstruct + PAGE_SIZE / 2); > > memset(token, 0, SGX_LAUNCH_TOKEN_SIZE); > > > > @@ -645,8 +649,7 @@ static long sgx_ioc_enclave_init(struct sgx_encl *encl, void __user *arg) > > ret = sgx_encl_init(encl, sigstruct, token); > > > > out: > > - kunmap(initp_page); > > - __free_page(initp_page); > > + kfree(sigstruct); > > return ret; > > } > > > > -- > > 2.28.0.rc0.12.gb6a658bd00c9 > > > > > > /Jarkko