<br><br><div class="gmail_quote">On Sat, Aug 18, 2012 at 9:06 PM, Parmenides <span dir="ltr">&lt;<a href="mailto:mobile.parmenides@gmail.com" target="_blank">mobile.parmenides@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
    I have a question about the reseved page frames in a zone. The<br>
physical memory is splitted into some node, which is  further divied<br>
into some zone. For each zone, the kernel try to reserve some page<br>
frames to statisfy requests on low memory condition. There is a<br>
lowmem_reserve[] in a zone descriptor, its defined like:<br>
<br>
     struct zone {<br>
                    ....<br>
                    unsigned long lowmem_reserve[MAX_NR_ZONES];<br>
                    ...<br>
     };<br>
<br>
It is obvious that lowmem_reserve[] contains MAX_NR_ZONES elements.<br></blockquote><div><br></div><div>for mem, MAX_NR_ZONES is 4, which therefore mean 4 zone exists, and for each zone there is a lowmem_reserve value, make sense?</div>
<div><br></div><div>The function:    setup_per_zone_lowmem_reserve(void) will setup the value, which is user-definable via a sysctl called &quot;lowmem_reserve_ratio&quot;.</div><div><br></div><div><div>cat /proc/sys/vm/lowmem_reserve_ratio </div>
<div>256<span class="Apple-tab-span" style="white-space:pre">        </span>256<span class="Apple-tab-span" style="white-space:pre">        </span>32</div></div><div><br></div><div>and read the source code for explanation:</div><div><br>
</div><div>mm/page_alloc.c:</div><div><br></div><div><div>/*</div><div> * results with 256, 32 in the lowmem_reserve sysctl:</div><div> *      1G machine -&gt; (16M dma, 800M-16M normal, 1G-800M high)</div><div> *      1G machine -&gt; (16M dma, 784M normal, 224M high)</div>
<div> *      NORMAL allocation will leave 784M/256 of ram reserved in the ZONE_DMA</div><div> *      HIGHMEM allocation will leave 224M/32 of ram reserved in ZONE_NORMAL</div><div> *      HIGHMEM allocation will (224M+784M)/256 of ram reserved in ZONE_DMA</div>
<div> *</div><div> * TBD: should special case ZONE_DMA32 machines here - in those we normally</div><div> * don&#39;t need any ZONE_NORMAL reservation</div><div> */</div><div>int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = {</div>
</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
But, I think just a interger is enough to record the number of  a<br>
zone&#39;s reserved page frames. Why do we have to use a<br>
array?</blockquote><div><br></div><div>for each zone, and the zone name is defined in mm/page_alloc.c as well.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Furthermore, lowmem_reserve[] merely stand for the amount. How<br>
does the kernel mark a page frame to be reserved?<br>
<br></blockquote><div>API is SetPageReserved(page), and queried with PageReserved(page) etc.</div><div> </div><div>This API will use just one bit to store the reservation information for one page.   </div><div><br></div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Regards,<br>Peter Teoh<br>