Received: by 10.223.185.116 with SMTP id b49csp3815973wrg; Tue, 6 Mar 2018 05:32:52 -0800 (PST) X-Google-Smtp-Source: AG47ELsyFmCQ1d8K0s1aAyQJYJ/ZoVQ4jp3DX5W71o+vqJl8fIbQVVINHJFYw8lSe6UWTol1IvNf X-Received: by 10.98.37.132 with SMTP id l126mr19267436pfl.102.1520343172604; Tue, 06 Mar 2018 05:32:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520343172; cv=none; d=google.com; s=arc-20160816; b=lW9AMbG3sDw6+RZrROWyVRKwE7OREb7+D1szCtEkk/6sRMlL27HO26DIIxMO7+uqAX AgbOTjceg2n7rXez/zGC05xNsCeBG4swko8UHGxbsT0Wycf+M/pMW99uoDLLPV0uAjWY nmuUBbZhabSy/5c2jdY7VTPZXAjrrJc001N7+JixpGVNbHROLayArjTKJKQQ5F+AmDIs B80NWWo4/sZZY0C0yDHM081uRm63hTuGm8OqdyHMA83xoP7/IVW0L42WZHhdvYtR+So7 8lIEs1+E7h41ITNsTbrfnskBwGspSvn3fNMMbchT7HIQ3TiiZRkAieLdxylKTOLxo9cu G/qA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:user-agent:in-reply-to :content-disposition:mime-version:references:subject:cc:to:from:date :arc-authentication-results; bh=kVGMyYpMLbafkRB2EfAxf6S8YDBVZQKlj2Qx/44Qx8I=; b=jbvhDBEH0FStolWWnqbir555WwMcyXUFwYJUbKSQeCBzL/c5r6gYuoWiziHKeymHJy XhZLw+Dc7YMHOoCJwO1xOCtvrVOc4PAeNxTGdIBT+ZQHzsrUMhGZ6GRidLbH+81Ir2nN osBr2AilsXKfM2HLs0Nfrm7CfUsnooAlfA5ncCkuBEnjt+lcP7oFDkIm4DhwTYZr3WVq rEYOMEmra/oR4tx0v75RbRPXoo8zzk/1ow7vgYStk1PuJA4l1DdGWsvFFWj+RqHSodG7 zkmqKdx7xYto2tLC87vWWKcoawRfyx72Xpqe4r6cbp5i+7fEMoQYNiYYH2/0ATfSLiXO JcaQ== 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=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a25si9803689pgn.429.2018.03.06.05.32.37; Tue, 06 Mar 2018 05:32:52 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753830AbeCFNbe (ORCPT + 99 others); Tue, 6 Mar 2018 08:31:34 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:36772 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753816AbeCFNbc (ORCPT ); Tue, 6 Mar 2018 08:31:32 -0500 Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w26DTW2k100791 for ; Tue, 6 Mar 2018 08:31:32 -0500 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 2ghsn4ptep-1 (version=TLSv1.2 cipher=AES256-SHA256 bits=256 verify=NOT) for ; Tue, 06 Mar 2018 08:31:31 -0500 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 6 Mar 2018 13:31:04 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 6 Mar 2018 13:30:59 -0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w26DUxd760817428; Tue, 6 Mar 2018 13:30:59 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id ABCC3AE053; Tue, 6 Mar 2018 13:21:36 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 22BEDAE055; Tue, 6 Mar 2018 13:21:34 +0000 (GMT) Received: from rapoport-lnx (unknown [9.148.207.185]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTPS; Tue, 6 Mar 2018 13:21:33 +0000 (GMT) Date: Tue, 6 Mar 2018 14:30:52 +0100 From: Mike Rapoport To: Igor Stoppa Cc: david@fromorbit.com, willy@infradead.org, keescook@chromium.org, mhocko@kernel.org, labbott@redhat.com, linux-security-module@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-hardening@lists.openwall.com Subject: Re: [PATCH 7/7] Documentation for Pmalloc References: <20180228200620.30026-1-igor.stoppa@huawei.com> <20180228200620.30026-8-igor.stoppa@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180228200620.30026-8-igor.stoppa@huawei.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-TM-AS-GCONF: 00 x-cbid: 18030613-0008-0000-0000-000004D87037 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18030613-0009-0000-0000-00001E6B8703 Message-Id: <20180306133051.GE19349@rapoport-lnx> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-03-06_07:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1803060153 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Feb 28, 2018 at 10:06:20PM +0200, Igor Stoppa wrote: > Detailed documentation about the protectable memory allocator. > > Signed-off-by: Igor Stoppa > --- > Documentation/core-api/index.rst | 1 + > Documentation/core-api/pmalloc.rst | 111 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 112 insertions(+) > create mode 100644 Documentation/core-api/pmalloc.rst > > diff --git a/Documentation/core-api/index.rst b/Documentation/core-api/index.rst > index c670a8031786..8f5de42d6571 100644 > --- a/Documentation/core-api/index.rst > +++ b/Documentation/core-api/index.rst > @@ -25,6 +25,7 @@ Core utilities > genalloc > errseq > printk-formats > + pmalloc > > Interfaces for kernel debugging > =============================== > diff --git a/Documentation/core-api/pmalloc.rst b/Documentation/core-api/pmalloc.rst > new file mode 100644 > index 000000000000..8fb9c9d3171b > --- /dev/null > +++ b/Documentation/core-api/pmalloc.rst > @@ -0,0 +1,111 @@ > +.. SPDX-License-Identifier: GPL-2.0 Please add a label to allow cross-referencing > + > +Protectable memory allocator > +============================ > + > +Purpose > +------- > + > +The pmalloc library is meant to provide R/O status to data that, for some > +reason, could neither be declared as constant, nor could it take advantage > +of the qualifier __ro_after_init, but is write-once and read-only in spirit. > +It protects data from both accidental and malicious overwrites. > + > +Example: A policy that is loaded from userspace. > + > + > +Concept > +------- > + > +pmalloc builds on top of genalloc, using the same concept of memory pools. It would be nice to add a label to genalloc.rst and reference it here: diff --git a/Documentation/core-api/genalloc.rst b/Documentation/core-api/genalloc.rst index 6b38a39fab24..983fa94f999c 100644 --- a/Documentation/core-api/genalloc.rst +++ b/Documentation/core-api/genalloc.rst @@ -1,3 +1,5 @@ +.. _genalloc: + The genalloc/genpool subsystem ============================== > + > +The value added by pmalloc is that now the memory contained in a pool can > +become R/O, for the rest of the life of the pool. > + IMHO, "read only" looks better than R/O > +Different kernel drivers and threads can use different pools, for finer > +control of what becomes R/O and when. And for improved lockless concurrency. > + > + > +Caveats > +------- > + > +- Memory freed while a pool is not yet protected will be reused. > + > +- Once a pool is protected, it's not possible to allocate any more memory > + from it. > + > +- Memory "freed" from a protected pool indicates that such memory is not > + in use anymore by the requester; however, it will not become available > + for further use, until the pool is destroyed. > + > +- pmalloc does not provide locking support with respect to allocating vs > + protecting an individual pool, for performance reasons. > + It is recommended not to share the same pool between unrelated functions. > + Should sharing be a necessity, the user of the shared pool is expected > + to implement locking for that pool. > + > +- pmalloc uses genalloc to optimize the use of the space it allocates > + through vmalloc. Some more TLB entries will be used, however less than > + in the case of using vmalloc directly. The exact number depends on the > + size of each allocation request and possible slack. > + > +- Considering that not much data is supposed to be dynamically allocated > + and then marked as read-only, it shouldn't be an issue that the address > + range for pmalloc is limited, on 32-bit systems. > + > +- Regarding SMP systems, the allocations are expected to happen mostly > + during an initial transient, after which there should be no more need to > + perform cross-processor synchronizations of page tables. > + > +- To facilitate the conversion of existing code to pmalloc pools, several > + helper functions are provided, mirroring their kmalloc counterparts. > + > + > +Use > +--- > + > +The typical sequence, when using pmalloc, is: > + > +1. create a pool Can we use #. instead of numbers for the numbered list items? > +.. kernel-doc:: include/linux/pmalloc.h > + :functions: pmalloc_create_pool > + > +2. [optional] pre-allocate some memory in the pool > + > +.. kernel-doc:: include/linux/pmalloc.h > + :functions: pmalloc_prealloc Maybe it's better to have a short reference to the function and keep all the elaborate descriptions in the API section? For instance, something like diff --git a/Documentation/core-api/pmalloc.rst b/Documentation/core-api/pmalloc.rst @@ -68,8 +70,7 @@ The typical sequence, when using pmalloc, is: 1. create a pool -.. kernel-doc:: include/linux/pmalloc.h - :functions: pmalloc_create_pool + :c:func:`pmalloc_create_pool` > +3. issue one or more allocation requests to the pool with locking as needed > + > +.. kernel-doc:: include/linux/pmalloc.h > + :functions: pmalloc > + > +.. kernel-doc:: include/linux/pmalloc.h > + :functions: pzalloc > + > +4. initialize the memory obtained with desired values > + > +5. [optional] iterate over points 3 & 4 as needed > + > +6. write-protect the pool > + > +.. kernel-doc:: include/linux/pmalloc.h > + :functions: pmalloc_protect_pool > + > +7. use in read-only mode the handles obtained through the allocations > + > +8. [optional] release all the memory allocated > + > +.. kernel-doc:: include/linux/pmalloc.h > + :functions: pfree > + > +9. [optional, but depends on point 8] destroy the pool > + > +.. kernel-doc:: include/linux/pmalloc.h > + :functions: pmalloc_destroy_pool > + > +API > +--- > + > +.. kernel-doc:: include/linux/pmalloc.h > -- > 2.14.1 > -- Sincerely yours, Mike.