Merge tag 'xarray-5.2-rc6' of git://git.infradead.org/users/willy/linux-dax
Pull XArray fixes from Matthew Wilcox: - Account XArray nodes for the page cache to the appropriate cgroup (Johannes Weiner) - Fix idr_get_next() when called under the RCU lock (Matthew Wilcox) - Add a test for xa_insert() (Matthew Wilcox) * tag 'xarray-5.2-rc6' of git://git.infradead.org/users/willy/linux-dax: XArray tests: Add check_insert idr: Fix idr_get_next race with idr_remove mm: fix page cache convergence regression
This commit is contained in:
@@ -279,6 +279,51 @@ static void idr_align_test(struct idr *idr)
|
||||
}
|
||||
}
|
||||
|
||||
DEFINE_IDR(find_idr);
|
||||
|
||||
static void *idr_throbber(void *arg)
|
||||
{
|
||||
time_t start = time(NULL);
|
||||
int id = *(int *)arg;
|
||||
|
||||
rcu_register_thread();
|
||||
do {
|
||||
idr_alloc(&find_idr, xa_mk_value(id), id, id + 1, GFP_KERNEL);
|
||||
idr_remove(&find_idr, id);
|
||||
} while (time(NULL) < start + 10);
|
||||
rcu_unregister_thread();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void idr_find_test_1(int anchor_id, int throbber_id)
|
||||
{
|
||||
pthread_t throbber;
|
||||
time_t start = time(NULL);
|
||||
|
||||
pthread_create(&throbber, NULL, idr_throbber, &throbber_id);
|
||||
|
||||
BUG_ON(idr_alloc(&find_idr, xa_mk_value(anchor_id), anchor_id,
|
||||
anchor_id + 1, GFP_KERNEL) != anchor_id);
|
||||
|
||||
do {
|
||||
int id = 0;
|
||||
void *entry = idr_get_next(&find_idr, &id);
|
||||
BUG_ON(entry != xa_mk_value(id));
|
||||
} while (time(NULL) < start + 11);
|
||||
|
||||
pthread_join(throbber, NULL);
|
||||
|
||||
idr_remove(&find_idr, anchor_id);
|
||||
BUG_ON(!idr_is_empty(&find_idr));
|
||||
}
|
||||
|
||||
void idr_find_test(void)
|
||||
{
|
||||
idr_find_test_1(100000, 0);
|
||||
idr_find_test_1(0, 100000);
|
||||
}
|
||||
|
||||
void idr_checks(void)
|
||||
{
|
||||
unsigned long i;
|
||||
@@ -360,6 +405,7 @@ void idr_checks(void)
|
||||
idr_u32_test(1);
|
||||
idr_u32_test(0);
|
||||
idr_align_test(&idr);
|
||||
idr_find_test();
|
||||
}
|
||||
|
||||
#define module_init(x)
|
||||
|
Reference in New Issue
Block a user