From 8b36fa95dbe9b21e441e19192b8985340df27674 Mon Sep 17 00:00:00 2001 From: Roger Pau Monne Date: Mon, 18 Sep 2017 15:04:23 +0100 Subject: [PATCH] xen: introduce rangeset_consume_ranges MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This function allows to iterate over a rangeset while removing the processed regions. It will be used by the following patches in order to store memory regions in rangesets, and remove them while iterating. Signed-off-by: Roger Pau Monné --- Cc: George Dunlap Cc: Ian Jackson Cc: Jan Beulich Cc: Konrad Rzeszutek Wilk Cc: Stefano Stabellini Cc: Tim Deegan Cc: Wei Liu --- Changes since v5: - New in this version. --- xen/common/rangeset.c | 29 +++++++++++++++++++++++++++++ xen/include/xen/rangeset.h | 4 ++++ 2 files changed, 33 insertions(+) diff --git a/xen/common/rangeset.c b/xen/common/rangeset.c index 6c6293c15c..07350cfff6 100644 --- a/xen/common/rangeset.c +++ b/xen/common/rangeset.c @@ -298,6 +298,35 @@ int rangeset_report_ranges( return rc; } +int rangeset_consume_ranges( + struct rangeset *r, + int (*cb)(unsigned long s, unsigned long e, void *, unsigned long *c), + void *ctxt) +{ + struct range *x; + int rc = 0; + + write_lock(&r->lock); + while ( !rangeset_is_empty(r) ) + { + unsigned long consumed = 0; + + x = first_range(r); + rc = cb(x->s, x->e, ctxt, &consumed); + + ASSERT(consumed <= x->e - x->s + 1); + x->s += consumed; + if ( x->s > x->e ) + destroy_range(r, x); + + if ( rc ) + break; + } + write_unlock(&r->lock); + + return rc; +} + 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..dfdb193800 100644 --- a/xen/include/xen/rangeset.h +++ b/xen/include/xen/rangeset.h @@ -67,6 +67,10 @@ bool_t __must_check rangeset_overlaps_range( int rangeset_report_ranges( struct rangeset *r, unsigned long s, unsigned long e, int (*cb)(unsigned long s, unsigned long e, void *), void *ctxt); +int rangeset_consume_ranges( + struct rangeset *r, + int (*cb)(unsigned long s, unsigned long e, void *, unsigned long *c), + void *ctxt); /* Add/remove/query a single number. */ int __must_check rangeset_add_singleton( -- 2.39.5