Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp2653337imm; Thu, 11 Oct 2018 13:56:16 -0700 (PDT) X-Google-Smtp-Source: ACcGV61Ftky6J+Bhtid/qfXTOMZoWpd8iTUDg5sRRO7tGQbVDoI/UunE4Ci+mxvFP5kKF3/qLQcy X-Received: by 2002:a63:ce14:: with SMTP id y20-v6mr2899084pgf.248.1539291376804; Thu, 11 Oct 2018 13:56:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539291376; cv=none; d=google.com; s=arc-20160816; b=DV654Pu1IjvtV8K/kdJmezrucI3tXeGBgeE90pqq5wRN7aXa3WWCnVnkUlIlYqoCfd 1jRuVX3QW+mD3LMKevEZ9aKYoPAfXPIC7xtt362rTlUjdC79h1+AzS42nDSJQDVOaeip NypT8VE+JlCfZafdjdUWNRGbBd02fJ6bXcndludFnB2cmMkyOjHW6DG9HNjE1783/+ON +KhKEXOjHzq5uutSbS0kbumOXmcO7Os0HCGHOvkaJrVi28Rhk74kCxqLtUNaW6KLhD2g lh6Z+q3Yv6vYw497TgyEjHF7gUAAohtkex4istFxTFF+LG4Bckeg+CiNxxIH5Ga/i3jL TAHw== 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=2Cic3UentjS6YbdSx4mb14tlT4ZJ8SNtwiAWcOc/5xY=; b=OZBBxI0R1S6BTOSLb/GfDhVdQN/kAefcbS5lSDJyMh8NLNJ5FI165On0zByUW7OtcO fQ33AIR1bIqDBrNZwzgI8umnYHObNSkUWdpPbX/lYnmAKuhImqX18UrkU9wk86c/RKMF pFrLM3ornZY8vcWV5ixfqmmzuE3x3EtX59zqoB5RJGsu2m/TbPpmQmOA81yDnNvRSqtQ o438rW+LRSMdf5NtnPMT4OjC1BWr9yFpfoZj5xSWpYzyrC+N00F3KCiSZqvX5Pt9uGY1 HfGx7MKWuuu0gOYd1hHW4lvKbP2IJKZ7I8BfxOByGvIK0z7xRamXrCyLcA7iv4piq9tp uf3g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=pTj0nQ0t; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k20-v6si27713572pgh.168.2018.10.11.13.56.00; Thu, 11 Oct 2018 13:56:16 -0700 (PDT) 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=@google.com header.s=20161025 header.b=pTj0nQ0t; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726290AbeJLEYb (ORCPT + 99 others); Fri, 12 Oct 2018 00:24:31 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:37512 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725819AbeJLEYb (ORCPT ); Fri, 12 Oct 2018 00:24:31 -0400 Received: by mail-pf1-f195.google.com with SMTP id j23-v6so5004562pfi.4 for ; Thu, 11 Oct 2018 13:55:31 -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=2Cic3UentjS6YbdSx4mb14tlT4ZJ8SNtwiAWcOc/5xY=; b=pTj0nQ0te8sy0hnOQlw6oL06XvvguE3hd56MrMCRlt5RymP6x9bMqojzK/788axaZ6 IKKHbzk+b8NTARMEM9yoge5iKvg6d4n249fZVNCtbRQTDcmxkTlob7WI6zTKsVvlhVTY Dd2/gM1enE7MhNvxHe8nnuLp2SLq9QbC1E3AtOCM4piNMDUceEBetYs3DCK+N1JtpACQ ++N23cMn8cE/+MYiHvVHbNGYOBfzjEzJpkKmzrtDi7RODQ/BSPZKzaitB8tWbu39s+86 emhz8mMj01Kf4NizQXAUEE1nKNwSLEakwmS3rtWxby8U0MFH6m3+cpS634QinwjtUAbE t/zw== 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=2Cic3UentjS6YbdSx4mb14tlT4ZJ8SNtwiAWcOc/5xY=; b=kx+L4UxPGIhEkL/EoaH2nP4mltwpyo3n6ix9yBnhw9WSnRG9yAxVbwhozbxC9RSDvs HmJKg5mOItrO1zzorcMYYgkywWSEKEiAapmzq4bZh6LPeF8deqTzFOfSUKY7xYccijTG HwN+qH9xzUa3pNPFO6m+b/rF/x57l/UDmPodFJZ+NRhYgW1PfjqcdVy029Oc9HHen+7b 86vWnhnUI6floZ/SzQiQdt3bV5TdOjMCSm6ZG0udOVEdNlxDGgR7tDMRajeN5t9pWMLI sj8PzKhrMDR1A9PEt277qPpWoEAZw+O7sec7QsIYQ7a4i6q2DDZmrEheFir2WKdffTkL wfvw== X-Gm-Message-State: ABuFfoiSbZQU4WtHGD+J/mPIJknmWejfQ6/SShHcpLeARM9os7VC0qy+ gA+NmsE2zRan24rPXuwuAbvzqjSy95eYooAUsBK3Gw== X-Received: by 2002:a65:4882:: with SMTP id n2-v6mr2681441pgs.225.1539291331061; Thu, 11 Oct 2018 13:55:31 -0700 (PDT) MIME-Version: 1.0 References: <20181009171401.14980-1-natechancellor@gmail.com> <87woqqm2mz.fsf@intel.com> <87o9c1vwgc.fsf@intel.com> In-Reply-To: <87o9c1vwgc.fsf@intel.com> From: Nick Desaulniers Date: Thu, 11 Oct 2018 13:55:19 -0700 Message-ID: Subject: Re: [Intel-gfx] [PATCH] drm/i915: Convert _print_param to a macro To: jani.nikula@linux.intel.com Cc: michal.wajdeczko@intel.com, Nathan Chancellor , intel-gfx@lists.freedesktop.org, LKML , dri-devel@lists.freedesktop.org, rodrigo.vivi@intel.com, lukas.bulwahn@gmail.com 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 Wed, Oct 10, 2018 at 11:21 PM Jani Nikula wrote: > > On Wed, 10 Oct 2018, Nick Desaulniers wrote: > > On Wed, Oct 10, 2018 at 1:30 PM Michal Wajdeczko > > wrote: > >> > >> On Wed, 10 Oct 2018 14:01:40 +0200, Jani Nikula > >> wrote: > >> > >> > On Tue, 09 Oct 2018, Nick Desaulniers wrote: > >> >> On Tue, Oct 9, 2018 at 10:14 AM Nathan Chancellor > >> >> wrote: > >> >>> > >> >>> When building the kernel with Clang with defconfig and CONFIG_64BIT > >> >>> disabled, vmlinux fails to link because of the BUILD_BUG in > >> >>> _print_param. > >> >>> > >> >>> ld: drivers/gpu/drm/i915/i915_params.o: in function `i915_params_dump': > >> >>> i915_params.c:(.text+0x56): undefined reference to > >> >>> `__compiletime_assert_191' > >> >>> > >> >>> This function is semantically invalid unless the code is first inlined > >> >>> then constant folded, which doesn't work for Clang because semantic > >> >>> analysis happens before optimization/inlining. Converting this function > >> >>> to a macro avoids this problem and allows Clang to properly remove the > >> >>> BUILD_BUG during optimization. > >> >> > >> >> Thanks Nathan for the patch. To provide more context, Clang does > >> >> semantic analysis before optimization, where as GCC does these > >> >> together (IIUC). So the above link error is from the naked > >> >> BUILD_BUG(). Clang can't evaluate the __builtin_strcmp's statically > >> >> until inlining has occurred, but that optimization happens after > >> >> semantic analysis. To do the inlining before semantic analysis, we > >> >> MUST leverage the preprocessor, which runs before the compiler starts > >> >> doing semantic analysis. I suspect this code is not valid for GCC > >> >> unless optimizations are enabled (the kernel only does compile with > >> >> optimizations turned on). This change allows us to build this > >> >> translation unit with Clang. > >> >> > >> >> Acked-by: Nick Desaulniers > >> >> (Note: this is the change I suggested, so not sure whether Acked-by or > >> >> Reviewed-by is more appropriate). > >> > > >> > *Sad trombone* > >> > > >> > I'd rather see us converting more macros to static inlines than the > >> > other way round. > >> > > >> > I'll let others chime in if they have any better ideas, otherwise I'll > >> > apply this one. > >> > >> Option 1: Just drop BUILD_BUG() from _print_param() function. > > > > I was also thinking of this. > > So does this fix the issue? Yes, that should do the trick. I assume this macro can also be rewritten to use __builtin_types_compatible_p and __builtin_choose_expr (rather than tokenizing the type and using __builtin_strcmp), but maybe an exercise for another day. We're happy with the simplest fix acceptable for now. > > diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c > index bd6bd8879cab..8d71886b5f03 100644 > --- a/drivers/gpu/drm/i915/i915_params.c > +++ b/drivers/gpu/drm/i915/i915_params.c > @@ -184,7 +184,8 @@ static __always_inline void _print_param(struct drm_printer *p, > else if (!__builtin_strcmp(type, "char *")) > drm_printf(p, "i915.%s=%s\n", name, *(const char **)x); > else > - BUILD_BUG(); > + WARN_ONCE(1, "no printer defined for param type %s (i915.%s)\n", > + type, name); > } > > /** > > --- > > > > >> > >> Option 2: Use aliases instead of real types in param() macros. > > > > Will that affect other users of I915_PARAMS_FOR_EACH than _print_param? > > > > Either way, thanks for the help towards resolving this! We appreciate it! > > > >> > >> Aliases can be same as in linux/moduleparam.h (charp|int|uint|bool) > >> We can convert aliases back to real types but it will also allow > >> to construct proper names for dedicated functions - see [1] > >> > >> Michal > >> > >> [1] https://patchwork.freedesktop.org/patch/255928/ > > I can't find this on the list; was this sent just to patchwork or what? > > BR, > Jani. > > > >> > >> > >> > > >> > BR, > >> > Jani. > >> > > >> >> > >> >>> > >> >>> The output of 'objdump -D' is identically before and after this change > >> >>> for GCC regardless of if CONFIG_64BIT is set and allows Clang to link > >> >>> the kernel successfully with or without CONFIG_64BIT set. > >> >>> > >> >>> Link: https://github.com/ClangBuiltLinux/linux/issues/191 > >> >>> Suggested-by: Nick Desaulniers > >> >>> Signed-off-by: Nathan Chancellor > >> >>> --- > >> >>> drivers/gpu/drm/i915/i915_params.c | 29 +++++++++++++---------------- > >> >>> 1 file changed, 13 insertions(+), 16 deletions(-) > >> >>> > >> >>> diff --git a/drivers/gpu/drm/i915/i915_params.c > >> >>> b/drivers/gpu/drm/i915/i915_params.c > >> >>> index 295e981e4a39..a0f20b9b6f2d 100644 > >> >>> --- a/drivers/gpu/drm/i915/i915_params.c > >> >>> +++ b/drivers/gpu/drm/i915/i915_params.c > >> >>> @@ -174,22 +174,19 @@ i915_param_named(enable_dpcd_backlight, bool, > >> >>> 0600, > >> >>> i915_param_named(enable_gvt, bool, 0400, > >> >>> "Enable support for Intel GVT-g graphics virtualization host > >> >>> support(default:false)"); > >> >>> > >> >>> -static __always_inline void _print_param(struct drm_printer *p, > >> >>> - const char *name, > >> >>> - const char *type, > >> >>> - const void *x) > >> >>> -{ > >> >>> - if (!__builtin_strcmp(type, "bool")) > >> >>> - drm_printf(p, "i915.%s=%s\n", name, yesno(*(const bool > >> >>> *)x)); > >> >>> - else if (!__builtin_strcmp(type, "int")) > >> >>> - drm_printf(p, "i915.%s=%d\n", name, *(const int *)x); > >> >>> - else if (!__builtin_strcmp(type, "unsigned int")) > >> >>> - drm_printf(p, "i915.%s=%u\n", name, *(const unsigned > >> >>> int *)x); > >> >>> - else if (!__builtin_strcmp(type, "char *")) > >> >>> - drm_printf(p, "i915.%s=%s\n", name, *(const char **)x); > >> >>> - else > >> >>> - BUILD_BUG(); > >> >>> -} > >> >>> +#define _print_param(p, name, type, > >> >>> x) \ > >> >>> +do > >> >>> { > >> >>> \ > >> >>> + if (!__builtin_strcmp(type, > >> >>> "bool")) \ > >> >>> + drm_printf(p, "i915.%s=%s\n", name, yesno(*(const bool > >> >>> *)x)); \ > >> >>> + else if (!__builtin_strcmp(type, > >> >>> "int")) \ > >> >>> + drm_printf(p, "i915.%s=%d\n", name, *(const int > >> >>> *)x); \ > >> >>> + else if (!__builtin_strcmp(type, "unsigned > >> >>> int")) \ > >> >>> + drm_printf(p, "i915.%s=%u\n", name, *(const unsigned > >> >>> int *)x); \ > >> >>> + else if (!__builtin_strcmp(type, "char > >> >>> *")) \ > >> >>> + drm_printf(p, "i915.%s=%s\n", name, *(const char > >> >>> **)x); \ > >> >>> + > >> >>> else > >> >>> \ > >> >>> + > >> >>> BUILD_BUG(); \ > >> >>> +} while (0) > >> >>> > >> >>> /** > >> >>> * i915_params_dump - dump i915 modparams > >> >>> -- > >> >>> 2.19.0 > >> >>> > > -- > Jani Nikula, Intel Open Source Graphics Center -- Thanks, ~Nick Desaulniers