From: Peter Zijlstra <peterz@infradead.org>
To: Rik van Riel <riel@redhat.com>
Cc: linux-mm@kvack.org, akpm@linux-foundation.org,
aarcange@redhat.com, minchan@gmail.com,
kosaki.motohiro@gmail.com, andi@firstfloor.org,
hannes@cmpxchg.org, mel@csn.ul.ie, linux-kernel@vger.kernel.org,
Rik van Riel <riel@surriel.com>
Subject: Re: [PATCH -mm 2/7] mm: get unmapped area from VMA tree
Date: Thu, 21 Jun 2012 23:06:05 +0200 [thread overview]
Message-ID: <1340312765.18025.40.camel@twins> (raw)
In-Reply-To: <1340057126-31143-3-git-send-email-riel@redhat.com>
On Mon, 2012-06-18 at 18:05 -0400, Rik van Riel wrote:
> + /* Find the left-most free area of sufficient size. */
Just because there's nothing better than writing it yourself.. I tried
writing something that does the above. The below is the result, it
doesn't use your uncle functions and is clearly limited to two
traversals and thus trivially still O(log n). [ although I think with a
bit of effort you can prove the same for your version ].
---
static inline struct vm_area_struct *vma_of(struct rb_node *node)
{
return container_of(node, struct vm_area_struct, vm_rb);
}
static inline unsigned long max_gap_of(struct rb_node *node)
{
return vma_of(node)->free_gap;
}
static unsigned long gap_of(struct rb_node *node)
{
struct vm_area_struct *vma = vma_of(node);
if (!vma->vm_prev)
return vma->vm_start;
return vma->vm_start - vma->vm_prev->vm_end;
}
static bool node_better(struct rb_node *node, struct rb_node *best)
{
if (!best)
return true;
return vma_of(node)->vm_start < vma_of(best)->vm_start;
}
unsigned long find_leftmost_gap(struct mm_struct *mm, unsigned long len)
{
struct rb_node *node = mm->mm_rb.rb_node, *best = NULL, *tree = NULL;
/*
* Do a search for TASK_UNMAPPED_BASE + len, all nodes right of this
* boundary should be considered. Path nodes are immediate candidates,
* their right sub-tree is stored for later consideration in case
* the immediate path doesn't yield a suitable node.
*/
while (node) {
if (vma_of(node)->vm_start - len >= TASK_UNMAPPED_BASE) {
/*
* If our node has a big enough hole, track it.
*/
if (gap_of(node) > len && node_better(node, best))
best = node;
/*
* In case we flunk out on the path nodes, keep track
* of the right sub-trees which have big enough holes.
*/
if (node->rb_right && max_gap_of(node-rb_right) >= len &&
node_better(node->rb_right, tree))
tree = node->rb_right;
node = node->rb_left;
continue;
}
node = node->rb_right;
}
if (best)
return vma_of(best)->vm_start - len;
/*
* Our stored subtree must be entirely right of TASK_UNMAPPED_BASE + len
* so do a simple search for leftmost hole of appropriate size.
*/
while (tree) {
if (gap_of(tree) >= len && node_better(tree, best))
best = tree;
if (tree->rb_left && max_gap_of(tree->rb_left) >= len) {
tree = tree->rb_left;
continue;
}
tree = tree->rb_right;
}
if (best)
return vma_of(best)->vm_start - len;
/*
* Ok, so no path node, nor right sub-tree had a properly sized hole
* we could use, use the rightmost address in the tree.
*/
node = mm->mm_rb.rb_node;
while (node && node->rb_right)
node = node->rb_right;
return max(vma_of(node)->vm_end, TASK_UNMAPPED_BASE);
}
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-06-21 21:06 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-18 22:05 [PATCH -mm 0/7] mm: scalable and unified arch_get_unmapped_area Rik van Riel
2012-06-18 22:05 ` [PATCH -mm 1/7] mm: track free size between VMAs in VMA rbtree Rik van Riel
2012-06-19 23:25 ` Andrew Morton
2012-06-21 11:01 ` Peter Zijlstra
2012-06-21 11:07 ` Peter Zijlstra
2012-06-21 14:47 ` Mel Gorman
2012-06-18 22:05 ` [PATCH -mm 2/7] mm: get unmapped area from VMA tree Rik van Riel
2012-06-21 9:01 ` Johannes Weiner
2012-06-21 13:17 ` Rik van Riel
2012-06-21 16:50 ` Rik van Riel
2012-06-21 16:16 ` Mel Gorman
2012-06-21 17:27 ` Rik van Riel
2012-06-21 21:06 ` Peter Zijlstra [this message]
2012-06-18 22:05 ` [PATCH -mm 3/7] Allow each architecture to specify the address range that can be used for this allocation Rik van Riel
2012-06-18 22:05 ` [PATCH -mm 4/7] mm: make page colouring code generic Rik van Riel
2012-06-19 23:27 ` Andrew Morton
2012-06-21 17:52 ` Rik van Riel
2012-06-21 19:22 ` Borislav Petkov
2012-06-21 11:20 ` Peter Zijlstra
2012-06-21 14:30 ` Rik van Riel
2012-06-21 17:40 ` Andrew Morton
2012-06-21 17:45 ` Rik van Riel
2012-06-21 12:37 ` Borislav Petkov
2012-06-21 13:24 ` Rik van Riel
2012-06-18 22:05 ` [PATCH -mm 5/7] mm: remove x86 arch_get_unmapped_area(_topdown) Rik van Riel
2012-06-18 22:05 ` [PATCH -mm 6/7] remove MIPS arch_get_unmapped_area code Rik van Riel
2012-06-18 22:05 ` [PATCH -mm 7/7] remove ARM arch_get_unmapped_area functions Rik van Riel
2012-06-19 23:20 ` [PATCH -mm 0/7] mm: scalable and unified arch_get_unmapped_area Andrew Morton
2012-06-21 10:18 ` Johannes Weiner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1340312765.18025.40.camel@twins \
--to=peterz@infradead.org \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=hannes@cmpxchg.org \
--cc=kosaki.motohiro@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mel@csn.ul.ie \
--cc=minchan@gmail.com \
--cc=riel@redhat.com \
--cc=riel@surriel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).