Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp431217ybg; Sun, 26 Jul 2020 09:07:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyNlxfj0wfsLYLMS7JvCqsuvcSFb5x3rzTPIcjsaPXz/1hOy6O85QT0PzzasTjNDjTpl12H X-Received: by 2002:a17:906:5f98:: with SMTP id a24mr13485978eju.241.1595779664623; Sun, 26 Jul 2020 09:07:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595779664; cv=none; d=google.com; s=arc-20160816; b=Ur2boqmtU0YmPYUcOMNOVahaqz/PGDEBDIDHk/qatMb6Xp+pXgwPsemGAYVKEYRKDc 907qUdbc/y8O/ntdHhK7AZbDt3hC41qXKFnlQrFgm7PmTbKzGIp/ApQbyzvjoTgLMK2U +tu8mU/ALC8ic1q5bur1fJ+0hjTs5isW8cRaNxCMNFJ//Ej9xLHWED/y5TnjAAJIiC0h aX6S/mzer5v0ewUxwWSSvKFi+HssGgvie/8JPFVXfNZtUYaK7wHqhicHCPgjDAdv5LWo vekR3ennMZDear6xU7BThaq7Nd4i2C4OFLI67mT1YKfMMc0F5R7x/mJFsjaHzE3Z7GB6 CuKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=UXoAUTOIADGiZRJ1HADYWOMSzEPy9fJHNGTRGkd352Y=; b=ha8FtHmIjvOuo69So/cvJP3sinTmRKFmVB3ynDbBz63rTByLiq85Yzd6rV2wQ9OmgQ zMtgqLT7hgN6J994/yhUunglXxGChrZwekPGgdiewifiVGtcUnY8PEHn5YyTldpKB3gA HOyWqgIl1I4syYFso1XZhm5wpv7n9bNMEqKlyJTflLgEBgHDUKk7UpzKtnVaMVhOyd8v 5wFt8TkHlVoD+nfYZ5eJGWkxdN4pdZl+l6FE7AEQ41F05oSCXblw1qRVdPz4SpibbL8G nlTNr9eTFsqP7O4wJTShLeeD5MM6SfU8yx5hQcJoVJhrVmfdl9Sdsd7qe+us6G7Gved7 KrLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=HMnGZGZ8; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q22si316799eds.346.2020.07.26.09.07.22; Sun, 26 Jul 2020 09:07:44 -0700 (PDT) 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; dkim=pass header.i=@kernel.org header.s=default header.b=HMnGZGZ8; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727965AbgGZQGd (ORCPT + 99 others); Sun, 26 Jul 2020 12:06:33 -0400 Received: from mail.kernel.org ([198.145.29.99]:42478 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726117AbgGZQGd (ORCPT ); Sun, 26 Jul 2020 12:06:33 -0400 Received: from mail-ot1-f53.google.com (mail-ot1-f53.google.com [209.85.210.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AF0002078E for ; Sun, 26 Jul 2020 16:06:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1595779592; bh=jOlSd937RAl4IikqYHXqep9iyrxRMosx470QDWX0F5o=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=HMnGZGZ8zFPNbKdaNkL5nkkSM8jRMIAHhiqCpnnztcLsnfOizEu4MyxHX3/PY48kQ OKSriRyt3KRRiQEY7MQd/UvJ5SEe1uW/4kpCx6/OlGtmxNSrIN7a+JuuZitRc8QarT 57nOy9ojB0zNJZSlav9+3RAnApxBHr7GhgYpBqNU= Received: by mail-ot1-f53.google.com with SMTP id n24so10540623otr.13 for ; Sun, 26 Jul 2020 09:06:32 -0700 (PDT) X-Gm-Message-State: AOAM5326FiEvrjQMz//MgdiLTLU2VJnZgMnF0yXYXAnxx/faujWBxxF4 562fyR84P5h9Yg9m3upyk38drFU5xogW7ieXPqE= X-Received: by 2002:a05:6830:1094:: with SMTP id y20mr5572348oto.90.1595779591988; Sun, 26 Jul 2020 09:06:31 -0700 (PDT) MIME-Version: 1.0 References: <20200724050553.1724168-1-jarkko.sakkinen@linux.intel.com> <20200724050553.1724168-6-jarkko.sakkinen@linux.intel.com> <20200724092746.GD517988@gmail.com> <20200725031648.GG17052@linux.intel.com> <20200726081408.GB2927915@kernel.org> In-Reply-To: <20200726081408.GB2927915@kernel.org> From: Ard Biesheuvel Date: Sun, 26 Jul 2020 19:06:20 +0300 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v5 5/6] kprobes: Use text_alloc() and text_free() To: Mike Rapoport Cc: Jarkko Sakkinen , Ingo Molnar , Linux Kernel Mailing List , linux-mm@kvack.org, Andi Kleen , Masami Hiramatsu , Peter Zijlstra , "Naveen N. Rao" , Anil S Keshavamurthy , "David S. Miller" , Jessica Yu Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, 26 Jul 2020 at 11:14, Mike Rapoport wrote: > > On Sat, Jul 25, 2020 at 06:16:48AM +0300, Jarkko Sakkinen wrote: > > On Fri, Jul 24, 2020 at 11:27:46AM +0200, Ingo Molnar wrote: > > > > > > * Jarkko Sakkinen wrote: > > > > > > > Use text_alloc() and text_free() instead of module_alloc() and > > > > module_memfree() when an arch provides them. > > > > > > > > Cc: linux-mm@kvack.org > > > > Cc: Andi Kleen > > > > Cc: Masami Hiramatsu > > > > Cc: Peter Zijlstra > > > > Signed-off-by: Jarkko Sakkinen > > > > --- > > > > kernel/kprobes.c | 9 +++++++++ > > > > 1 file changed, 9 insertions(+) > > > > > > > > diff --git a/kernel/kprobes.c b/kernel/kprobes.c > > > > index 4e46d96d4e16..611fcda9f6bf 100644 > > > > --- a/kernel/kprobes.c > > > > +++ b/kernel/kprobes.c > > > > @@ -40,6 +40,7 @@ > > > > #include > > > > #include > > > > #include > > > > +#include > > > > > > > > #define KPROBE_HASH_BITS 6 > > > > #define KPROBE_TABLE_SIZE (1 << KPROBE_HASH_BITS) > > > > @@ -111,12 +112,20 @@ enum kprobe_slot_state { > > > > > > > > void __weak *alloc_insn_page(void) > > > > { > > > > +#ifdef CONFIG_ARCH_HAS_TEXT_ALLOC > > > > + return text_alloc(PAGE_SIZE); > > > > +#else > > > > return module_alloc(PAGE_SIZE); > > > > +#endif > > > > } > > > > > > > > void __weak free_insn_page(void *page) > > > > { > > > > +#ifdef CONFIG_ARCH_HAS_TEXT_ALLOC > > > > + text_free(page); > > > > +#else > > > > module_memfree(page); > > > > +#endif > > > > } > > > > > > I've read the observations in the other threads, but this #ifdef > > > jungle is silly, it's a de-facto open coded text_alloc() with a > > > module_alloc() fallback... > > > > In the previous version I had: > > > > https://lore.kernel.org/lkml/20200717030422.679972-4-jarkko.sakkinen@linux.intel.com/ > > > > and I had just calls to text_alloc() and text_free() in corresponding > > snippet to the above. > > > > I got this feedback from Mike: > > > > https://lore.kernel.org/lkml/20200718162359.GA2919062@kernel.org/ > > > > I'm not still sure that I fully understand this feedback as I don't see > > any inherent and obvious difference to the v4. In that version fallbacks > > are to module_alloc() and module_memfree() and text_alloc() and > > text_memfree() can be overridden by arch. > > Let me try to elaborate. > > There are several subsystems that need to allocate memory for executable > text. As it happens, they use module_alloc() with some abilities for > architectures to override this behaviour. > > For many architectures, it would be enough to rename modules_alloc() to > text_alloc(), make it built-in and this way allow removing dependency on > MODULES. > > Yet, some architectures have different restrictions for code allocation > for different subsystems so it would make sense to have more than one > variant of text_alloc() and a single config option ARCH_HAS_TEXT_ALLOC > won't be sufficient. > > I liked Mark's suggestion to have text_alloc_() and proposed > a way to introduce text_alloc_kprobes() along with > HAVE_KPROBES_TEXT_ALLOC to enable arch overrides of this function. > > The major difference between your v4 and my suggestion is that I'm not > trying to impose a single ARCH_HAS_TEXT_ALLOC as an alternative to > MODULES but rather to use per subsystem config option, e.g. > HAVE_KPROBES_TEXT_ALLOC. > > Another thing, which might be worth doing regardless of the outcome of > this discussion is to rename alloc_insn_pages() to text_alloc_kprobes() > because the former is way too generic and does not emphasize that the > instruction page is actually used by kprobes only. > Masami or Peter should correct me if I am wrong, but it seems to me that the way kprobes uses these pages does not require them to be in relative branching range of the core kernel on any architecture, given that they are populated with individual instruction opcodes that are executed in single step mode, and relative branches are emulated (when needed) So for kprobes in particular, we should be able to come up with a generic sequence that does not involve module_alloc(), and therefore removes the kprobes dependency on module support entirely (with the exception of power which maps the vmalloc space nx when module support is disabled). Renaming alloc_insn_page() to something more descriptive makes sense imo, but is a separate issue.