* Calling free_pages on part of the memory returned by get_free_pages?
@ 2008-04-21 21:12 Timur Tabi
2008-04-24 19:27 ` Andi Kleen
0 siblings, 1 reply; 4+ messages in thread
From: Timur Tabi @ 2008-04-21 21:12 UTC (permalink / raw)
To: lkml
According to LDD3, if I call get_free_pages() to allocate X bytes, I have to
free all of those pages with free_pages(). The VM internals are a little bit
over my head, but I looked at the code and I didn't see why that is a requirement.
For example, let's say I want to allocated 6MB of physically-contiguous memory.
If I call x = get_free_pages(11) to get 8MB. What happens if I then do
"free_pages(x + 6 * 1024 * 1024, 9)"?
I remember doing this on the 2.4 kernel, and it never gave me any problems.
--
Timur Tabi
Linux kernel developer at Freescale
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Calling free_pages on part of the memory returned by get_free_pages?
2008-04-21 21:12 Calling free_pages on part of the memory returned by get_free_pages? Timur Tabi
@ 2008-04-24 19:27 ` Andi Kleen
2008-04-24 19:32 ` Timur Tabi
2008-05-09 22:33 ` Timur Tabi
0 siblings, 2 replies; 4+ messages in thread
From: Andi Kleen @ 2008-04-24 19:27 UTC (permalink / raw)
To: Timur Tabi; +Cc: lkml
Timur Tabi <timur@freescale.com> writes:
> According to LDD3, if I call get_free_pages() to allocate X bytes, I have to
> free all of those pages with free_pages(). The VM internals are a little bit
> over my head, but I looked at the code and I didn't see why that is a requirement.
>
> For example, let's say I want to allocated 6MB of physically-contiguous memory.
> If I call x = get_free_pages(11) to get 8MB. What happens if I then do
> "free_pages(x + 6 * 1024 * 1024, 9)"?
>
> I remember doing this on the 2.4 kernel, and it never gave me any problems.
It is ok, as long as you don't use compound pages (__GFP_COMP) and call
split_page() to fix up the reference counts.
Also you do this to save memory right? The large system hash code does it too
and I used to do it in some 2.4 change with an alloc_pages_exact()
which never made it into 2.6.
If it's reasonably common we should re-add alloc/get_pages_exact() helper to
make this pattern clear and easier to use.
-Andi
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Calling free_pages on part of the memory returned by get_free_pages?
2008-04-24 19:27 ` Andi Kleen
@ 2008-04-24 19:32 ` Timur Tabi
2008-05-09 22:33 ` Timur Tabi
1 sibling, 0 replies; 4+ messages in thread
From: Timur Tabi @ 2008-04-24 19:32 UTC (permalink / raw)
To: Andi Kleen; +Cc: lkml
Andi Kleen wrote:
> It is ok, as long as you don't use compound pages (__GFP_COMP) and call
> split_page() to fix up the reference counts.
Thanks. I've never even heard of compound pages, so that's not a problem. I'll
look up split_page().
> Also you do this to save memory right?
Yes, I expect to allocate a 5MB chunk of memory, which means I'll be wasting 3MB
of physically-contiguous memory on an embedded system.
> The large system hash code does it too
Ah, I see that in alloc_large_system_hash(). Thanks
> If it's reasonably common we should re-add alloc/get_pages_exact() helper to
> make this pattern clear and easier to use.
I'd be in favor of that! I was planning on doing something like that anyway.
--
Timur Tabi
Linux kernel developer at Freescale
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Calling free_pages on part of the memory returned by get_free_pages?
2008-04-24 19:27 ` Andi Kleen
2008-04-24 19:32 ` Timur Tabi
@ 2008-05-09 22:33 ` Timur Tabi
1 sibling, 0 replies; 4+ messages in thread
From: Timur Tabi @ 2008-05-09 22:33 UTC (permalink / raw)
To: Andi Kleen; +Cc: lkml
Andi Kleen wrote:
> Timur Tabi <timur@freescale.com> writes:
>
>> According to LDD3, if I call get_free_pages() to allocate X bytes, I have to
>> free all of those pages with free_pages(). The VM internals are a little bit
>> over my head, but I looked at the code and I didn't see why that is a requirement.
>>
>> For example, let's say I want to allocated 6MB of physically-contiguous memory.
>> If I call x = get_free_pages(11) to get 8MB. What happens if I then do
>> "free_pages(x + 6 * 1024 * 1024, 9)"?
>>
>> I remember doing this on the 2.4 kernel, and it never gave me any problems.
>
> It is ok, as long as you don't use compound pages (__GFP_COMP) and call
> split_page() to fix up the reference counts.
>
> Also you do this to save memory right? The large system hash code does it too
> and I used to do it in some 2.4 change with an alloc_pages_exact()
> which never made it into 2.6.
>
> If it's reasonably common we should re-add alloc/get_pages_exact() helper to
> make this pattern clear and easier to use.
Follow-up question:
Say I allocate 8MB with __get_free_pages() and then use multiple free_pages() /
split_page() calls to free the last 3MB. Will the de-allocated blocks be merged
into larger-order chunks, if they're contiguous? That is, if I repeat this process:
1. Allocate 8MB
2. Free 3MB
3. Free 5MB
over and over again, will I totally fragment memory to the point that 8MB
allocates will never work again?
--
Timur Tabi
Linux kernel developer at Freescale
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2008-05-09 22:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-21 21:12 Calling free_pages on part of the memory returned by get_free_pages? Timur Tabi
2008-04-24 19:27 ` Andi Kleen
2008-04-24 19:32 ` Timur Tabi
2008-05-09 22:33 ` Timur Tabi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox