Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp949751imu; Wed, 28 Nov 2018 02:06:48 -0800 (PST) X-Google-Smtp-Source: AFSGD/WM6smCZ6gTtVYSDa9pe5RiS99TB5Eox+aISNmSrDAiLO4b80GgobS8EGhQQSRe/CJYlS1u X-Received: by 2002:a17:902:5066:: with SMTP id f35mr32402821plh.78.1543399608605; Wed, 28 Nov 2018 02:06:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543399608; cv=none; d=google.com; s=arc-20160816; b=rhRgB5jIAB9OuSN4BMwT3tKpwFRSL1/raJg0itA7sKtTAHROeij7j1lzGIGeEGgwc/ mrk7B3vSnkhqLIOyYQlZOqjOIumROVjnn+f0lPUD6971GrVlcpXd5Pai5LBnJCjFypM5 cYEcNuL0/n3GBiwN1uqyKxUK7zLDSyWVSiPmwOonMAgg1iECkY3QYZXBY6kRj/FM9fOf YhYD7VuthAVbS/1A/G8S95dtvqN7V/PVLx6XiGWk1tef3NM4m+K5xdc4u/af9Uek4HOe 8eU4MK/9O/Gkha7rU1DyvhSPgNWXAP6tU4OTX0uCLynaRbbe8CZ4kxvyX9R/9r3ab1ZD sE0A== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=sUPKp2F9fD4+0U/qiWvjI0HaLndZRJsQT710IAeV280=; b=VyAX6414Wv8FBHNsw+6EkqnWoymmPBdkNu6jUs2CqObyFLtxaIOGmnOCB20g9zHpes rnJU9NcRCkhQWlnxcfL4APkdlLOY1Y3RErTVDXp85O1OKI18i35LCgrdC3Sh5JsZw7ZF 14htIzsWLajW/5ek4de434JD1ib1uzo9caawRpCbNJuRJNY68WCm9YsP26Dasb1k4HdR 2M4fa9AgjTsnc3yAi996/kTdadS+12tk7apkjT5RoL0aptzgc0XBsAGKMnneYW8//ZP6 Cp35OatVHwZnv9NqIU9bK8VccihvuMEmm91JM11iGKP+lNoVASoxwib3isELLLlbE19N WPaQ== 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 u22si6453436pgh.286.2018.11.28.02.06.30; Wed, 28 Nov 2018 02:06:48 -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 S1728041AbeK1VG6 (ORCPT + 99 others); Wed, 28 Nov 2018 16:06:58 -0500 Received: from pegase1.c-s.fr ([93.17.236.30]:8005 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727413AbeK1VG6 (ORCPT ); Wed, 28 Nov 2018 16:06:58 -0500 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 434brY6qn5z9vBmd; Wed, 28 Nov 2018 11:05:49 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id UkynWoASO0ac; Wed, 28 Nov 2018 11:05:49 +0100 (CET) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 434brY6HPBz9vBmJ; Wed, 28 Nov 2018 11:05:49 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id BC33D8B860; Wed, 28 Nov 2018 11:05:50 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id rgC6UKgVgWgZ; Wed, 28 Nov 2018 11:05:50 +0100 (CET) Received: from PO15451 (po15451.idsi0.si.c-s.fr [172.25.231.2]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 85A078B853; Wed, 28 Nov 2018 11:05:50 +0100 (CET) Subject: Re: [RFC PATCH v1 5/6] powerpc/mm: Add a framework for Kernel Userspace Access Protection To: Russell Currey , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org References: <0d599e228d336c532b4d4bcde31be5f5565dce1b.camel@russell.cc> From: Christophe LEROY Message-ID: <4c7590ee-e701-8322-2e02-7f25a95e6520@c-s.fr> Date: Wed, 28 Nov 2018 11:05:50 +0100 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.3.1 MIME-Version: 1.0 In-Reply-To: <0d599e228d336c532b4d4bcde31be5f5565dce1b.camel@russell.cc> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le 22/11/2018 à 02:25, Russell Currey a écrit : > On Wed, 2018-11-21 at 09:32 +0100, Christophe LEROY wrote: >> >> Le 21/11/2018 à 03:26, Russell Currey a écrit : >>> On Wed, 2018-11-07 at 16:56 +0000, Christophe Leroy wrote: >>>> This patch implements a framework for Kernel Userspace Access >>>> Protection. >>>> >>>> Then subarches will have to possibility to provide their own >>>> implementation >>>> by providing setup_kuap(), and lock/unlock_user_rd/wr_access >>>> >>>> We separate read and write accesses because some subarches like >>>> book3s32 might only support write access protection. >>>> >>>> Signed-off-by: Christophe Leroy >>> >>> Separating read and writes does have a performance impact, I'm >>> doing >>> some benchmarking to find out exactly how much - but at least for >>> radix >>> it means we have to do a RMW instead of just a write. It does add >>> some >>> amount of security, though. >>> >>> The other issue I have is that you're just locking everything here >>> (like I was), and not doing anything different for just reads or >>> writes. In theory, wouldn't someone assume that they could (for >>> example) unlock reads, lock writes, then attempt to read? At which >>> point the read would fail, because the lock actually locks both. >>> >>> I would think we either need to bundle read/write locking/unlocking >>> together, or only implement this on platforms that can do one at a >>> time, unless there's a cleaner way to handle this. Glancing at the >>> values you use for 8xx, this doesn't seem possible there, and it's >>> a >>> definite performance hit for radix. >>> >>> At the same time, as you say, it would suck for book3s32 that can >>> only >>> do writes, but maybe just doing both at the same time and if >>> implemented for that platform it could just have a warning that it >>> only >>> applies to writes on init? >> >> Well, I see your points. My idea was not to separate read and write >> on platform that can lock both. I think it is no problem to also >> unlocking writes when we are doing a read, so on platforms that can >> do >> both I think both should do the same.. >> >> The idea was to avoid spending time unlocking writes for doing a read >> on >> platforms on which reads are not locked. And for platforms able to >> independently unlock/lock reads and writes, if only unlocking reads >> can >> improve performance it can be interesting as well. >> >> For book3s/32, locking/unlocking will be done through Kp/Ks bits in >> segment registers, the function won't be trivial as it may involve >> more >> than one segment at a time. So I just wanted to avoid spending time >> doing that for reads as reads won't be protected. And may also be >> the >> case on older book3s/64, may not it ? >> On Book3s/32, the page protection bits are as follows: >> >> Key 0 1 >> PP >> 00 RW NA >> 01 RW RO >> 10 RW RW >> 11 RO RO >> >> So the idea is to encode user RW with PP01 (instead of PP10 today) >> and >> user RO with PP11 (as done today), giving Key0 to user and Key1 to >> kernel (today both user and kernel have Key1). Then when kernel needs >> to >> write, we change Ks to Key0 in segment register for the involved >> segments. >> >> I'm not sure there is any risk that someone nests unlocks/locks for >> reads and unlocks/locks for writes, because the unlocks/locks are >> done >> in very limited places. > > Yeah I don't think it's a risk since the scope is so limited, it just > needs to be clearly documented that locking/unlocking reads/writes > could have the side effect of covering the other. My concern is less > about a problem in practice as much as functions that only don't > exactly do what the function name says. > > Another option is to again have a single lock/unlock function that > takes a bitmask (so read/write/both), which due to being a singular > function might be a bit more obvious that it could lock/unlock > everything, but at this point I'm just bikeshedding. In order to support book3s/32, I needed to add arguments to the unlock/lock functions, as the address is needed to identify the affected segments. Therefore, I changed it to single functions as you suggested. These functions have 'to', 'from' and 'size' arguments. When it is a read, 'to' is NULL. When it is a write, 'from' is NULL. When it is a copy, none is NULL. See RFC v2 for the details. Christophe > > Doing it this way should be fine, I'm just cautious that some future > developer might be caught off guard. > > Planning on sending my series based on top of yours for radix today. > > - Russell > >> >> Christophe >> >> >>> Curious for people's thoughts on this. >>> >>> - Russell >>>