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, |
