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:
Wei Liu committed 2018-01-16 18:34:04 +00:00
1 parent 5cf4b4617d
commit 770e5c7f62
2 files changed
+55 -1

No files matched your search

+52
View File
@@ -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)
{
+3 -1
View File
@@ -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(
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.