X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fldlm%2Fldlm_test.c;h=7a5e066a5670fe8a1bffa5a3698ecbfcb37a9760;hb=55e8287b7024ee4ac280806caea9636dd454a0ed;hp=f2c0b2051a648a04972fdbe15e6b94d15c6266df;hpb=ee5c5ed341527910600a1bee55d96b90533debd4;p=fs%2Flustre-release.git diff --git a/lustre/ldlm/ldlm_test.c b/lustre/ldlm/ldlm_test.c index f2c0b20..7a5e066 100644 --- a/lustre/ldlm/ldlm_test.c +++ b/lustre/ldlm/ldlm_test.c @@ -28,6 +28,7 @@ #include #include +#include struct ldlm_test_thread { struct obd_device *obddev; @@ -74,17 +75,26 @@ static int ldlm_do_convert(void); */ static int ldlm_test_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *new, - void *data, __u32 data_len) + void *data, int flag) { int rc; struct lustre_handle lockh; ENTRY; - LDLM_DEBUG(lock, "We're blocking. Cancelling lock"); - ldlm_lock2handle(lock, &lockh); - rc = ldlm_cli_cancel(&lockh); - if (rc < 0) { - CERROR("ldlm_cli_cancel: %d\n", rc); + switch (flag) { + case LDLM_CB_BLOCKING: + LDLM_DEBUG(lock, "We're blocking. Cancelling lock"); + ldlm_lock2handle(lock, &lockh); + rc = ldlm_cli_cancel(&lockh); + if (rc < 0) { + CERROR("ldlm_cli_cancel: %d\n", rc); + LBUG(); + } + break; + case LDLM_CB_CANCELING: + LDLM_DEBUG(lock, "this lock is being cancelled"); + break; + default: LBUG(); } @@ -94,29 +104,29 @@ static int ldlm_test_blocking_ast(struct ldlm_lock *lock, /* blocking ast for basic tests. noop */ static int ldlm_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *new, - void *data, __u32 data_len) + void *data, int flag) { ENTRY; - CERROR("ldlm_blocking_ast: lock=%p, new=%p\n", lock, new); + CERROR("ldlm_blocking_ast: lock=%p, new=%p, flag=%d\n", lock, new, + flag); RETURN(0); } /* Completion ast for regression test. * Does not sleep when blocked. */ -static int ldlm_test_completion_ast(struct ldlm_lock *lock, int flags) +static int ldlm_test_completion_ast(struct ldlm_lock *lock, int flags, void *data) { struct ldlm_test_lock *lock_info; ENTRY; if (flags & (LDLM_FL_BLOCK_WAIT | LDLM_FL_BLOCK_GRANTED | - LDLM_FL_BLOCK_CONV)) { - + LDLM_FL_BLOCK_CONV)) { LDLM_DEBUG(lock, "client-side enqueue returned a blocked lock"); RETURN(0); - } + } - if (lock->l_granted_mode != lock->l_req_mode) + if (lock->l_granted_mode != lock->l_req_mode) CERROR("completion ast called with non-granted lock\n"); /* add to list of granted locks */ @@ -149,7 +159,7 @@ int ldlm_test_basics(struct obd_device *obddev) { struct ldlm_namespace *ns; struct ldlm_resource *res; - __u64 res_id[RES_NAME_SIZE] = {1, 2, 3}; + struct ldlm_res_id res_id = { .name = {1, 2, 3} }; ldlm_error_t err; struct ldlm_lock *lock1, *lock; int flags; @@ -162,7 +172,7 @@ int ldlm_test_basics(struct obd_device *obddev) lock1 = ldlm_lock_create(ns, NULL, res_id, LDLM_PLAIN, LCK_CR, NULL, 0); if (lock1 == NULL) LBUG(); - err = ldlm_lock_enqueue(lock1, NULL, 0, &flags, + err = ldlm_lock_enqueue(ns, lock1, NULL, 0, &flags, ldlm_completion_ast, ldlm_blocking_ast); if (err != ELDLM_OK) LBUG(); @@ -170,7 +180,7 @@ int ldlm_test_basics(struct obd_device *obddev) lock = ldlm_lock_create(ns, NULL, res_id, LDLM_PLAIN, LCK_EX, NULL, 0); if (lock == NULL) LBUG(); - err = ldlm_lock_enqueue(lock, NULL, 0, &flags, + err = ldlm_lock_enqueue(ns, lock, NULL, 0, &flags, ldlm_completion_ast, ldlm_blocking_ast); if (err != ELDLM_OK) LBUG(); @@ -187,7 +197,7 @@ int ldlm_test_basics(struct obd_device *obddev) ldlm_reprocess_all(res); ldlm_resource_dump(res); - ldlm_namespace_free(ns); + ldlm_namespace_free(ns, 0); RETURN(0); } @@ -197,7 +207,7 @@ int ldlm_test_extents(struct obd_device *obddev) struct ldlm_namespace *ns; struct ldlm_resource *res; struct ldlm_lock *lock, *lock1, *lock2; - __u64 res_id[RES_NAME_SIZE] = {0, 0, 0}; + struct ldlm_res_id res_id = { .name = {0} }; struct ldlm_extent ext1 = {4, 6}, ext2 = {6, 9}, ext3 = {10, 11}; ldlm_error_t err; int flags; @@ -208,20 +218,20 @@ int ldlm_test_extents(struct obd_device *obddev) LBUG(); flags = 0; - lock1 = ldlm_lock_create(ns, NULL, res_id, LDLM_EXTENT, LCK_PR, NULL, - 0); + lock1 = ldlm_lock_create(ns, NULL, res_id, LDLM_EXTENT, LCK_PR, NULL,0); if (lock1 == NULL) LBUG(); - err = ldlm_lock_enqueue(lock1, &ext1, sizeof(ext1), &flags, NULL, NULL); + err = ldlm_lock_enqueue(ns, lock1, &ext1, sizeof(ext1), &flags, NULL, + NULL); if (err != ELDLM_OK) LBUG(); if (!(flags & LDLM_FL_LOCK_CHANGED)) LBUG(); flags = 0; - lock2 = ldlm_lock_create(ns, NULL, res_id, LDLM_EXTENT, LCK_PR, - NULL, 0); - err = ldlm_lock_enqueue(lock2, &ext2, sizeof(ext2), &flags, NULL, NULL); + lock2 = ldlm_lock_create(ns, NULL, res_id, LDLM_EXTENT, LCK_PR, NULL,0); + err = ldlm_lock_enqueue(ns, lock2, &ext2, sizeof(ext2), &flags, NULL, + NULL); if (err != ELDLM_OK) LBUG(); if (!(flags & LDLM_FL_LOCK_CHANGED)) @@ -231,7 +241,7 @@ int ldlm_test_extents(struct obd_device *obddev) lock = ldlm_lock_create(ns, NULL, res_id, LDLM_EXTENT, LCK_EX, NULL, 0); if (lock == NULL) LBUG(); - err = ldlm_lock_enqueue(lock, &ext3, sizeof(ext3), &flags, + err = ldlm_lock_enqueue(ns, lock, &ext3, sizeof(ext3), &flags, NULL, NULL); if (err != ELDLM_OK) LBUG(); @@ -255,7 +265,7 @@ int ldlm_test_extents(struct obd_device *obddev) if (res == NULL) LBUG(); ldlm_resource_dump(res); - ldlm_namespace_free(ns); + ldlm_namespace_free(ns, 0); RETURN(0); } @@ -263,8 +273,7 @@ int ldlm_test_extents(struct obd_device *obddev) static int ldlm_test_network(struct obd_device *obddev, struct lustre_handle *connh) { - - __u64 res_id[RES_NAME_SIZE] = {1, 2, 3}; + struct ldlm_res_id res_id = { .name = {1, 2, 3} }; struct ldlm_extent ext = {4, 6}; struct lustre_handle lockh1; struct ldlm_lock *lock; @@ -283,7 +292,7 @@ static int ldlm_test_network(struct obd_device *obddev, CERROR("ldlm_cli_convert: %d\n", err); lock = ldlm_handle2lock(&lockh1); - ldlm_lock_dump(lock); + ldlm_lock_dump(D_OTHER, lock); ldlm_lock_put(lock); /* Need to decrement old mode. Don't bother incrementing new @@ -301,21 +310,21 @@ static int ldlm_do_decrement(void) struct ldlm_lock *lock; int rc = 0; ENTRY; - + spin_lock(&ctl_lock); if(list_empty(&lock_list)) { CERROR("lock_list is empty\n"); spin_unlock(&ctl_lock); - RETURN(0); - } - + RETURN(0); + } + /* delete from list */ - lock_info = list_entry(lock_list.next, + lock_info = list_entry(lock_list.next, struct ldlm_test_lock, l_link); list_del(lock_list.next); num_locks--; spin_unlock(&ctl_lock); - + /* decrement and free the info */ lock = ldlm_handle2lock(&lock_info->l_lockh); ldlm_lock_decref(&lock_info->l_lockh, lock->l_granted_mode); @@ -327,9 +336,9 @@ static int ldlm_do_decrement(void) } static int ldlm_do_enqueue(struct ldlm_test_thread *thread) -{ +{ struct lustre_handle lockh; - __u64 res_id[3] = {0}; + struct ldlm_res_id res_id = { .name = {0} }; __u32 lock_mode; struct ldlm_extent ext; unsigned char random; @@ -338,7 +347,7 @@ static int ldlm_do_enqueue(struct ldlm_test_thread *thread) /* Pick a random resource from 1 to num_resources */ get_random_bytes(&random, sizeof(random)); - res_id[0] = random % num_resources; + res_id.name[0] = random % num_resources; /* Pick a random lock mode */ get_random_bytes(&random, sizeof(random)); @@ -348,23 +357,19 @@ static int ldlm_do_enqueue(struct ldlm_test_thread *thread) get_random_bytes(&random, sizeof(random)); ext.start = random % num_extents; get_random_bytes(&random, sizeof(random)); - ext.end = random % + ext.end = random % (num_extents - (int)ext.start) + ext.start; - LDLM_DEBUG_NOLOCK("about to enqueue with resource %d, mode %d," - " extent %d -> %d", - (int)res_id[0], - lock_mode, - (int)ext.start, - (int)ext.end); - - rc = ldlm_match_or_enqueue(®ress_connh, - NULL, - thread->obddev->obd_namespace, - NULL, res_id, LDLM_EXTENT, &ext, - sizeof(ext), lock_mode, &flags, - ldlm_test_completion_ast, - ldlm_test_blocking_ast, + LDLM_DEBUG_NOLOCK("about to enqueue with resource "LPX64", mode %d," + " extent "LPX64" -> "LPX64, res_id.name[0], lock_mode, + ext.start, ext.end); + + rc = ldlm_match_or_enqueue(®ress_connh, NULL, + thread->obddev->obd_namespace, + NULL, res_id, LDLM_EXTENT, &ext, + sizeof(ext), lock_mode, &flags, + ldlm_test_completion_ast, + ldlm_test_blocking_ast, NULL, 0, &lockh); atomic_inc(&locks_requested); @@ -378,7 +383,7 @@ static int ldlm_do_enqueue(struct ldlm_test_thread *thread) } static int ldlm_do_convert(void) -{ +{ __u32 lock_mode; unsigned char random; int flags = 0, rc = 0; @@ -407,7 +412,7 @@ static int ldlm_do_convert(void) } /* - * Adjust reference counts. + * Adjust reference counts. * FIXME: This is technically a bit... wrong, * since we don't know when/if the convert succeeded */ @@ -426,14 +431,20 @@ static int ldlm_do_convert(void) static int ldlm_test_main(void *data) { struct ldlm_test_thread *thread = data; + unsigned long flags; ENTRY; lock_kernel(); daemonize(); - spin_lock_irq(¤t->sigmask_lock); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + sigfillset(¤t->blocked); + recalc_sigpending(); +#else + spin_lock_irqsave(¤t->sigmask_lock, flags); sigfillset(¤t->blocked); recalc_sigpending(current); - spin_unlock_irq(¤t->sigmask_lock); + spin_unlock_irqrestore(¤t->sigmask_lock, flags); +#endif sprintf(current->comm, "ldlm_test"); unlock_kernel(); @@ -453,7 +464,7 @@ static int ldlm_test_main(void *data) */ dec_chance = chance_left * num_locks / max_locks; chance_left -= dec_chance; - + /* FIXME: conversions temporarily disabled * until they are working correctly. */ @@ -482,11 +493,11 @@ static int ldlm_test_main(void *data) atomic_read(&locks_matched)); spin_lock(&ctl_lock); - LDLM_DEBUG_NOLOCK("lock references currently held: %d, ", + LDLM_DEBUG_NOLOCK("lock references currently held: %d, ", num_locks); spin_unlock(&ctl_lock); - /* + /* * We don't sleep after a lock being blocked, so let's * make sure other things can run. */ @@ -530,10 +541,10 @@ static int ldlm_start_thread(struct obd_device *obddev, RETURN(0); } -int ldlm_regression_start(struct obd_device *obddev, - struct lustre_handle *connh, - unsigned int threads, unsigned int max_locks_in, - unsigned int num_resources_in, +int ldlm_regression_start(struct obd_device *obddev, + struct lustre_handle *connh, + unsigned int threads, unsigned int max_locks_in, + unsigned int num_resources_in, unsigned int num_extents_in) { int i, rc = 0; @@ -548,7 +559,7 @@ int ldlm_regression_start(struct obd_device *obddev, regression_running = 1; spin_unlock(&ctl_lock); - regress_connh = *connh; + regress_connh = *connh; max_locks = max_locks_in; num_resources = num_resources_in; num_extents = num_extents_in; @@ -600,8 +611,8 @@ int ldlm_regression_stop(void) /* decrement all held locks */ while (!list_empty(&lock_list)) { struct ldlm_lock *lock; - struct ldlm_test_lock *lock_info = - list_entry(lock_list.next, struct ldlm_test_lock, + struct ldlm_test_lock *lock_info = + list_entry(lock_list.next, struct ldlm_test_lock, l_link); list_del(lock_list.next); num_locks--;