Received: by 2002:a25:23cc:0:0:0:0:0 with SMTP id j195csp1007985ybj; Tue, 5 May 2020 11:18:27 -0700 (PDT) X-Google-Smtp-Source: APiQypKL7/cxTCaDOfxeqJPRxg1jqjnnDH8Dpsgg3lo6F4G+4WCf4W2qQ5tXPIiseRHwVWakPdjD X-Received: by 2002:a05:6402:14ce:: with SMTP id f14mr3815863edx.244.1588702706908; Tue, 05 May 2020 11:18:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588702706; cv=none; d=google.com; s=arc-20160816; b=j355E+PqpmFo/PV5nkKxGXKD8bzZKRKKJM4PvR8e2HlhADBm1mIk8uXAIiNLFsTIJm Hu8tytiBQ1RscjARfuukylKm36UsctvOZv9lGgLxxbkpXFZw5ojImmdhUQOXkPzQaJw3 sXWPwDjPG0NP39VEwLxXS4yMgxzOLrWY86+xHT9pmQdn/mxILb7Otq5FaU+ZaqJEdJHu UuE9iDC9eqvxq9mi6znD51TGQG3yssmQ2763xdgeIpuDoCaOzDAxGVCfO+ZKfyVnMUyD LukAdd4r/JLUQFIZOOQvNJq6q3K2BP51clN/54KFnWxp4NtmNvqi3Dgpvt76VjnfhqIp ikuA== 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=BknEIppg1Ynh2tov0u7vQIfBYbIZWF2nZLAt9CbIAXc=; b=F6FsKM32lxlA86CG+xfaduQs2RIVL5xGBwYuNf/jXPN3rQH4GFxV2BrPxk6QQBcyjq egqF2+8/mkGWLHZ1D4yr6+QxA3irc/1UTj0kQUvtCj45x8r5PWDI/vo46I+778Qe+NV5 pNqMsme0dYJ+OsIDWoFeaoxiIYN+3PHZC/khWsAKeBfeH5tL0CFMT/ZKrpdbtG+Wcju3 /Fqa17JlH7pX7WpgnaFtuMT11zWP83d20yrQbalneB1FEfgzL3o7Q9tCm+y6d6n7muAN OW59VgPctY5imz1GQ8Cluj8TM1ulvla80SGiGR/WLwzv/yAiBeUqw5ZUBqxuf7FSFm70 bVPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=LkiuAwif; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id rv23si1454994ejb.330.2020.05.05.11.18.02; Tue, 05 May 2020 11:18:26 -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=@google.com header.s=20161025 header.b=LkiuAwif; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730861AbgEESOG (ORCPT + 99 others); Tue, 5 May 2020 14:14:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58320 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730184AbgEESOF (ORCPT ); Tue, 5 May 2020 14:14:05 -0400 Received: from mail-pl1-x644.google.com (mail-pl1-x644.google.com [IPv6:2607:f8b0:4864:20::644]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 563A0C061A0F for ; Tue, 5 May 2020 11:14:05 -0700 (PDT) Received: by mail-pl1-x644.google.com with SMTP id h11so1143487plr.11 for ; Tue, 05 May 2020 11:14:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=BknEIppg1Ynh2tov0u7vQIfBYbIZWF2nZLAt9CbIAXc=; b=LkiuAwifBVBFxsZwWFv1+Fcj9vU5YnDVgx3wgg2Km/U0XxfxNUWTyBszyPXHFSSieB dfmvAhfnLTV6+9pkTRXC49RUyU9k+6DGdQU4tA10qnbAgSgVOou5nzaup2cxif8Ql9co 9zPWSvG6yHd9Pt5YthGdGbDIH7ie9YOPFljN2LD8yBSLM6vq9EvNQruIY6DdBf6eReKs PY3hartLkiSD0r/ruhrHcxIEWELSuw4Tu00VAdrDiRrJ2QFoZdrmrZ0QKNOdlKz16AOA RC1M4opqcwvRRmuGg0VLsyMmzVLSpwLzYP+IcsnF57XhuWgf6xeHaFSorqM6Fnx34uBh dT4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=BknEIppg1Ynh2tov0u7vQIfBYbIZWF2nZLAt9CbIAXc=; b=G9uLvDMXrmfZYfsKpAkSg5xMJ304YLWkONjjpma70a3Wbb1i7MSuzDbL5QOcfmSalf nbO0xNz8wOvEz0XWMCP2+4iN0U7ruPFPFMKCjHUbETBxSzfaL0j7KkIRrqXS7B7205Y8 xfSz686Wklde63JtiMI95XNqWtiBb5y38QvdXHqFaiGcy4krQCTrzAXB558W6zF7Ax2R 1PnaFhQT9n1JE/2kRNEXlkv2AcIaJh8w3XyKsAjgvY+wjlB+/S9v6tGB6gGsUz3hIRNd zvzsDoHadeviKuqLhZQqMvA93NAkY878Y5Lv9rnu0gUiQpR2wUq0hWjOyKQtcUKvLIwM Qpuw== X-Gm-Message-State: AGi0PubIrU9+1AFar9N6LDxOW62spzPlIiXhEUqWEJp7KvSorwTkbLN8 CwRjiP+O07d6ueOkouPtQ6K7iWnJ2VLYmfwS0d++jQ== X-Received: by 2002:a17:90a:e382:: with SMTP id b2mr4533709pjz.110.1588702444398; Tue, 05 May 2020 11:14:04 -0700 (PDT) MIME-Version: 1.0 References: <20200501202849.647891881@infradead.org> <20200501202944.593400184@infradead.org> <1238787e-d97d-f09b-d76d-2df2dc273f4b@rasmusvillemoes.dk> <20200503125813.GL3762@hirez.programming.kicks-ass.net> <20200504201445.GQ3762@hirez.programming.kicks-ass.net> <20200505093625.GE5298@hirez.programming.kicks-ass.net> In-Reply-To: <20200505093625.GE5298@hirez.programming.kicks-ass.net> From: Nick Desaulniers Date: Tue, 5 May 2020 11:13:53 -0700 Message-ID: Subject: Re: [PATCH v4 14/18] static_call: Add static_cond_call() To: Peter Zijlstra Cc: Rasmus Villemoes , "maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)" , LKML , Steven Rostedt , Masami Hiramatsu , bristot@redhat.com, Jason Baron , Linus Torvalds , Thomas Gleixner , Ingo Molnar , Nadav Amit , "H. Peter Anvin" , Andy Lutomirski , Ard Biesheuvel , Josh Poimboeuf , Paolo Bonzini , Mathieu Desnoyers , "H.J. Lu" , clang-built-linux 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 Tue, May 5, 2020 at 2:36 AM Peter Zijlstra wrote: > > > HJ, Nick, > > Any chance any of you can see a way to make your respective compilers > not emit utter junk for this? > > On Mon, May 04, 2020 at 10:14:45PM +0200, Peter Zijlstra wrote: > > > https://godbolt.org/z/SDRG2q Woah, a godbolt link! Now we're speaking the same language. What were you expecting? Us to remove the conditional check that a volatile read wasn't NULL? (Not using READ_ONCE, produces the direct tail call I suspect you're looking for, but am unsure if that's what you meant, and understand that's not a solution). I am simultaneously impressed and disgusted by this btw, cool stuff. i.e. void *func = &name.func; \ rather than void *func = READ_ONCE(name.func); \ (I'm surprised that `&name.func;` and `name.func;` also produce different results). > > > > --- > > #include > > > > > > #define READ_ONCE(var) (*((volatile typeof(var) *)&(var))) > > #define WRITE_ONCE(var, val) (*((volatile typeof(var) *)&(var)) = (val)) > > > > struct static_call_key { > > void *func; > > }; > > > > #define DECLARE_STATIC_CALL(name, func) \ > > extern struct static_call_key name; \ > > extern typeof(func) __SCT__##name; > > > > #define DEFINE_STATIC_COND_CALL(name, _func) \ > > DECLARE_STATIC_CALL(name, _func) \ > > struct static_call_key name = { \ > > .func = NULL, \ > > } > > > > static void __static_call_nop(void) > > { > > } > > > > #define __static_cond_call(name) \ > > ({ \ > > void *func = READ_ONCE(name.func); \ > > if (!func) \ > > func = &__static_call_nop; \ > > (typeof(__SCT__##name)*)func; \ > > }) > > > > #define static_cond_call(name) (void)__static_cond_call(name) > > > > static void inline static_call_update(struct static_call_key *call, void *func) > > { > > WRITE_ONCE(call->func, func); > > } > > > > volatile int _x; > > > > void bar(int x) > > { > > _x = x; > > } > > > > DEFINE_STATIC_COND_CALL(foo, bar); > > > > void ponies(int x) > > { > > static_cond_call(foo)(x); > > } -- Thanks, ~Nick Desaulniers