From mboxrd@z Thu Jan 1 00:00:00 1970 From: mina86@mina86.com (Michal Nazarewicz) Date: Thu, 31 Mar 2011 23:17:51 +0200 Subject: [PATCH 05/12] mm: alloc_contig_range() added In-Reply-To: <1301603322.31087.1196.camel@nimitz> References: <1301577368-16095-1-git-send-email-m.szyprowski@samsung.com> <1301577368-16095-6-git-send-email-m.szyprowski@samsung.com> <1301587361.31087.1040.camel@nimitz> <1301603322.31087.1196.camel@nimitz> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Thu, 31 Mar 2011 22:28:42 +0200, Dave Hansen wrote: > On Thu, 2011-03-31 at 18:26 +0200, Michal Nazarewicz wrote: >> > On Thu, 2011-03-31 at 15:16 +0200, Marek Szyprowski wrote: >> >> + ret = 0; >> >> + while (!PageBuddy(pfn_to_page(start & (~0UL << ret)))) >> >> + if (WARN_ON(++ret >= MAX_ORDER)) >> >> + return -EINVAL; >> >> On Thu, 31 Mar 2011 18:02:41 +0200, Dave Hansen wrote: >> > Holy cow, that's dense. Is there really no more straightforward way >> to >> > do that? >> >> Which part exactly is dense? What would be qualify as a more >> straightforward way? > > I'm still not 100% sure what it's trying to do. It looks like it > attempts to check all of "start"'s buddy pages. No. I'm going up through parents. This is because even though start falls in a free block (ie. one that page allocator tracks), the actual page that is in buddy system is larger then start and this loop looks for beginning of that page. > int order; > for (order = 0; order <= MAX_ORDER; order++) { > unsigned long buddy_pfn = find_buddy(start, order); > struct page *buddy = pfn_to_page(buddy_pfn); > if (PageBuddy(buddy) > break; > WARN(); > return -EINVAL; > } The WARN() and return would have to be outside of the loop and, as I described, instead of find_buddy() something like find_parent() would have to be used. > I'm wondering also if you can share some code with __rmqueue(). Doubtful since start does not (have to) point to a page that is tracked by page allocator but a page inside such a page. -- Best regards, _ _ .o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o ..o | Computer Science, Michal "mina86" Nazarewicz (o o) ooo +----------ooO--(_)--Ooo--