Introduce rangeset_subtract() to remove regions in r2 from r1. Signed-off-by: Stewart Hildebrand <stewart.hildebr...@amd.com> --- v1->v2: * no change --- xen/common/rangeset.c | 12 ++++++++++++ xen/include/xen/rangeset.h | 3 +++ 2 files changed, 15 insertions(+)
diff --git a/xen/common/rangeset.c b/xen/common/rangeset.c index e75871039087..b9e8912fb1c3 100644 --- a/xen/common/rangeset.c +++ b/xen/common/rangeset.c @@ -397,6 +397,18 @@ int rangeset_merge(struct rangeset *r1, struct rangeset *r2) return rangeset_report_ranges(r2, 0, ~0UL, merge, r1); } +static int cf_check subtract(unsigned long s, unsigned long e, void *data) +{ + struct rangeset *r = data; + + return rangeset_remove_range(r, s, e); +} + +int rangeset_subtract(struct rangeset *r1, struct rangeset *r2) +{ + return rangeset_report_ranges(r2, 0, ~0UL, subtract, r1); +} + 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 96c918082501..817505badf6f 100644 --- a/xen/include/xen/rangeset.h +++ b/xen/include/xen/rangeset.h @@ -85,6 +85,9 @@ int rangeset_consume_ranges(struct rangeset *r, /* Merge rangeset r2 into rangeset r1. */ int __must_check rangeset_merge(struct rangeset *r1, struct rangeset *r2); +/* Subtract rangeset r2 from rangeset r1. */ +int __must_check rangeset_subtract(struct rangeset *r1, struct rangeset *r2); + /* Add/remove/query a single number. */ int __must_check rangeset_add_singleton( struct rangeset *r, unsigned long s); -- 2.49.0