Re: [PATCHv2] mm: do not export const kfree and kstrdup variants

From: Christophe JAILLET
Date: Tue Sep 24 2024 - 15:46:25 EST


Le 24/09/2024 à 09:02, Christoph Hellwig a écrit :
On Tue, Sep 24, 2024 at 03:56:53PM +0900, Sergey Senozhatsky wrote:
Totally agree with all the points, I haven't looked at how
popular that API was before sending out the patch. Is there
some sort of "built time const" but for strings that we, perhaps,
can add to kfree_const() (and make kfree_const() always inline)?
So that we can turn this

str = "boom";
...
kfree_const(str);

into a safe scenario for modules.

Not sure, but even then the API would be horrible as it still would
not work for constants in other modules than the one calling it.



So, the best is to audit, at least code that can be built as a module for str = "boom" pattern, and fix relevant places?


Or, considering that these these _const() versions are only there to save a few bytes of memory, wonder if it really worth it?

In other word:
1) apply something like the patch below
2) remove the API


At a minimum, I think that devm_kstrdup_const() could be removed.

CJ


diff --git a/mm/util.c b/mm/util.c
index 4f1275023eb7..fd5e98fb6362 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -39,8 +39,7 @@
*/
void kfree_const(const void *x)
{
- if (!is_kernel_rodata((unsigned long)x))
- kfree(x);
+ kfree(x);
}
EXPORT_SYMBOL(kfree_const);

@@ -81,9 +80,6 @@ EXPORT_SYMBOL(kstrdup);
*/
const char *kstrdup_const(const char *s, gfp_t gfp)
{
- if (is_kernel_rodata((unsigned long)s))
- return s;
-
return kstrdup(s, gfp);
}
EXPORT_SYMBOL(kstrdup_const);