diff --git a/xen/common/rangeset.c b/xen/common/rangeset.c index e758710390..b9e8912fb1 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 96c9180825..817505badf 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);