Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 21 May 2023 22:58:45 +0100
From:      Jessica Clarke <jrtc27@freebsd.org>
To:        Hans Petter Selasky <hselasky@freebsd.org>
Cc:        "src-committers@freebsd.org" <src-committers@FreeBSD.org>, "dev-commits-src-all@freebsd.org" <dev-commits-src-all@FreeBSD.org>, "dev-commits-src-main@freebsd.org" <dev-commits-src-main@FreeBSD.org>
Subject:   Re: git: 805d759338a2 - main - mlx4: Move DEFINE_MUTEX() outside function body.
Message-ID:  <A66F073E-06F4-4A91-82F3-01467D7A65BC@freebsd.org>
In-Reply-To: <ac11ff8e-eeb9-a7e6-28d3-da5c9fad6567@freebsd.org>
References:  <202305211621.34LGLsup059861@gitrepo.freebsd.org> <54EF67D8-2A79-4EAB-8EFB-232F14FFE792@freebsd.org> <21c9532e-4ca7-a7fe-1ff6-07a94cbad6ab@freebsd.org> <3066464F-E4C6-4B84-ADFF-E578AFAFE622@freebsd.org> <e802dfc0-0a16-add1-cf5d-a8811b3bd3e6@freebsd.org> <26465813-3B51-4E52-9E9D-F93A0F2AF6BD@freebsd.org> <ffb3f6ea-ef74-ebe3-884d-da567defd2e6@freebsd.org> <2BF2F7CF-82E6-4D98-800D-C35D7C29E948@freebsd.org> <ac11ff8e-eeb9-a7e6-28d3-da5c9fad6567@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 21 May 2023, at 22:37, Hans Petter Selasky <hselasky@freebsd.org> =
wrote:
>=20
> On 5/21/23 21:41, Jessica Clarke wrote:
>>> One difference between Linux and FreeBSD when doing the monotolithic =
kernel build: FreeBSD puts all object files resulting from compilation =
into the same object directory. This implies there cannot be two object =
files sharing the same name as a result of compilation. This in turn =
implies all source file names are unique across the whole of "sys/*", =
because converting a source file name into the corresponding object file =
name, is simply done by changing the suffix of the file in question.
>=20
> Hi Jess,
>=20
>> I am aware of all of this. Please do not talk to me like I am an =
idiot. Your tone here is extremely patronising.
>=20
> I can not know what you know before you tell me. I'm not a mind reader =
and I for sure don't think you are an idiot. Those are in such case your =
own words about yourself and not mine, to make it clear.

You can=E2=80=99t know, though you could go look at commit history to =
see that I have made changes to the build system and thus probably have =
an understanding. Or you could assume that I know what I=E2=80=99m =
talking about when I choose to engage. Both are good things to do that =
show some amount of respect, otherwise you are at risk of insulting =
people by assuming that you need to explain the basics to them.

>>> If you are worried multiple DEFINE_MUTEX(lock) will result in =
multiple global symbols having the same "lock" name, all you need to do =
is pass through the ${.TARGET} variable from "make" as a define, =
stripping a few invalid characters, and macro-concat that to the locally =
generated global variable name, and you are all good.
>=20
>> You could. But that=E2=80=99s a pretty gross hack IMO, and depending =
on how you do it may still not be unique. Not to mention it=E2=80=99s =
going to further bloat the symbol tables with these long names.
>=20
> Why do you think I don't know what a hack is?

I didn=E2=80=99t. I said =E2=80=9CIMO=E2=80=9D. *My* opinion.

> In the case about the "lock" name being global:
>=20
> - My solution is to pass a define to the compiler to help make the =
identifier unique across the monotolithic kernel build.
>=20
> - When building the LINT target, the linker will fail if there are =
duplicate global symbols. Then the debug information output by the =
linker will tell the file and line. Go there and change the identifier. =
It should be rare. Problem solved.
>=20
> - All symbols being made global for the sake of processing them, are =
listed by name. And after the final sorted sysinit table is created and =
linked, all those symbol names can be stripped away from the resulting =
binary, and then only the relocations remain, if I'm not mistaken. I =
didn't do that in my differential review, because it is a prototype. The =
argument about symbol table bloat, because of prefixing or suffixing =
global symbols is not valid the way I see it.
>=20
>> Given the sysinit subsystem still needs to be able to merge in new =
sysinits registered dynamically, one might as well just do the sort =
dynamically, it=E2=80=99s very little added complexity on top, =
especially when sorting functions are just a libkern call away. Much =
less complexity than all this scripting to generate tables.
>=20
> Do you agree about the following statement or not?
>=20
> If you have two already sorted lists and a pointer to each of them, =
then:
>=20
> Method a) place the two lists after each other in memory and then call =
qsort() on the resulting list, is relatively slow.
>=20
> Method b) look at the next element from each list, and store the =
smallest one into the destination list, and repeat until the end of both =
source lists are reached, is relatively much faster.

