diff options
Diffstat (limited to 'lib/test_xarray.c')
-rw-r--r-- | lib/test_xarray.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/test_xarray.c b/lib/test_xarray.c index b5a6b981454d..eaf53f742c72 100644 --- a/lib/test_xarray.c +++ b/lib/test_xarray.c | |||
@@ -715,6 +715,57 @@ static noinline void check_xa_alloc_2(struct xarray *xa, unsigned int base) | |||
715 | xa_destroy(xa); | 715 | xa_destroy(xa); |
716 | } | 716 | } |
717 | 717 | ||
718 | static noinline void check_xa_alloc_3(struct xarray *xa, unsigned int base) | ||
719 | { | ||
720 | struct xa_limit limit = XA_LIMIT(1, 0x3fff); | ||
721 | u32 next = 0; | ||
722 | unsigned int i, id; | ||
723 | unsigned long index; | ||
724 | void *entry; | ||
725 | |||
726 | XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(1), limit, | ||
727 | &next, GFP_KERNEL) != 0); | ||
728 | XA_BUG_ON(xa, id != 1); | ||
729 | |||
730 | next = 0x3ffd; | ||
731 | XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(0x3ffd), limit, | ||
732 | &next, GFP_KERNEL) != 0); | ||
733 | XA_BUG_ON(xa, id != 0x3ffd); | ||
734 | xa_erase_index(xa, 0x3ffd); | ||
735 | xa_erase_index(xa, 1); | ||
736 | XA_BUG_ON(xa, !xa_empty(xa)); | ||
737 | |||
738 | for (i = 0x3ffe; i < 0x4003; i++) { | ||
739 | if (i < 0x4000) | ||
740 | entry = xa_mk_index(i); | ||
741 | else | ||
742 | entry = xa_mk_index(i - 0x3fff); | ||
743 | XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, entry, limit, | ||
744 | &next, GFP_KERNEL) != (id == 1)); | ||
745 | XA_BUG_ON(xa, xa_mk_index(id) != entry); | ||
746 | } | ||
747 | |||
748 | /* Check wrap-around is handled correctly */ | ||
749 | if (base != 0) | ||
750 | xa_erase_index(xa, base); | ||
751 | xa_erase_index(xa, base + 1); | ||
752 | next = UINT_MAX; | ||
753 | XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(UINT_MAX), | ||
754 | xa_limit_32b, &next, GFP_KERNEL) != 0); | ||
755 | XA_BUG_ON(xa, id != UINT_MAX); | ||
756 | XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(base), | ||
757 | xa_limit_32b, &next, GFP_KERNEL) != 1); | ||
758 | XA_BUG_ON(xa, id != base); | ||
759 | XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(base + 1), | ||
760 | xa_limit_32b, &next, GFP_KERNEL) != 0); | ||
761 | XA_BUG_ON(xa, id != base + 1); | ||
762 | |||
763 | xa_for_each(xa, index, entry) | ||
764 | xa_erase_index(xa, index); | ||
765 | |||
766 | XA_BUG_ON(xa, !xa_empty(xa)); | ||
767 | } | ||
768 | |||
718 | static DEFINE_XARRAY_ALLOC(xa0); | 769 | static DEFINE_XARRAY_ALLOC(xa0); |
719 | static DEFINE_XARRAY_ALLOC1(xa1); | 770 | static DEFINE_XARRAY_ALLOC1(xa1); |
720 | 771 | ||
@@ -724,6 +775,8 @@ static noinline void check_xa_alloc(void) | |||
724 | check_xa_alloc_1(&xa1, 1); | 775 | check_xa_alloc_1(&xa1, 1); |
725 | check_xa_alloc_2(&xa0, 0); | 776 | check_xa_alloc_2(&xa0, 0); |
726 | check_xa_alloc_2(&xa1, 1); | 777 | check_xa_alloc_2(&xa1, 1); |
778 | check_xa_alloc_3(&xa0, 0); | ||
779 | check_xa_alloc_3(&xa1, 1); | ||
727 | } | 780 | } |
728 | 781 | ||
729 | static noinline void __check_store_iter(struct xarray *xa, unsigned long start, | 782 | static noinline void __check_store_iter(struct xarray *xa, unsigned long start, |