Received: by 2002:a25:23cc:0:0:0:0:0 with SMTP id j195csp1018178ybj; Tue, 5 May 2020 11:30:12 -0700 (PDT) X-Google-Smtp-Source: APiQypIEAlAlbcCEhk7v8c5NHIFs/73Ychu3ymeg9ZUeYsimZxCW9JouAxzjYYA+hpm3YqssAF9G X-Received: by 2002:a17:906:eb90:: with SMTP id mh16mr4051693ejb.201.1588703412530; Tue, 05 May 2020 11:30:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588703412; cv=none; d=google.com; s=arc-20160816; b=UlmM5yryX7LrsoPhpXNDI9otWtfB+dExDl98KvcgVXaMsy32I0SfdFjem3U15NQhIQ vWnWQ/xs296xCGwjwXy0kryHkExijIM+HCc8svNqGgMLNiK2JXHcAdZKwUBobWNSKpD6 /HTVUlJRX6iv3BE5GmCp6HDs5fNd1Sau6WuApYmXfIk8nc+GM11u99Ihrbf+w+j384vU 1rAuUBsdOOjzOBjqpR/vQhGK3X2TESumJSEbNFDHIJnw3QgWpf+w/ZcXMuX4Xe/VUHfj gUdmhyOHGXya0X6tYiauQOIcxQhnBRCjAX2wUbE7/zXeEpjAQi/tp1p4BDIrccFDwvjZ dhpA== 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=o+I2ZEpd9rMStG/cH8oLpZvbJxOrhOe7FbrS6Jy7iRQ=; b=tRDYWzSITsv4hWPo2iHmAugfuKVeeKdrNRtg7KByGzqjm8L2Kf8Tchzv8gesSchs66 Ph0agwrNjrLYtvjE1zUWGellizw1AYyL69RCK+1ObDxUolOqpdV6ah8JiZE+Nk5Qm1Nt Gy0tAyxivDTgfz0QOYixwnQK7bFBfUNZz0tOYRJg66LyuuchgY7p6B9JUlvmUyjPXfTd BjSUt2z7BztS/6/1FGy/i11lDg+KahK71/neNVIbyUwfkjLq0MY/43rsxee5zOB2+oKC pEmv918a532H8Ex2+PD6QKrBHkDcHgBKB4IpsB3VU3jSoFAwVCqjaKcheu0BC+q+EXSA 1UIQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=OYaFBo53; 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 w25si1650319edq.368.2020.05.05.11.29.49; Tue, 05 May 2020 11:30:12 -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=OYaFBo53; 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 S1728977AbgEES2F (ORCPT + 99 others); Tue, 5 May 2020 14:28:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60518 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728135AbgEES2E (ORCPT ); Tue, 5 May 2020 14:28:04 -0400 Received: from mail-pj1-x1041.google.com (mail-pj1-x1041.google.com [IPv6:2607:f8b0:4864:20::1041]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 473ABC061A0F for ; Tue, 5 May 2020 11:28:04 -0700 (PDT) Received: by mail-pj1-x1041.google.com with SMTP id a5so1580578pjh.2 for ; Tue, 05 May 2020 11:28:04 -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=o+I2ZEpd9rMStG/cH8oLpZvbJxOrhOe7FbrS6Jy7iRQ=; b=OYaFBo53N41YL0p8SCOnpHV1R+tw5a4LhMXnIwzP8D//GJ5+IEOk9hpoI6oCV2xFQH aySgt3bd5dneynZzlv+x3i3O5HGCf0fnX+A5gDKvwsONyESp2jWCZVNylHzWQ7A+mzK+ 379MgLp8isot6kDWV4cqr0awdFFGm8nUN+Bze4Xf9FR85rM3jPva3qXM/t82rEj+jGwn KMmZOnanmFr2mArpfXKAFriAPjKGFAFMmA2N4zrLVfhFASq/xwn/d0E1V43tula3k7uD nYZ9m13pOTx7k/xuGFyBDaFrb5++habxqRx/12ky4kRH2P4/VgrWHvJFMlP5fM8HxHsR LsHQ== 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=o+I2ZEpd9rMStG/cH8oLpZvbJxOrhOe7FbrS6Jy7iRQ=; b=eeNfFv//Z4AWEi9lhR197q0InvKNx+3QBQJp403S5FQN38JINBTu1COW8sQcAbw/eH LTnAobxPr9SePEiJKUZ9AqXU6tjbRU16msv4XZzqAqBklYGjWP6sf1MbTKKOar3+YG65 stWoSg5RDQt64NiwerlE5xF3aAHqBJdxsZHYYQmKsK+tiP7sngogpn3r+jHLw5dcaD5t d1/T6az4jbddFeRYoU/js7XDWCjBHYxeUGYP1kJsxAldQbDfBoa4072H4TIlcuNWYrhQ vHif5NCCAYhYI3p0E3DLgkGjJPUYdO/IA6zda9E/gnI5FZhapcIraqUMS5gjGISpdkBh 07lA== X-Gm-Message-State: AGi0PuaNQ08nERmmLEVuofu5DpKJh0vYcG/2Rc3Ii4QE3gH8aHLlpFIE BUq9wiNNkB+SWafjr9P6NjFmTa88dpLH44Ea2/USKLvmAQ4= X-Received: by 2002:a17:90a:6488:: with SMTP id h8mr4710233pjj.51.1588703283513; Tue, 05 May 2020 11:28:03 -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: From: Nick Desaulniers Date: Tue, 5 May 2020 11:27: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 11:13 AM Nick Desaulniers wrote: > > 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); \ Changing void *func = READ_ONCE(name.func); \ to void *func = &READ_ONCE(name.func); \ produces the tail call. Not sure if that's relevant/what you were looking for/even correct (haven't thought to hard about the implications of that change; juggling other stuff ATM) > (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 -- Thanks, ~Nick Desaulniers