|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 26/62] xen: introduce rangeset_claim_range
Reserve a hole in a rangeset.
Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxx>
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
Changes since v1:
- Change function name.
- Use a local variable instead of *s.
- Add unlikely to the !prev case.
- Move the function prototype position in the header file.
---
xen/common/rangeset.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++
xen/include/xen/rangeset.h | 4 +++-
2 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/xen/common/rangeset.c b/xen/common/rangeset.c
index 6c6293c15c..ade34f6a50 100644
--- a/xen/common/rangeset.c
+++ b/xen/common/rangeset.c
@@ -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)
{
diff --git a/xen/include/xen/rangeset.h b/xen/include/xen/rangeset.h
index aa6408248b..1f83b1f44b 100644
--- a/xen/include/xen/rangeset.h
+++ b/xen/include/xen/rangeset.h
@@ -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(
--
2.11.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |