Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp1813478imm; Wed, 10 Oct 2018 23:37:38 -0700 (PDT) X-Google-Smtp-Source: ACcGV61yIhHmv7j0YohJtARh5Epz9hypkVJj4DD91mYrSX9ku3wG+8ioewQLosUvmuzTc7YX6mP/ X-Received: by 2002:a62:1316:: with SMTP id b22-v6mr305374pfj.37.1539239858610; Wed, 10 Oct 2018 23:37:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539239858; cv=none; d=google.com; s=arc-20160816; b=kRHwEtrXnvLpziTANfouBFFJLaT9WO44lB52spF40fYqJtqeM7uZips/HrAr2zucHl OpD2lTZx9MQWAQbSCEJqZJKou5UCVwrcop4xUCGAqluU6CTSUYnzlT+SWF3DrM43BbEX lFQ0/++gVlNwDp3im+bTMRErBBYcVLjgKM2eBY76SYKqG7hznPDbnEJCXduja6PUkli6 N/18SXIomq/1+8pxngOeRkOlJvrCVGBKb0ancFoimsm0juNo8PYmqVh+jDSRXHtnsOH/ nXaOdtA30YxTC0pve2dIUKybce63HyBH+8R7ndKi3fSxSzHpgQL9LtR2hOlx6VsGVtSU Gx4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:references :organization:in-reply-to:subject:cc:to:from; bh=sMPnKlvI5JkpJHtxhpwadzf2IAgnsVsNVt+1NZBVyco=; b=mToIbemfDwYwTkC85Yemu8NHofSpweuWRbKMvA8MjJOsfdC5f6k9qGXNqHYOnxzTEQ nUvOwUGWLT3pyjRK/1HbW6LEMk2d6sTkdAf+oJMSKX+T1gBwqDNZ8Zdjcz60FPDhRyD2 3D6/72IfHvwoslMoLwHoHDPYEw2DHJ94+r7jSHNXDc3V41PIHXwJlOcRuZPASBa6Kamf LohvZRgtk5WKi1GzyZ0w49i9mMU3cJ7TXzE9XtzmljIepBcf5CHOE1t7BbA1+kP7BCJz QVycX+gukb7Hd+Lv0wpSTggyTjmpHzhYYlIrzsD+HTYihU6tX2TbTgofyJ5f27AIcj99 wtag== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 97-v6si27070788plm.290.2018.10.10.23.37.23; Wed, 10 Oct 2018 23:37:38 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727170AbeJKNrU (ORCPT + 99 others); Thu, 11 Oct 2018 09:47:20 -0400 Received: from mga09.intel.com ([134.134.136.24]:20034 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726944AbeJKNrT (ORCPT ); Thu, 11 Oct 2018 09:47:19 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Oct 2018 23:21:33 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,367,1534834800"; d="scan'208";a="98209128" Received: from vbgoda-mobl.ger.corp.intel.com (HELO localhost) ([10.252.39.69]) by fmsmga001.fm.intel.com with ESMTP; 10 Oct 2018 23:16:55 -0700 From: Jani Nikula To: Nick Desaulniers , michal.wajdeczko@intel.com Cc: Nathan Chancellor , intel-gfx@lists.freedesktop.org, LKML , dri-devel@lists.freedesktop.org, rodrigo.vivi@intel.com, lukas.bulwahn@gmail.com Subject: Re: [Intel-gfx] [PATCH] drm/i915: Convert _print_param to a macro In-Reply-To: Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo References: <20181009171401.14980-1-natechancellor@gmail.com> <87woqqm2mz.fsf@intel.com> Date: Thu, 11 Oct 2018 09:17:23 +0300 Message-ID: <87o9c1vwgc.fsf@intel.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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? 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