2005-01-06 03:20:59

by Zhonglin Zhang

[permalink] [raw]
Subject: a little improvement for vmalloc

Hello,

In FUNCTION __vmalloc ,

There is a statement;

if (!size || (size >> PAGE_SHIFT) > num_physpages)
return NULL;

I think the condition (num_phypages >>PAGE_SHIFT) > num_physpages
is not very accurate. As we all know, linux kernel and other stuff
occupy some memory,so it is better to express like below, I think.

if (!size || size > max_vmalloc_size)
return NULL;

max_vmalloc_size = (num_physpages >> PAGE_SHIFT) - kernel_size
-reserved_space_for_emergence_use


BTW, I would like to know whether there are reserved physical memory for
emergence use.

Thanks in advance!

Milo



2005-01-06 03:38:54

by Andrew Morton

[permalink] [raw]
Subject: Re: a little improvement for vmalloc

Zhonglin Zhang <[email protected]> wrote:
>
> In FUNCTION __vmalloc ,
>
> There is a statement;
>
> if (!size || (size >> PAGE_SHIFT) > num_physpages)
> return NULL;

Probably the second part of the test should be removed. If the requested
area size is

a) less than the size of the vmalloc arena and

b) more than the number of allocatable pages

then yes, the machine will have a ton of trouble allocating the memory and
will actually lock up.

But the only way that will happen is if some code is made to do a large
number of smaller vmallocs. Nobody does a huge single vmalloc like that.

2005-01-06 09:26:56

by Anton Altaparmakov

[permalink] [raw]
Subject: Re: a little improvement for vmalloc

On Wed, 2005-01-05 at 19:38 -0800, Andrew Morton wrote:
> Zhonglin Zhang <[email protected]> wrote:
> >
> > In FUNCTION __vmalloc ,
> >
> > There is a statement;
> >
> > if (!size || (size >> PAGE_SHIFT) > num_physpages)
> > return NULL;
>
> Probably the second part of the test should be removed. If the requested
> area size is
>
> a) less than the size of the vmalloc arena and
>
> b) more than the number of allocatable pages
>
> then yes, the machine will have a ton of trouble allocating the memory and
> will actually lock up.
>
> But the only way that will happen is if some code is made to do a large
> number of smaller vmallocs. Nobody does a huge single vmalloc like that.

I thought that second test was to avoid stupid bugs that may exist in
some random (perhaps ex-tree) modules that would otherwise cause the
machine to lockup...

Best regards,

Anton
--
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
Unix Support, Computing Service, University of Cambridge, CB2 3QH, UK
Linux NTFS maintainer / IRC: #ntfs on irc.freenode.net
WWW: http://linux-ntfs.sf.net/ & http://www-stu.christs.cam.ac.uk/~aia21/