Clearly merging is faster. But compared with qsort it=E2=80=99s unlikely =
to be all that significant; lg n grows slowly.

>>> Your comment is correct based on your prior knowledge about Linux =
and compilers. But at this point FreeBSD is different. That's why =
porting code from Linux to FreeBSD is sometimes difficult, because you =
need to keep track of how source files are renamed. You cannot just use =
"meld Linux/blah FreeBSD/blah" to compare directories ...
>> DEFINE_MUTEX is Linux=E2=80=99s API, implemented in LinuxKPI. So =
Linux=E2=80=99s behaviour is absolutely relevant. Any deviation from =
Linux=E2=80=99s semantics is an incompatibility that requires patching =
any sources that are built for FreeBSD using LinuxKPI. It is generally =
best to minimise that.
>=20
> One side of this is compile time issues. If a developer needs to =
change something to make the code compile for FreeBSD, that's =
acceptable. And then the developer can also say the code was made for =
FreeBSD and not Linux, which is good with regards to the GPLv2 license, =
and not just copying solutions from Linux or being force to implement =
things exactly like on Linux, so-called bug-by-bug compliance.
>=20
> The other side is runtime issues. Here the goal should be to minimise =
issues to zero and try to outperform Linux.

I don=E2=80=99t have any clue what you=E2=80=99re going on about here. =
Tweaking Linux code to be compatible with FreeBSD=E2=80=99s LinuxKPI =
doesn=E2=80=99t suddenly render the code free from GPLv2, it=E2=80=99s =
still Linux-derived code, but you=E2=80=99ve had to modify it rather =
than be able to use it as-is, which is the goal of LinuxKPI, where =
possible. And so ideally *no* changes would be acceptable. So I disagree =
with your statement that needing to change things is acceptable; it=E2=80=99=
s only acceptable where there is no good alternative.

I don=E2=80=99t see what =E2=80=9Coutperform Linux=E2=80=9D has to do =
with any of this discussion.

>> So, once again, I am asking you to revert your change.
>=20
> I still cannot see why this change should be reverted.

Because it serves no purpose today, and should always remain valid code, =
because Linux=E2=80=99s API makes that valid, and thus LinuxKPI should =
ensure it=E2=80=99s valid too. If the change is required then LinuxKPI's =
compatibility has been broken, which is a regression that should not be =
permitted. Therefore it is totally unnecessary, and if anything is worse =
because it unnecessarily increases the scope of a variable that is only =
needed within a single function.

> Does the following code example and compiler warning explain why this =
change should remain:
>=20
> # cat << EOF > test.c
> int
> main()
> {
>        extern char string[];
>        char string[] =3D { "test" };
>=20
>        return (0);
> }
> EOF
>=20
> # cc -O2 -Wall test.c
> test.c:11:7: error: non-extern declaration of 'string' follows extern =
declaration
>        char string[] =3D { "test" };
>             ^
> test.c:10:14: note: previous declaration is here
>        extern char string[];
>=20
>=20
>=20
> Like my commit message says, you cannot declare global variables on =
the stack. When variables are on the stack, they are inside a function =
body. There is no stack outside any C-functions. It's just another way =
to say it and what is the problem about that?

I understood what you were *actually* trying to achieve with the change =
from your first reply. I have never disputed that. What I disputed was =
your commit message, which at best is extremely misleading and at worst =
makes no sense, and the necessity of the change. But this case should =
not be hit here, because if it is then you=E2=80=99ve broken LinuxKPI.

Please revert the commit. It should never be necessary. I=E2=80=99m not =
going to ask a fourth time.

Jess




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?A66F073E-06F4-4A91-82F3-01467D7A65BC>