Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Ackerley Tng and committed by
Sean Christopherson
57e19f05 35f50c91

+20
+20
tools/testing/selftests/kvm/include/sparsebit.h
··· 66 66 unsigned int indent); 67 67 void sparsebit_validate_internal(const struct sparsebit *sbit); 68 68 69 + /* 70 + * Iterate over an inclusive ranges within sparsebit @s. In each iteration, 71 + * @range_begin and @range_end will take the beginning and end of the set 72 + * range, which are of type sparsebit_idx_t. 73 + * 74 + * For example, if the range [3, 7] (inclusive) is set, within the 75 + * iteration,@range_begin will take the value 3 and @range_end will take 76 + * the value 7. 77 + * 78 + * Ensure that there is at least one bit set before using this macro with 79 + * sparsebit_any_set(), because sparsebit_first_set() will abort if none 80 + * are set. 81 + */ 82 + #define sparsebit_for_each_set_range(s, range_begin, range_end) \ 83 + for (range_begin = sparsebit_first_set(s), \ 84 + range_end = sparsebit_next_clear(s, range_begin) - 1; \ 85 + range_begin && range_end; \ 86 + range_begin = sparsebit_next_set(s, range_end), \ 87 + range_end = sparsebit_next_clear(s, range_begin) - 1) 88 + 69 89 #ifdef __cplusplus 70 90 } 71 91 #endif