KVM: selftests: Add a macro to iterate over a sparsebit range
Add sparsebit_for_each_set_range() to allow iterator over a range of set bits in a range. This will be used by x86 SEV guests to process protected physical pages (each such page needs to be encrypted _after_ being "added" to the VM). Tested-by: Carlos Bilbao <carlos.bilbao@amd.com> Signed-off-by: Ackerley Tng <ackerleytng@google.com> [sean: split to separate patch] Link: https://lore.kernel.org/r/20240223004258.3104051-4-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
committed by
Sean Christopherson
parent
35f50c91c4
commit
57e19f0577
@@ -66,6 +66,26 @@ void sparsebit_dump(FILE *stream, const struct sparsebit *sbit,
|
||||
unsigned int indent);
|
||||
void sparsebit_validate_internal(const struct sparsebit *sbit);
|
||||
|
||||
/*
|
||||
* Iterate over an inclusive ranges within sparsebit @s. In each iteration,
|
||||
* @range_begin and @range_end will take the beginning and end of the set
|
||||
* range, which are of type sparsebit_idx_t.
|
||||
*
|
||||
* For example, if the range [3, 7] (inclusive) is set, within the
|
||||
* iteration,@range_begin will take the value 3 and @range_end will take
|
||||
* the value 7.
|
||||
*
|
||||
* Ensure that there is at least one bit set before using this macro with
|
||||
* sparsebit_any_set(), because sparsebit_first_set() will abort if none
|
||||
* are set.
|
||||
*/
|
||||
#define sparsebit_for_each_set_range(s, range_begin, range_end) \
|
||||
for (range_begin = sparsebit_first_set(s), \
|
||||
range_end = sparsebit_next_clear(s, range_begin) - 1; \
|
||||
range_begin && range_end; \
|
||||
range_begin = sparsebit_next_set(s, range_end), \
|
||||
range_end = sparsebit_next_clear(s, range_begin) - 1)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user