mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen: introduce rangeset_claim_range
Reserve a hole in a rangeset. Signed-off-by: Roger Pau Monne <roger.pau@citrix.com> Signed-off-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
5cf4b4617d
commit
770e5c7f62
2 files changed
+55
-1
No files matched your search
@@ -298,6 +298,58 @@ int rangeset_report_ranges(
|
||||
return rc;
|
||||
}
|
||||
|
||||
int rangeset_claim_range(struct rangeset *r, unsigned long size,
|
||||
unsigned long *s)
|
||||
{
|
||||
struct range *prev, *next;
|
||||
unsigned long start = 0;
|
||||
|
||||
write_lock(&r->lock);
|
||||
|
||||
for ( prev = NULL, next = first_range(r);
|
||||
next;
|
||||
prev = next, next = next_range(r, next) )
|
||||
{
|
||||
if ( (next->s - start) >= size )
|
||||
goto insert;
|
||||
|
||||
if ( next->e == ~0UL )
|
||||
goto out;
|
||||
|
||||
start = next->e + 1;
|
||||
}
|
||||
|
||||
if ( (~0UL - start) + 1 >= size )
|
||||
goto insert;
|
||||
|
||||
out:
|
||||
write_unlock(&r->lock);
|
||||
return -ENOSPC;
|
||||
|
||||
insert:
|
||||
if ( unlikely(!prev) )
|
||||
{
|
||||
next = alloc_range(r);
|
||||
if ( !next )
|
||||
{
|
||||
write_unlock(&r->lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
next->s = start;
|
||||
next->e = start + size - 1;
|
||||
insert_range(r, prev, next);
|
||||
}
|
||||
else
|
||||
prev->e += size;
|
||||
|
||||
write_unlock(&r->lock);
|
||||
|
||||
*s = start;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rangeset_add_singleton(
|
||||
struct rangeset *r, unsigned long s)
|
||||
{
|
||||
|
||||
@@ -55,9 +55,11 @@ void rangeset_limit(
|
||||
bool_t __must_check rangeset_is_empty(
|
||||
const struct rangeset *r);
|
||||
|
||||
/* Add/remove/query a numeric range. */
|
||||
/* Add/claim/remove/query a numeric range. */
|
||||
int __must_check rangeset_add_range(
|
||||
struct rangeset *r, unsigned long s, unsigned long e);
|
||||
int __must_check rangeset_claim_range(struct rangeset *r, unsigned long size,
|
||||
unsigned long *s);
|
||||
int __must_check rangeset_remove_range(
|
||||
struct rangeset *r, unsigned long s, unsigned long e);
|
||||
bool_t __must_check rangeset_contains_range(
|
||||
|
||||