2005-02-01 03:30:28

by Paulo Marques

[permalink] [raw]
Subject: [PATCH 2.6] 1/7 create kstrdup library function


This patch creates the kstrdup library function so that it doesn't have to be
reimplemented (or even EXPORT'ed) by every user that needs it.

Signed-off-by: Paulo Marques <[email protected]>

--
Paulo Marques - http://www.grupopie.com

All that is necessary for the triumph of evil is that good men do nothing.
Edmund Burke (1729 - 1797)


Attachments:
patch1 (1.20 kB)

2005-02-01 16:52:17

by Pekka Enberg

[permalink] [raw]
Subject: Re: [PATCH 2.6] 1/7 create kstrdup library function

Hi,

On Tue, 1 Feb 2005 03:28:21 +0000, [email protected]
<[email protected]> wrote:
>
> This patch creates the kstrdup library function so that it doesn't have to be
> reimplemented (or even EXPORT'ed) by every user that needs it.
>
> Signed-off-by: Paulo Marques <[email protected]>
>
> diff -buprN -X dontdiff vanilla-2.6.11-rc2-bk9/lib/string.c linux-2.6.11-rc2-bk9/lib/string.c
> --- vanilla-2.6.11-rc2-bk9/lib/string.c 2005-01-31 20:05:37.000000000 +0000
> +++ linux-2.6.11-rc2-bk9/lib/string.c 2005-01-31 20:00:31.000000000 +0000
> @@ -599,3 +599,23 @@ void *memchr(const void *s, int c, size_
> }
> EXPORT_SYMBOL(memchr);
> #endif
> +
> +/*
> + * kstrdup - allocate space for and copy an existing string
> + *
> + * @s: the string to duplicate
> + * @gfp: the GFP mask used in the kmalloc() call when allocating memory
> + */
> +char *kstrdup(const char *s, int gfp)
> +{
> + int len;
> + char *buf;
> +
> + if (!s) return NULL;
> +
> + len = strlen(s) + 1;
> + buf = kmalloc(len, gfp);
> + if (buf)
> + memcpy(buf, s, len);
> + return buf;
> +}
> +
> +EXPORT_SYMBOL(kstrdup);

kstrdup() is a special-case _memory allocator_ (not so much a string
operation) so I think it should go into mm/slab.c where we currently
have kcalloc().

P.S. Please inline patches to your email as per
Documentation/SubmittingPatches. I, for one, have trouble with
attachments.

Pekka

2005-02-01 17:03:26

by Paulo Marques

[permalink] [raw]
Subject: Re: [PATCH 2.6] 1/7 create kstrdup library function

Pekka Enberg wrote:
> [...]
>
> kstrdup() is a special-case _memory allocator_ (not so much a string
> operation) so I think it should go into mm/slab.c where we currently
> have kcalloc().

I was following Rusty Russell's approach. Also, I believe this is more
intuitive because the standard libc strdup function is declared in string.h.

However, I really don't have strong feelings either way, so if the
majority agrees that this should be in mm/slab, its fine by me.

> P.S. Please inline patches to your email as per
> Documentation/SubmittingPatches. I, for one, have trouble with
> attachments.

Unfortunately my email client messes up inline patches and wordwraps /
mangles white space, so I resort to attaching them until I have time to
look into fixing that :(

--
Paulo Marques - http://www.grupopie.com

All that is necessary for the triumph of evil is that good men do nothing.
Edmund Burke (1729 - 1797)

2005-02-02 07:23:51

by Pekka Enberg

[permalink] [raw]
Subject: Re: [PATCH 2.6] 1/7 create kstrdup library function

At some point in time, I wrote:
> > kstrdup() is a special-case _memory allocator_ (not so much a string
> > operation) so I think it should go into mm/slab.c where we currently
> > have kcalloc().

On Tue, 01 Feb 2005 17:00:17 +0000, Paulo Marques <[email protected]> wrote:
> I was following Rusty Russell's approach. Also, I believe this is more
> intuitive because the standard libc strdup function is declared in string.h.
>
> However, I really don't have strong feelings either way, so if the
> majority agrees that this should be in mm/slab, its fine by me.

Intuitive, perhaps, but I think it's wrong. I don't like it because it
makes string operations depend on slab. Furthermore, kstrdup() is not
a string operation. It is about memory allocation, really, just like
kcalloc().

One possible way to clean this up would be to extract the
standard-like allocators (kmalloc, kcalloc, and kstrdup) from
mm/slab.c and move them into a separate file.

Pekka

2005-02-02 12:17:51

by Paulo Marques

[permalink] [raw]
Subject: Re: [PATCH 2.6] 1/7 create kstrdup library function

Pekka Enberg wrote:
> At some point in time, I wrote:
>
>>>kstrdup() is a special-case _memory allocator_ (not so much a string
>>>operation) so I think it should go into mm/slab.c where we currently
>>>have kcalloc().
>
>
> On Tue, 01 Feb 2005 17:00:17 +0000, Paulo Marques <[email protected]> wrote:
>
>>I was following Rusty Russell's approach. Also, I believe this is more
>>intuitive because the standard libc strdup function is declared in string.h.
>>
>>However, I really don't have strong feelings either way, so if the
>>majority agrees that this should be in mm/slab, its fine by me.
>
>
> Intuitive, perhaps, but I think it's wrong. I don't like it because it
> makes string operations depend on slab. Furthermore, kstrdup() is not
> a string operation. It is about memory allocation, really, just like
> kcalloc().

I agree with the "is like kcalloc" argument in the sense that it does an
allocation + something else. But in this case the "something else" is in
fact a string operation, so this just seem to be in the middle.

> One possible way to clean this up would be to extract the
> standard-like allocators (kmalloc, kcalloc, and kstrdup) from
> mm/slab.c and move them into a separate file.

I don't like this approach. From a quick grep you get 4972 kmalloc's in
.c files in the kernel tree and only 35 kstrdup's. Moving kstrdup around
is still just 7 patches, kmalloc is a much bigger problem.

Anyway, as I said before, if more people believe that moving kstrdup
into mm/slab.c is the way to go, then its fine by me. The problem I was
trying to solve was having several versions of strdup-like functions all
around the kernel, and this problem gets fixed either way. Right now,
the poll goes something like this:

string.c: me, Rusty Russell
slab.c: Pekka Enberg

I think we need more votes :)

--
Paulo Marques - http://www.grupopie.com

All that is necessary for the triumph of evil is that good men do nothing.
Edmund Burke (1729 - 1797)

2005-02-02 12:29:54

by Pekka Enberg

[permalink] [raw]
Subject: Re: 1/7 create kstrdup library function

Paulo Marques writes:
> I agree with the "is like kcalloc" argument in the sense that it does an
> allocation + something else. But in this case the "something else" is in
> fact a string operation, so this just seem to be in the middle.

Sure, but now you're forcing all users of <string.h> to depend on the slab
as well. Conceptually, kstrdup() is an initializing memory allocator, not a
string operation, which is why I think it should go into slab.c.

Paulo Marques writes:
> I don't like this approach. From a quick grep you get 4972 kmalloc's in .c
> files in the kernel tree and only 35 kstrdup's. Moving kstrdup around is
> still just 7 patches, kmalloc is a much bigger problem.

Hmm? Yes, moving the declaration from slab.h to some other header is
painful. I only talked about moving the definition from slab.c.

Paulo Marques writes:
> Anyway, as I said before, if more people believe that moving kstrdup into
> mm/slab.c is the way to go, then its fine by me. The problem I was trying
> to solve was having several versions of strdup-like functions all around
> the kernel, and this problem gets fixed either way. Right now, the poll
> goes something like this:
>
> string.c: me, Rusty Russell
> slab.c: Pekka Enberg
>
> I think we need more votes :)

Could we also get Rusty's confirmation on this?

Pekka