Message ID | 20240226105427.7191-2-fancer.lancer@gmail.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel+bounces-81227-ouuuleilei=gmail.com@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:a81b:b0:108:e6aa:91d0 with SMTP id bq27csp1998457dyb; Mon, 26 Feb 2024 03:08:36 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCXkR6l83gOQerZl8d1Ixu6tZuFUgbo/fiTlu5WzvMhJnsTfqhcGAP8LKSTj7pzORH0+d+ZXKxnpnKFVBw6qIgvMOIQWug== X-Google-Smtp-Source: AGHT+IGyIen3nJ46OQeMSCW3MrOtvvK5pKsMOKZ7GRJdYXVWEckkYRub9Ft+h1OrmJPZOpe1drR2 X-Received: by 2002:a17:906:5609:b0:a43:7df:1ad0 with SMTP id f9-20020a170906560900b00a4307df1ad0mr2824051ejq.10.1708945715810; Mon, 26 Feb 2024 03:08:35 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1708945715; cv=pass; d=google.com; s=arc-20160816; b=dKgyZhkOp5lsamrEdRrd0F5GzFuQrql333DoECJ/vxpPq5OikJapMLwTZPFzj7YaBY KkdnN+y3kptfJYUJg9FmetkGhDsRbnuOJ6gM6zLUHc0JYA6hQ3roueSClTvJ1QSp/fjV GAJCtmg09HOl3D0L6TwTnvPxTseRpTfLZDHaoVm5no9hkEldI3C5nxWqgbivhl3E5FQl VCHTtEkGTSwwO/NVBQ2CttiyKZ9DeVYKR3P0HahLv7TDJBOMMmhylI50oxMP2qZG/Ajq DBk58QHYuIFV3nEP3OQWQIJXzP7gJCz4Nlv6ulhqXcy5WLzXaQfIXRixv7Cf3Q1McVFo e4gA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=4x/fx2FWKopaj90n/fZEYnFZHtx6vndtcet4O9jVerY=; fh=Gh8SYfUXJUiSiNd0KUj8nxYq1lHQ1vmBxsPn0S79QeQ=; b=V6FFrWSQs9Z1rm0STlTvQ8V6311sD9JCBbvIjAZBtng8Rlk5bv/d5PNCN184kgyRhu hcXeG7zjrPwgdyJEcyl6lGsdoCtHQXsmzNLB0SKD+vWsnpf18xwleqvt0AV9nxcS/Dxo +XbwlcmYoLoYJH1h30X5e7cLXta4xeoMKEmK40RNsGJz4IzuZIwJPuDMF2tGctZDFWgz CIFd7azap9fRXj2mxbaNOSwbngGO2xVCdKkXkvhQnt4C+R1oSikJbXbWtJtaKbZUpfA8 9xal+bkSddLE6OOyrLccweFPY9cZtxE6ZFu5XuQ+B99WRcMaYrQATO/Ct5l88l388IBy SeSA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=h3OdbtUg; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-81227-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-81227-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id m22-20020a17090607d600b00a42e3c23413si1956923ejc.226.2024.02.26.03.08.35 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Feb 2024 03:08:35 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-81227-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=h3OdbtUg; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-81227-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-81227-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 18EEB1F2D73C for <ouuuleilei@gmail.com>; Mon, 26 Feb 2024 10:57:09 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E5A23347A2; Mon, 26 Feb 2024 10:54:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="h3OdbtUg" Received: from mail-lj1-f170.google.com (mail-lj1-f170.google.com [209.85.208.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F6201CD1A; Mon, 26 Feb 2024 10:54:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708944875; cv=none; b=GRht3uwCzrcyJcyyT9PuY+1nkKXS2Kh3odADHW/FydOv7x2ei4KprO7ffMe0oDlwizaLJtnPBFTq8yJH5CdJQAEWEG2oBvKEAeoMggGgMPU0tyrmZgwM+1DyXRzIdKvhojkJ2KmeUthMcUnw6raIA8Cm0bOXshUm2/Gu+zu+DgE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708944875; c=relaxed/simple; bh=UEyFZtlmbEFsxxE3dYm/WsIXOQgVd7MY92XcjEi7gfc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Pciu1fF54yo1yJ0I0uA6IIQ8weKv7fa447b0aiRODC7X9RhmGfXEXjztOKk3NGSOJFP7tH0m9xcNw5lWIO7a/ZCSpIDM73nahRprOrrrboi1PBCc6GwPxZbfNoWL+lsg0w4zaV70ueVSUc8tG+xRhVJfLiC/HPKNy4eb0yv69+Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=h3OdbtUg; arc=none smtp.client-ip=209.85.208.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lj1-f170.google.com with SMTP id 38308e7fff4ca-2d275e63590so33974761fa.2; Mon, 26 Feb 2024 02:54:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1708944872; x=1709549672; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4x/fx2FWKopaj90n/fZEYnFZHtx6vndtcet4O9jVerY=; b=h3OdbtUgB7cYsnKso8eKu7ueKRlvHE5d7HEdvFgOOcc956/mO/n5A2K9fIJS3gXAMV wxA9D7yJWyF32JIyjI93dp22zqbzs/pHzoXn32pqmKJijqH8XX4JWtkvmK5H4XQEJfsM v3GQ/ZInkqsUfTzmfbMnERgY2xptuGvh8ET0B9cmH4cm3TG6/2IKvwNLqmOFgZrqwE34 fUBLj1A++0guGupCyQZ41ggLEd8lyLJsWTtGDOHh21ZyQTK/eBD4HN9zhoz/ms8/5P2E Qb+MpyYzftEf+hfom7PhNPyvywPl/I2PsktFINx8AbFq63mx0s57bLDQQveQZjANgruL wZGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708944872; x=1709549672; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4x/fx2FWKopaj90n/fZEYnFZHtx6vndtcet4O9jVerY=; b=bd/o5zRYpsMmtTtveut3j4HU1TCox77wcmRPfJHl35hTBLf2BRh/x7W2swa/mKCMWx wf/tPIit9X1jgzi/qOwk4pj4jnZ5uIrFFUG6BJ3YcflKXS51XW1EYXidVKOg73pSxMhO 3hDgSMHIKSpBv1xe1iY9e48JcJVWAQ4NDMEvQLZdKTRpFPuknRopSOiTfZruyhvNHIi5 Jq5Hjs6J6Ynb+JZBbZBY7CVnebFLoYdY8HUAgOtTJfo5fa+Q7BNq6rqA4eH9s+fFGfZ8 ahmURVx8kp6WwgMhXEtvfRMWl4gmVOlJ2d9wLeOcIx9bDXwBohMPLwrS+H/7a4HCbrcc YMTQ== X-Forwarded-Encrypted: i=1; AJvYcCUKF3pZzBlJnx+rj2EKjuwF0e3JartK/8WO5nLE5FZ+6+NQOyuUvuKoHBqCuqeJhnK8zGYPVlWVRX30Q5Q44+ENgx79ziEx1AzC+vg05GA0uQhpYgtyHqnLyC5a8fyBKUnZEgKrS4aVZg== X-Gm-Message-State: AOJu0YycsGVOgJ+Thya1b0ob4oISQql+ohGbiOqBz2Kicf0amcJkhOKi Zb5cEbbeToHCXezqZY7jg7sL3qobUijo3jBS3ip2o2Ss4Nb6Mbh1 X-Received: by 2002:a2e:9ccf:0:b0:2d2:8bdb:4aea with SMTP id g15-20020a2e9ccf000000b002d28bdb4aeamr1219045ljj.5.1708944872241; Mon, 26 Feb 2024 02:54:32 -0800 (PST) Received: from localhost ([178.176.56.174]) by smtp.gmail.com with ESMTPSA id b18-20020a2e4952000000b002d244bb2f99sm802946ljd.62.2024.02.26.02.54.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Feb 2024 02:54:31 -0800 (PST) From: Serge Semin <fancer.lancer@gmail.com> To: Thomas Bogendoerfer <tsbogend@alpha.franken.de>, Arnd Bergmann <arnd@arndb.de>, Jiaxun Yang <jiaxun.yang@flygoat.com>, Andrew Morton <akpm@linux-foundation.org> Cc: Serge Semin <fancer.lancer@gmail.com>, Alexey Malahov <Alexey.Malahov@baikalelectronics.ru>, linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/2] mips: cm: Convert __mips_cm_l2sync_phys_base() to weak function Date: Mon, 26 Feb 2024 13:54:21 +0300 Message-ID: <20240226105427.7191-2-fancer.lancer@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240226105427.7191-1-fancer.lancer@gmail.com> References: <20240226105427.7191-1-fancer.lancer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1791959236287648650 X-GMAIL-MSGID: 1791959463307514833 |
Series |
[v2,1/2] mips: cm: Convert __mips_cm_l2sync_phys_base() to weak function
|
|
Commit Message
Serge Semin
Feb. 26, 2024, 10:54 a.m. UTC
The __mips_cm_l2sync_phys_base() and mips_cm_l2sync_phys_base() couple was
introduced in commit 9f98f3dd0c51 ("MIPS: Add generic CM probe & access
code") where the former method was a weak implementation of the later
function. Such design pattern permitted to re-define the original method
and to use the weak implementation in the new function. A similar approach
was introduced in the framework of another arch-specific programmable
interface: mips_cm_phys_base() and __mips_cm_phys_base(). The only
difference is that the underscored method of the later couple was declared
in the "asm/mips-cm.h" header file, but it wasn't done for the CM L2-sync
methods in the subject. Due to the missing global function declaration
the "missing prototype" warning was spotted in the framework of the commit
9a2036724cd6 ("mips: mark local function static if possible") and fixed
just be re-qualifying the weak method as static. Doing that broke what was
originally implied by having the weak implementation globally defined.
Let's fix the broken CM2 L2-sync arch-interface by dropping the static
qualifier and, seeing the implemented pattern hasn't been used for over 10
years but will be required soon (see the link for the discussion around
it), converting it to a single weakly defined method:
mips_cm_l2sync_phys_base().
Fixes: 9a2036724cd6 ("mips: mark local function static if possible")
Link: https://lore.kernel.org/linux-mips/20240215171740.14550-3-fancer.lancer@gmail.com
Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
---
Changelog v2:
- Convert the underscored method to a single weakly defined function.
---
arch/mips/include/asm/mips-cm.h | 13 +++++++++++++
arch/mips/kernel/mips-cm.c | 5 +----
2 files changed, 14 insertions(+), 4 deletions(-)
Comments
Hi Arnd On Mon, Feb 26, 2024 at 12:04:06PM +0100, Arnd Bergmann wrote: > On Mon, Feb 26, 2024, at 11:54, Serge Semin wrote: > > The __mips_cm_l2sync_phys_base() and mips_cm_l2sync_phys_base() couple was > > introduced in commit 9f98f3dd0c51 ("MIPS: Add generic CM probe & access > > code") where the former method was a weak implementation of the later > > function. Such design pattern permitted to re-define the original method > > and to use the weak implementation in the new function. A similar approach > > was introduced in the framework of another arch-specific programmable > > interface: mips_cm_phys_base() and __mips_cm_phys_base(). The only > > difference is that the underscored method of the later couple was declared > > in the "asm/mips-cm.h" header file, but it wasn't done for the CM L2-sync > > methods in the subject. Due to the missing global function declaration > > the "missing prototype" warning was spotted in the framework of the commit > > 9a2036724cd6 ("mips: mark local function static if possible") and fixed > > just be re-qualifying the weak method as static. Doing that broke what was > > originally implied by having the weak implementation globally defined. > > > > Let's fix the broken CM2 L2-sync arch-interface by dropping the static > > qualifier and, seeing the implemented pattern hasn't been used for over 10 > > years but will be required soon (see the link for the discussion around > > it), converting it to a single weakly defined method: > > mips_cm_l2sync_phys_base(). > > > > Fixes: 9a2036724cd6 ("mips: mark local function static if possible") > > Link: > > https://lore.kernel.org/linux-mips/20240215171740.14550-3-fancer.lancer@gmail.com > > Signed-off-by: Serge Semin <fancer.lancer@gmail.com> > > I'm sorry I introduced the regression here, thanks for addressing it. No worries. I've noticed it in my local tree only. Neither CM nor CM L2-sync base address getters aren't currently re-defined in the mainline code. So the generic kernel code hasn't been affected. > > > -static phys_addr_t __mips_cm_l2sync_phys_base(void) > > +phys_addr_t __weak mips_cm_l2sync_phys_base(void) > > { > > u32 base_reg; > > > > @@ -217,9 +217,6 @@ static phys_addr_t __mips_cm_l2sync_phys_base(void) > > return mips_cm_phys_base() + MIPS_CM_GCR_SIZE; > > } > > > > -phys_addr_t mips_cm_l2sync_phys_base(void) > > - __attribute__((weak, alias("__mips_cm_l2sync_phys_base"))); > > - > > I generally have a bad feeling about weak functions, as they tend > to cause more problems than they solve, specifically with how they > hide what's going on, and how I still can't figure out what this > one aliases to. > > Since the resolution of the alias is all done at link time > anyway, could you just convert these to an #ifdef check > that documents exactly when each of the versions is used? Not sure I've completely understood what you meant. Do you suggest to add a mips_cm_l2sync_phys_base macro which would be defined if a "strong" version of the method is defined (and surround the underscored function by it)? Please note after this patch is applied no aliases will be left, but only a single weakly defined method: mips_cm_l2sync_phys_base() This is what we agreed to do with Thomas: https://lore.kernel.org/linux-mips/pf6cvzper4g5364nqhd4wd2pmlkyygoymobeqduulpslcjhyy6@kf66z7chjbl3 Thus there will be no need in the macro you suggest since the weak-version of the method will be discarded by the linker as it will have been replaced with the "strong" one. -Serge(y) > > Arnd
On Mon, Feb 26, 2024, at 12:27, Serge Semin wrote: > On Mon, Feb 26, 2024 at 12:04:06PM +0100, Arnd Bergmann wrote: >> On Mon, Feb 26, 2024, at 11:54, Serge Semin wrote: s to. >> >> Since the resolution of the alias is all done at link time >> anyway, could you just convert these to an #ifdef check >> that documents exactly when each of the versions is used? > > Not sure I've completely understood what you meant. Do you suggest to > add a mips_cm_l2sync_phys_base macro which would be defined if a > "strong" version of the method is defined (and surround the > underscored function by it)? > > Please note after this patch is applied no aliases will > be left, but only a single weakly defined method: > mips_cm_l2sync_phys_base() > This is what we agreed to do with Thomas: > https://lore.kernel.org/linux-mips/pf6cvzper4g5364nqhd4wd2pmlkyygoymobeqduulpslcjhyy6@kf66z7chjbl3 > Thus there will be no need in the macro you suggest since the > weak-version of the method will be discarded by the linker as it will > have been replaced with the "strong" one. I meant that instead of having both a weak and an optional strong version that get linked together, always define exactly one of the two, such as: #ifndef CONFIG_MIPS_CM_xxx static phys_addr_t mips_cm_l2sync_phys_base(void) { /* current implementation ... */ } #endif where CONFIG_MIPS_CM_xxx is the Kconfig symbol that decides whether the file with the strong version is built or not. This way you always get exactly one of the two versions of the function built, the local version can be inlined if the compiler thinks that is better, and the #ifdef documents exactly whether the function is used or not for a given configuration, rather than a reader having to track down how many other definitions exist and whether a config includes them. Arnd
On Mon, Feb 26, 2024 at 01:04:33PM +0100, Arnd Bergmann wrote: > On Mon, Feb 26, 2024, at 12:27, Serge Semin wrote: > > On Mon, Feb 26, 2024 at 12:04:06PM +0100, Arnd Bergmann wrote: > >> On Mon, Feb 26, 2024, at 11:54, Serge Semin wrote: > s to. > >> > >> Since the resolution of the alias is all done at link time > >> anyway, could you just convert these to an #ifdef check > >> that documents exactly when each of the versions is used? > > > > Not sure I've completely understood what you meant. Do you suggest to > > add a mips_cm_l2sync_phys_base macro which would be defined if a > > "strong" version of the method is defined (and surround the > > underscored function by it)? > > > > Please note after this patch is applied no aliases will > > be left, but only a single weakly defined method: > > mips_cm_l2sync_phys_base() > > This is what we agreed to do with Thomas: > > https://lore.kernel.org/linux-mips/pf6cvzper4g5364nqhd4wd2pmlkyygoymobeqduulpslcjhyy6@kf66z7chjbl3 > > Thus there will be no need in the macro you suggest since the > > weak-version of the method will be discarded by the linker as it will > > have been replaced with the "strong" one. > > I meant that instead of having both a weak and an optional strong > version that get linked together, always define exactly one of the > two, such as: > > #ifndef CONFIG_MIPS_CM_xxx > static phys_addr_t mips_cm_l2sync_phys_base(void) > { > /* current implementation ... */ > } > #endif > > where CONFIG_MIPS_CM_xxx is the Kconfig symbol that decides > whether the file with the strong version is built or not. > > This way you always get exactly one of the two versions > of the function built, the local version can be inlined > if the compiler thinks that is better, and the #ifdef > documents exactly whether the function is used or not > for a given configuration, rather than a reader having > to track down how many other definitions exist and whether > a config includes them. I see your point now. Thanks for clarification. IMO it would be less readable due to the ifdef-ery and the new config, and less maintainable due to the conditional compilation, but would provide a more performant solution since the compiler will be able to inline the singly used static method. Basically you suggest to emulate the weak implementation by an additional kernel config. Not sure whether it would be better than a well-known weak-attribute-based pattern. Anyway let's wait for the Thomas' opinion about your suggestion. If he thinks it would be better I'll update the patches. -Serge(y) > > Arnd
On Mon, Feb 26, 2024, at 13:20, Serge Semin wrote: > On Mon, Feb 26, 2024 at 01:04:33PM +0100, Arnd Bergmann wrote: >> On Mon, Feb 26, 2024, at 12:27, Serge Semin wrote: > I see your point now. Thanks for clarification. IMO it would be less > readable due to the ifdef-ery and the new config, and less > maintainable due to the conditional compilation, but would provide a > more performant solution since the compiler will be able to inline the > singly used static method. Basically you suggest to emulate the weak > implementation by an additional kernel config. I mean the kernel config that you already need here, since the strong version of the function is already optional. > Not sure whether it would be better than a well-known > weak-attribute-based pattern. Anyway let's wait for the > Thomas' opinion about your suggestion. If he thinks > it would be better I'll update the patches. Weak functions are not used all that much outside of a couple of parts of the kernel. There is a lot of them in drivers/pci/, a little bit in acpi and efi, and then a bit in arch/*/, though most of that is in mips. Ifdef checks in .c files are not great, but at least they are much more common than __weak functions and self-documenting. Arnd
On Mon, Feb 26, 2024 at 01:29:54PM +0100, Arnd Bergmann wrote: > On Mon, Feb 26, 2024, at 13:20, Serge Semin wrote: > > On Mon, Feb 26, 2024 at 01:04:33PM +0100, Arnd Bergmann wrote: > >> On Mon, Feb 26, 2024, at 12:27, Serge Semin wrote: > > > I see your point now. Thanks for clarification. IMO it would be less > > readable due to the ifdef-ery and the new config, and less > > maintainable due to the conditional compilation, but would provide a > > more performant solution since the compiler will be able to inline the > > singly used static method. Basically you suggest to emulate the weak > > implementation by an additional kernel config. > > I mean the kernel config that you already need here, since > the strong version of the function is already optional. Why would I need it if after this patch is applied the mips_cm_l2sync_phys_base() method will be converted to a global weak implementation? > > > Not sure whether it would be better than a well-known > > weak-attribute-based pattern. Anyway let's wait for the > > Thomas' opinion about your suggestion. If he thinks > > it would be better I'll update the patches. > > Weak functions are not used all that much outside of a > couple of parts of the kernel. There is a lot of them > in drivers/pci/, a little bit in acpi and efi, and > then a bit in arch/*/, though most of that is in mips. + a lot of them in kernel/*, some in mm/* .) > > Ifdef checks in .c files are not great, but at least they > are much more common than __weak functions and self-documenting. Ok. I don't have concretely strong opinion about what is better. Let's wait for what Thomas thinks about this. -Serge(y) > > Arnd
diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h index 23c67c0871b1..6cc79296c8ef 100644 --- a/arch/mips/include/asm/mips-cm.h +++ b/arch/mips/include/asm/mips-cm.h @@ -33,6 +33,19 @@ extern void __iomem *mips_cm_l2sync_base; */ extern phys_addr_t __mips_cm_phys_base(void); +/** + * mips_cm_l2sync_phys_base - retrieve the physical base address of the CM + * L2-sync region + * + * This function returns the physical base address of the Coherence Manager + * L2-cache only region. It provides a default implementation which reads the + * CMGCRL2OnlySyncBase register where available or returns a 4K region just + * behind the CM GCR base address. It may be overridden by platforms which + * determine this address in a different way by defining a function with the + * same prototype. + */ +extern phys_addr_t mips_cm_l2sync_phys_base(void); + /* * mips_cm_is64 - determine CM register width * diff --git a/arch/mips/kernel/mips-cm.c b/arch/mips/kernel/mips-cm.c index 84b3affb9de8..268ac0b811e3 100644 --- a/arch/mips/kernel/mips-cm.c +++ b/arch/mips/kernel/mips-cm.c @@ -201,7 +201,7 @@ phys_addr_t __mips_cm_phys_base(void) phys_addr_t mips_cm_phys_base(void) __attribute__((weak, alias("__mips_cm_phys_base"))); -static phys_addr_t __mips_cm_l2sync_phys_base(void) +phys_addr_t __weak mips_cm_l2sync_phys_base(void) { u32 base_reg; @@ -217,9 +217,6 @@ static phys_addr_t __mips_cm_l2sync_phys_base(void) return mips_cm_phys_base() + MIPS_CM_GCR_SIZE; } -phys_addr_t mips_cm_l2sync_phys_base(void) - __attribute__((weak, alias("__mips_cm_l2sync_phys_base"))); - static void mips_cm_probe_l2sync(void) { unsigned major_rev;