Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1034436imu; Fri, 9 Nov 2018 09:53:13 -0800 (PST) X-Google-Smtp-Source: AJdET5erEhneGdkxDb2bYamdJgkO1rl2gk56jxyJVTyTNFttF7eROXs2x0UNiXzjyhHvBDxsvx9K X-Received: by 2002:a63:ea43:: with SMTP id l3-v6mr8377314pgk.427.1541785993243; Fri, 09 Nov 2018 09:53:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541785993; cv=none; d=google.com; s=arc-20160816; b=NI5pz3Qi1pStcCWJNkgwGFj2CNXR0ZUYPNbuOCMoc7jcc7adCvKN1ICPQuEK01S1nf r/V+K1nVkmLmMunM/+mdUfVbu5UUDJKVxiS4wYDp/IgDtS0DC4UCAU9SxY0R0TgmEYC4 8ln2IxgcfhW+YdIomEWfocfuGMsZZJRuVGnI534MO6aJghqaHVug25m9FMfodLI/iCfn YgQreG+BaOdjyeOwLW5cGTuyCUE/Uk98MLX7kcZSOd3zBuRtGyC8PEfWtry7/9wgRM9x mC9EoBkY6SuCU7cWF5j9Mrsrql1/oALud6G83waDU6GgZRhV0qEGjwzITFi43ws91gJf ORGQ== 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 :references:in-reply-to:mime-version:dkim-signature; bh=E95R29DOT5MM3H1746Z4C+nswoj3mJlY/BGH9VkG6+E=; b=N1rzBlA4n4xBuPbtYNHlbL2oeFgbbOuGlDUAXABKjSXkUB6R+dNPIRHnM3PsDHeKjo bJBtKMDqLIljmgUYDuY4qh6Icc4j/5kxT5eAuC41w9wjgPk2ESDw6YD3MnxeUV3y1VV9 XFIWNbcXxECoEbga2mnZg2OOWAlirkJNYzNdHP3zr7FF4JaXg8v91couyqRuGdCT91S/ SaTi57APKTSvWw51r8MjcF815Iuk6m74BPHF/GG5xs0oDghPDPDHNvNMyL8yf3sWw0U/ FXJAZaItZjJ0NxrYV7gYaNTEUWxZHPjAOmLs/HdaYcIo5Pxh/x0R1b7CkCVyMxB9SCMi IovA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=FBoZN8mv; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u189-v6si8923338pfu.263.2018.11.09.09.52.57; Fri, 09 Nov 2018 09:53:13 -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; dkim=pass header.i=@linaro.org header.s=google header.b=FBoZN8mv; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728588AbeKJDeJ (ORCPT + 99 others); Fri, 9 Nov 2018 22:34:09 -0500 Received: from mail-it1-f194.google.com ([209.85.166.194]:35630 "EHLO mail-it1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728108AbeKJDeJ (ORCPT ); Fri, 9 Nov 2018 22:34:09 -0500 Received: by mail-it1-f194.google.com with SMTP id v11so4542007itj.0 for ; Fri, 09 Nov 2018 09:52:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=E95R29DOT5MM3H1746Z4C+nswoj3mJlY/BGH9VkG6+E=; b=FBoZN8mvfeR23+MowdwI4g93WdTL/aJ/GQOU4WYoxc7wnDBViJVaTNoCahGP7+9BWI fN9fcSbCZkFaOCFvw/aD69a3DcgAA1cTOid5ILrewdpPYappF/cP8vb+YarJ1vheAHJC IihgcsEXJCrXkqjp+N/pK7AqMG3c/etorDPIA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=E95R29DOT5MM3H1746Z4C+nswoj3mJlY/BGH9VkG6+E=; b=CoNl99mBXNejph4WTeC5AEAapIp4jDPEKNpEXvlwbr0jCsJtHKJLCCq7DDVlOsAlBc gxFy8R/3b1S6t6jc1EBApnDozefoW6GkcWln+eZdtgs6a6rVz5FdKYt3bAKQzOakgySl Uy06qtJt4eqMOb6U1xf9020a+7ckAiszS6E82JPE0lwy2RITnaeAo3xW/8lV+Y5n8JB9 8i4Jin4r+d9Q48Uu7+Fk8ZXuqjr23wSWGHeSzg3vSfVZRqIMUh1OKD8NNF5bBhFByE+s rSFIKeijaKe10omrRf4nYrAsO/wk4x5L6+91mw/iLOvqe6MPdHMnCRS1d4FAxVarrSw/ e5Bg== X-Gm-Message-State: AGRZ1gJrcdJyuOMT0U4+PfWbyh/pZ+8Ss5ib3QSGlD1NuSQGSBUvC23J woWfBUSm4yd0vGqKwphwzCnNGOn6V/zc1eeXpN2ZDg== X-Received: by 2002:a24:8347:: with SMTP id d68-v6mr3295999ite.158.1541785950378; Fri, 09 Nov 2018 09:52:30 -0800 (PST) MIME-Version: 1.0 Received: by 2002:a6b:4f16:0:0:0:0:0 with HTTP; Fri, 9 Nov 2018 09:52:29 -0800 (PST) In-Reply-To: <20181109174608.eahqh4fkyl3k2gvs@treble> References: <3cf04e113d71c9f8e4be95fb84a510f085aa4afa.1541711457.git.jpoimboe@redhat.com> <20181109151028.faifw66enzye32gg@treble> <20181109173106.kbghzsdsu7oachl6@treble> <20181109174608.eahqh4fkyl3k2gvs@treble> From: Ard Biesheuvel Date: Fri, 9 Nov 2018 18:52:29 +0100 Message-ID: Subject: Re: [RFC PATCH 1/3] static_call: Add static call infrastructure To: Josh Poimboeuf Cc: Linux Kernel Mailing List , "the arch/x86 maintainers" , Andy Lutomirski , Steven Rostedt , Peter Zijlstra , Ingo Molnar , Thomas Gleixner , Linus Torvalds , Masami Hiramatsu , Jason Baron , Jiri Kosina , David Laight , Borislav Petkov 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 9 November 2018 at 18:46, Josh Poimboeuf wrote: > On Fri, Nov 09, 2018 at 06:33:03PM +0100, Ard Biesheuvel wrote: >> On 9 November 2018 at 18:31, Josh Poimboeuf wrote: >> > On Fri, Nov 09, 2018 at 06:25:24PM +0100, Ard Biesheuvel wrote: >> >> On 9 November 2018 at 16:14, Ard Biesheuvel wrote: >> >> > On 9 November 2018 at 16:10, Josh Poimboeuf wrote: >> >> >> On Fri, Nov 09, 2018 at 02:39:17PM +0100, Ard Biesheuvel wrote: >> >> >>> > + for (site = start; site < stop; site++) { >> >> >>> > + struct static_call_key *key = static_call_key(site); >> >> >>> > + unsigned long addr = static_call_addr(site); >> >> >>> > + >> >> >>> > + if (list_empty(&key->site_mods)) { >> >> >>> > + struct static_call_mod *mod; >> >> >>> > + >> >> >>> > + mod = kzalloc(sizeof(*mod), GFP_KERNEL); >> >> >>> > + if (!mod) { >> >> >>> > + WARN(1, "Failed to allocate memory for static calls"); >> >> >>> > + return; >> >> >>> > + } >> >> >>> > + >> >> >>> > + mod->sites = site; >> >> >>> > + list_add_tail(&mod->list, &key->site_mods); >> >> >>> > + >> >> >>> > + /* >> >> >>> > + * The trampoline should no longer be used. Poison it >> >> >>> > + * it with a BUG() to catch any stray callers. >> >> >>> > + */ >> >> >>> > + arch_static_call_poison_tramp(addr); >> >> >>> >> >> >>> This patches the wrong thing: the trampoline is at key->func not addr. >> >> >> >> >> >> If you look at the x86 implementation, it actually does poison the >> >> >> trampoline. >> >> >> >> >> >> The address of the trampoline isn't actually known here. key->func >> >> >> isn't the trampoline address; it's the destination func address. >> >> >> >> >> >> So instead I passed the address of the call instruction. The arch code >> >> >> then reads the instruction to find the callee (the trampoline). >> >> >> >> >> >> The code is a bit confusing. To make it more obvious, maybe we should >> >> >> add another arch function to read the call destination. Then this code >> >> >> can pass that into arch_static_call_poison_tramp(). >> >> >> >> >> > >> >> > Ah right, so I am basically missing a dereference in my >> >> > arch_static_call_poison_tramp() code if this breaks. >> >> > >> >> >> >> Could we call it 'defuse' rather than 'poision'? On arm64, we will >> >> need to keep it around to bounce function calls that are out of range, >> >> and replace it with a PLT sequence. >> > >> > Ok, but doesn't that defeat the purpose of the inline approach? >> > >> >> It does. But this only occurs when a module is loaded far away, and >> this will only happen if you have 2 GB range KASLR enabled, or your >> 128 MB module region gets exhausted for some reason, so the majority >> of calls should use a single relative branch. > > Makes sense. Do you also account for the possibility that the original > call emitted by GCC was far away and thus used the PLT? > That doesn't really happen. vmlinux is never over 128 MB, and the modules are only partially linked, so the linker never gets to the stage where it needs to emit veneers. It's a bit fiddly since inline and out-of-line both use arch_static_call_transform(), but what I need to do is basically: - for out-of-line, the trampoline needs to be patched into a movn/movk/movk/br sequence if the target is too far - for inline, the trampoline itself needs to be patched from adrp/ldr/br (which does a load and a indirect branch) to movn/movk/movk/br (which uses immediates), and the call sites need to be patched into calls to the veneer if the target is out of range. So arch_static_call_transform() needs to know where the trampoline is for this use case, so could we perhaps add a 'void *orig' in the key struct that keeps track of the original value of 'addr' ?