From 34b9fe2f703d91e7ad5b315aaac696d3a314cf0b Mon Sep 17 00:00:00 2001 From: Dmitry Eremin Date: Wed, 19 Feb 2014 00:08:20 +0400 Subject: [PATCH] LU-4588 code: replace semaphores with mutexes It's just optimization. The mutex subsystem is slightly faster and has better scalability for contended workloads. Remove the lustre_lock and it's accessor functions l_lock(), l_unlock(), l_lock_init(), and l_has_lock() since they have not been used by the code since Lustre 1.6. Signed-off-by: Dmitry Eremin Change-Id: I1b6defe7bdea2f7b33638a98c73277290c10bea1 Reviewed-on: http://review.whamcloud.com/9294 Reviewed-by: Andreas Dilger Tested-by: Jenkins Tested-by: Maloo Reviewed-by: John L. Hammond Reviewed-by: James Simmons Reviewed-by: Alex Zhuravlev --- libcfs/libcfs/linux/linux-cpu.c | 24 ++++++++++++------------ lnet/klnds/gnilnd/gnilnd.c | 14 +++++++------- lnet/klnds/gnilnd/gnilnd.h | 4 ++-- lnet/klnds/gnilnd/gnilnd_conn.c | 30 +++++++++++++++--------------- lnet/klnds/gnilnd/gnilnd_stack.c | 4 ++-- lnet/klnds/gnilnd/gnilnd_sysctl.c | 4 ++-- lustre/include/lustre_lib.h | 13 ------------- lustre/include/obd.h | 2 +- lustre/ldlm/ldlm_lib.c | 2 +- lustre/mgc/mgc_request.c | 8 ++++---- lustre/osd-ldiskfs/osd_compat.c | 6 +++--- lustre/osd-ldiskfs/osd_iam.c | 22 +++++++++++----------- lustre/osd-ldiskfs/osd_iam.h | 6 ++---- lustre/osd-ldiskfs/osd_internal.h | 4 +++- lustre/quota/qsd_config.c | 6 +++--- lustre/quota/qsd_internal.h | 2 +- lustre/quota/qsd_lib.c | 8 ++++---- 17 files changed, 73 insertions(+), 86 deletions(-) diff --git a/libcfs/libcfs/linux/linux-cpu.c b/libcfs/libcfs/linux/linux-cpu.c index ffdc440..7318d81 100644 --- a/libcfs/libcfs/linux/linux-cpu.c +++ b/libcfs/libcfs/linux/linux-cpu.c @@ -69,7 +69,7 @@ struct cfs_cpt_data { /* reserved for hotplug */ unsigned long cpt_version; /* mutex to protect cpt_cpumask */ - struct semaphore cpt_mutex; + struct mutex cpt_mutex; /* scratch buffer for set/unset_node */ cpumask_t *cpt_cpumask; }; @@ -90,12 +90,12 @@ cfs_cpu_core_nsiblings(int cpu) { int num; - down(&cpt_data.cpt_mutex); + mutex_lock(&cpt_data.cpt_mutex); cfs_cpu_core_siblings(cpu, cpt_data.cpt_cpumask); num = cpus_weight(*cpt_data.cpt_cpumask); - up(&cpt_data.cpt_mutex); + mutex_unlock(&cpt_data.cpt_mutex); return num; } @@ -115,12 +115,12 @@ cfs_cpu_ht_nsiblings(int cpu) { int num; - down(&cpt_data.cpt_mutex); + mutex_lock(&cpt_data.cpt_mutex); cfs_cpu_ht_siblings(cpu, cpt_data.cpt_cpumask); num = cpus_weight(*cpt_data.cpt_cpumask); - up(&cpt_data.cpt_mutex); + mutex_unlock(&cpt_data.cpt_mutex); return num; } @@ -458,14 +458,14 @@ cfs_cpt_set_node(struct cfs_cpt_table *cptab, int cpt, int node) return 0; } - down(&cpt_data.cpt_mutex); + mutex_lock(&cpt_data.cpt_mutex); mask = cpt_data.cpt_cpumask; cfs_node_to_cpumask(node, mask); rc = cfs_cpt_set_cpumask(cptab, cpt, mask); - up(&cpt_data.cpt_mutex); + mutex_unlock(&cpt_data.cpt_mutex); return rc; } @@ -482,14 +482,14 @@ cfs_cpt_unset_node(struct cfs_cpt_table *cptab, int cpt, int node) return; } - down(&cpt_data.cpt_mutex); + mutex_lock(&cpt_data.cpt_mutex); mask = cpt_data.cpt_cpumask; cfs_node_to_cpumask(node, mask); cfs_cpt_unset_cpumask(cptab, cpt, mask); - up(&cpt_data.cpt_mutex); + mutex_unlock(&cpt_data.cpt_mutex); } EXPORT_SYMBOL(cfs_cpt_unset_node); @@ -1011,11 +1011,11 @@ cfs_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) break; } - down(&cpt_data.cpt_mutex); + mutex_lock(&cpt_data.cpt_mutex); /* if all HTs in a core are offline, it may break affinity */ cfs_cpu_ht_siblings(cpu, cpt_data.cpt_cpumask); warn = any_online_cpu(*cpt_data.cpt_cpumask) >= nr_cpu_ids; - up(&cpt_data.cpt_mutex); + mutex_unlock(&cpt_data.cpt_mutex); CDEBUG(warn ? D_WARNING : D_INFO, "Lustre: can't support CPU plug-out well now, " "performance and stability could be impacted" @@ -1059,7 +1059,7 @@ cfs_cpu_init(void) } spin_lock_init(&cpt_data.cpt_lock); - sema_init(&cpt_data.cpt_mutex, 1); + mutex_init(&cpt_data.cpt_mutex); #ifdef CONFIG_HOTPLUG_CPU register_hotcpu_notifier(&cfs_cpu_notifier); diff --git a/lnet/klnds/gnilnd/gnilnd.c b/lnet/klnds/gnilnd/gnilnd.c index fe99809..84829e5 100644 --- a/lnet/klnds/gnilnd/gnilnd.c +++ b/lnet/klnds/gnilnd/gnilnd.c @@ -2170,7 +2170,7 @@ int kgnilnd_base_startup(void) INIT_LIST_HEAD(&dev->gnd_map_tx); INIT_LIST_HEAD(&dev->gnd_fma_buffs); mutex_init(&dev->gnd_cq_mutex); - sema_init(&dev->gnd_fmablk_sem, 1); + mutex_init(&dev->gnd_fmablk_mutex); spin_lock_init(&dev->gnd_fmablk_lock); init_waitqueue_head(&dev->gnd_waitq); init_waitqueue_head(&dev->gnd_dgram_waitq); @@ -2218,7 +2218,7 @@ int kgnilnd_base_startup(void) init_waitqueue_head(&kgnilnd_data.kgn_ruhroh_waitq); spin_lock_init(&kgnilnd_data.kgn_reaper_lock); - sema_init(&kgnilnd_data.kgn_quiesce_sem, 1); + mutex_init(&kgnilnd_data.kgn_quiesce_mutex); atomic_set(&kgnilnd_data.kgn_nquiesce, 0); atomic_set(&kgnilnd_data.kgn_npending_conns, 0); atomic_set(&kgnilnd_data.kgn_npending_unlink, 0); @@ -2613,7 +2613,7 @@ kgnilnd_startup(lnet_ni_t *ni) } /* Serialize with shutdown. */ - down(&kgnilnd_data.kgn_quiesce_sem); + mutex_lock(&kgnilnd_data.kgn_quiesce_mutex); LIBCFS_ALLOC(net, sizeof(*net)); if (net == NULL) { @@ -2680,10 +2680,10 @@ kgnilnd_startup(lnet_ni_t *ni) /* we need a separate thread to call probe_wait_by_id until * we get a function callback notifier from kgni */ - up(&kgnilnd_data.kgn_quiesce_sem); + mutex_unlock(&kgnilnd_data.kgn_quiesce_mutex); RETURN(0); failed: - up(&kgnilnd_data.kgn_quiesce_sem); + mutex_unlock(&kgnilnd_data.kgn_quiesce_mutex); kgnilnd_shutdown(ni); RETURN(rc); } @@ -2702,7 +2702,7 @@ kgnilnd_shutdown(lnet_ni_t *ni) "init %d\n", kgnilnd_data.kgn_init); /* Serialize with startup. */ - down(&kgnilnd_data.kgn_quiesce_sem); + mutex_lock(&kgnilnd_data.kgn_quiesce_mutex); CDEBUG(D_MALLOC, "before NAL cleanup: kmem %d\n", atomic_read(&libcfs_kmemory)); @@ -2785,7 +2785,7 @@ out: CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", atomic_read(&libcfs_kmemory)); - up(&kgnilnd_data.kgn_quiesce_sem); + mutex_unlock(&kgnilnd_data.kgn_quiesce_mutex); EXIT; } diff --git a/lnet/klnds/gnilnd/gnilnd.h b/lnet/klnds/gnilnd/gnilnd.h index b22fe09..f433247 100644 --- a/lnet/klnds/gnilnd/gnilnd.h +++ b/lnet/klnds/gnilnd/gnilnd.h @@ -520,7 +520,7 @@ typedef struct kgn_device { int gnd_id; /* device id, also index in kgn_devices */ __u32 gnd_nid; /* ph host ID translated to NID */ struct list_head gnd_fma_buffs; /* list of FMA memory blocks */ - struct semaphore gnd_fmablk_sem; /* semaphore for FMA block memory alloc/free */ + struct mutex gnd_fmablk_mutex; /* mutex for FMA block memory alloc/free */ spinlock_t gnd_fmablk_lock; /* lock for mbox alloc/release */ atomic_t gnd_nfmablk; /* # of fmablk live */ atomic_t gnd_fmablk_vers; /* gnd_fma_bufs stamp */ @@ -796,7 +796,7 @@ typedef struct kgn_data { wait_queue_head_t kgn_ruhroh_waitq; /* ruhroh thread wakeup */ int kgn_quiesce_trigger; /* should we quiesce ? */ atomic_t kgn_nquiesce; /* how many quiesced ? */ - struct semaphore kgn_quiesce_sem; /* serialize ruhroh task, startup and shutdown */ + struct mutex kgn_quiesce_mutex; /* serialize ruhroh task, startup and shutdown */ int kgn_needs_reset; /* we need stack reset */ /* These next three members implement communication from gnilnd into diff --git a/lnet/klnds/gnilnd/gnilnd_conn.c b/lnet/klnds/gnilnd/gnilnd_conn.c index 80cfbdc..4cf2dd2 100644 --- a/lnet/klnds/gnilnd/gnilnd_conn.c +++ b/lnet/klnds/gnilnd/gnilnd_conn.c @@ -79,9 +79,9 @@ kgnilnd_alloc_fmablk(kgn_device_t *device, int use_phys) gni_smsg_attr_t smsg_attr; unsigned long fmablk_vers; - /* we'll use fmablk_vers and the gnd_fmablk_sem to gate access + /* we'll use fmablk_vers and the gnd_fmablk_mutex to gate access * to this allocation code. Everyone will sample the version - * before and after getting the semaphore. If it has changed, + * before and after getting the mutex. If it has changed, * we'll bail out to check the lists again - this indicates that * some sort of change was made to the lists and it is possible * that there is a mailbox for us to find now. This should prevent @@ -89,12 +89,12 @@ kgnilnd_alloc_fmablk(kgn_device_t *device, int use_phys) * that need a yet-to-be-allocated mailbox for a connection. */ fmablk_vers = atomic_read(&device->gnd_fmablk_vers); - down(&device->gnd_fmablk_sem); + mutex_lock(&device->gnd_fmablk_mutex); if (fmablk_vers != atomic_read(&device->gnd_fmablk_vers)) { /* version changed while we were waiting for semaphore, * we'll recheck the lists assuming something nice happened */ - up(&device->gnd_fmablk_sem); + mutex_unlock(&device->gnd_fmablk_mutex); return 0; } @@ -203,7 +203,7 @@ kgnilnd_alloc_fmablk(kgn_device_t *device, int use_phys) spin_unlock(&device->gnd_fmablk_lock); - up(&device->gnd_fmablk_sem); + mutex_unlock(&device->gnd_fmablk_mutex); return 0; @@ -220,7 +220,7 @@ free_blk: free_desc: LIBCFS_FREE(fma_blk, sizeof(kgn_fma_memblock_t)); out: - up(&device->gnd_fmablk_sem); + mutex_unlock(&device->gnd_fmablk_mutex); return rc; } @@ -584,8 +584,8 @@ kgnilnd_map_phys_fmablk(kgn_device_t *device) int rc = 0; kgn_fma_memblock_t *fma_blk; - /* use sem to gate access to single thread, just in case */ - down(&device->gnd_fmablk_sem); + /* use mutex to gate access to single thread, just in case */ + mutex_lock(&device->gnd_fmablk_mutex); spin_lock(&device->gnd_fmablk_lock); @@ -598,7 +598,7 @@ kgnilnd_map_phys_fmablk(kgn_device_t *device) } spin_unlock(&device->gnd_fmablk_lock); - up(&device->gnd_fmablk_sem); + mutex_unlock(&device->gnd_fmablk_mutex); RETURN(rc); } @@ -609,8 +609,8 @@ kgnilnd_unmap_fma_blocks(kgn_device_t *device) kgn_fma_memblock_t *fma_blk; - /* use sem to gate access to single thread, just in case */ - down(&device->gnd_fmablk_sem); + /* use mutex to gate access to single thread, just in case */ + mutex_lock(&device->gnd_fmablk_mutex); spin_lock(&device->gnd_fmablk_lock); @@ -619,7 +619,7 @@ kgnilnd_unmap_fma_blocks(kgn_device_t *device) } spin_unlock(&device->gnd_fmablk_lock); - up(&device->gnd_fmablk_sem); + mutex_unlock(&device->gnd_fmablk_mutex); } void @@ -628,8 +628,8 @@ kgnilnd_free_phys_fmablk(kgn_device_t *device) kgn_fma_memblock_t *fma_blk, *fma_blkN; - /* use sem to gate access to single thread, just in case */ - down(&device->gnd_fmablk_sem); + /* use mutex to gate access to single thread, just in case */ + mutex_lock(&device->gnd_fmablk_mutex); spin_lock(&device->gnd_fmablk_lock); @@ -639,7 +639,7 @@ kgnilnd_free_phys_fmablk(kgn_device_t *device) } spin_unlock(&device->gnd_fmablk_lock); - up(&device->gnd_fmablk_sem); + mutex_unlock(&device->gnd_fmablk_mutex); } /* kgnilnd dgram nid->struct managment */ diff --git a/lnet/klnds/gnilnd/gnilnd_stack.c b/lnet/klnds/gnilnd/gnilnd_stack.c index 43d301a..a502ce2 100644 --- a/lnet/klnds/gnilnd/gnilnd_stack.c +++ b/lnet/klnds/gnilnd/gnilnd_stack.c @@ -387,7 +387,7 @@ kgnilnd_ruhroh_thread(void *arg) break; /* Serialize with driver startup and shutdown. */ - down(&kgnilnd_data.kgn_quiesce_sem); + mutex_lock(&kgnilnd_data.kgn_quiesce_mutex); CDEBUG(D_NET, "trigger %d reset %d to_bump %d pause %d\n", kgnilnd_data.kgn_quiesce_trigger, @@ -452,7 +452,7 @@ kgnilnd_ruhroh_thread(void *arg) set_mb(kgnilnd_data.kgn_needs_reset, 0); } - up(&kgnilnd_data.kgn_quiesce_sem); + mutex_unlock(&kgnilnd_data.kgn_quiesce_mutex); } kgnilnd_data.kgn_ruhroh_running = 0; diff --git a/lnet/klnds/gnilnd/gnilnd_sysctl.c b/lnet/klnds/gnilnd/gnilnd_sysctl.c index 24fd128..4a083a9 100644 --- a/lnet/klnds/gnilnd/gnilnd_sysctl.c +++ b/lnet/klnds/gnilnd/gnilnd_sysctl.c @@ -58,11 +58,11 @@ static int LL_PROC_PROTO(proc_toggle_thread_pause) } if (old_val != kgnilnd_sysctl.ksd_pause_trigger) { - down(&kgnilnd_data.kgn_quiesce_sem); + mutex_lock(&kgnilnd_data.kgn_quiesce_mutex); CDEBUG(D_NET, "setting quiesce_trigger %d\n", old_val); kgnilnd_data.kgn_quiesce_trigger = kgnilnd_sysctl.ksd_pause_trigger; kgnilnd_quiesce_wait("admin sysctl"); - up(&kgnilnd_data.kgn_quiesce_sem); + mutex_unlock(&kgnilnd_data.kgn_quiesce_mutex); } RETURN(rc); diff --git a/lustre/include/lustre_lib.h b/lustre/include/lustre_lib.h index 2ea9e15..7ff3671 100644 --- a/lustre/include/lustre_lib.h +++ b/lustre/include/lustre_lib.h @@ -117,19 +117,6 @@ struct obd_client_handle { void statfs_pack(struct obd_statfs *osfs, struct kstatfs *sfs); void statfs_unpack(struct kstatfs *sfs, struct obd_statfs *osfs); -/* l_lock.c */ -struct lustre_lock { - int l_depth; - struct task_struct *l_owner; - struct semaphore l_sem; - spinlock_t l_spin; -}; - -void l_lock_init(struct lustre_lock *); -void l_lock(struct lustre_lock *); -void l_unlock(struct lustre_lock *); -int l_has_lock(struct lustre_lock *); - /* * For md echo client */ diff --git a/lustre/include/obd.h b/lustre/include/obd.h index d262f63..bb67e43 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -355,7 +355,7 @@ struct client_obd { struct mdc_rpc_lock *cl_close_lock; /* mgc datastruct */ - struct semaphore cl_mgc_sem; + struct mutex cl_mgc_mutex; struct local_oid_storage *cl_mgc_los; struct dt_object *cl_mgc_configs_dir; atomic_t cl_mgc_refcount; diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index 5006484..4c35cab 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -340,7 +340,7 @@ int client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg) } init_rwsem(&cli->cl_sem); - sema_init(&cli->cl_mgc_sem, 1); + mutex_init(&cli->cl_mgc_mutex); cli->cl_conn_count = 0; memcpy(server_uuid.uuid, lustre_cfg_buf(lcfg, 2), min_t(unsigned int, LUSTRE_CFG_BUFLEN(lcfg, 2), diff --git a/lustre/mgc/mgc_request.c b/lustre/mgc/mgc_request.c index b282497..8935814 100644 --- a/lustre/mgc/mgc_request.c +++ b/lustre/mgc/mgc_request.c @@ -707,8 +707,8 @@ static int mgc_fs_setup(struct obd_device *obd, struct super_block *sb) if (env == NULL) RETURN(-ENOMEM); - /* The mgc fs exclusion sem. Only one fs can be setup at a time. */ - down(&cli->cl_mgc_sem); + /* The mgc fs exclusion mutex. Only one fs can be setup at a time. */ + mutex_lock(&cli->cl_mgc_mutex); cfs_cleanup_group_info(); @@ -763,7 +763,7 @@ out_los: if (rc < 0) { local_oid_storage_fini(env, cli->cl_mgc_los); cli->cl_mgc_los = NULL; - up(&cli->cl_mgc_sem); + mutex_unlock(&cli->cl_mgc_mutex); } out_env: lu_env_fini(env); @@ -797,7 +797,7 @@ static int mgc_fs_cleanup(struct obd_device *obd) unlock: class_decref(obd, "mgc_fs", obd); - up(&cli->cl_mgc_sem); + mutex_unlock(&cli->cl_mgc_mutex); RETURN(0); } diff --git a/lustre/osd-ldiskfs/osd_compat.c b/lustre/osd-ldiskfs/osd_compat.c index e693e8d..8b91b64 100644 --- a/lustre/osd-ldiskfs/osd_compat.c +++ b/lustre/osd-ldiskfs/osd_compat.c @@ -377,7 +377,7 @@ static int osd_ost_init(const struct lu_env *env, struct osd_device *dev) CFS_INIT_LIST_HEAD(&dev->od_ost_map->om_seq_list); rwlock_init(&dev->od_ost_map->om_seq_list_lock); - sema_init(&dev->od_ost_map->om_dir_init_sem, 1); + mutex_init(&dev->od_ost_map->om_dir_init_mutex); osd_push_ctxt(dev, &new, &save); @@ -813,7 +813,7 @@ static struct osd_obj_seq *osd_seq_load(struct osd_thread_info *info, RETURN(osd_seq); /* Serializing init process */ - down(&map->om_dir_init_sem); + mutex_lock(&map->om_dir_init_mutex); /* Check whether the seq has been added */ read_lock(&map->om_seq_list_lock); @@ -842,7 +842,7 @@ static struct osd_obj_seq *osd_seq_load(struct osd_thread_info *info, write_unlock(&map->om_seq_list_lock); cleanup: - up(&map->om_dir_init_sem); + mutex_unlock(&map->om_dir_init_mutex); if (rc != 0) { if (osd_seq != NULL) OBD_FREE_PTR(osd_seq); diff --git a/lustre/osd-ldiskfs/osd_iam.c b/lustre/osd-ldiskfs/osd_iam.c index 1524e61..009ec9a 100644 --- a/lustre/osd-ldiskfs/osd_iam.c +++ b/lustre/osd-ldiskfs/osd_iam.c @@ -173,7 +173,7 @@ iam_load_idle_blocks(struct iam_container *c, iam_ptr_t blk) struct buffer_head *bh; int err; - LASSERT(down_trylock(&c->ic_idle_sem) != 0); + LASSERT(mutex_is_locked(&c->ic_idle_mutex)); if (blk == 0) return NULL; @@ -237,13 +237,13 @@ static int iam_format_guess(struct iam_container *c) idle_blocks = (__u32 *)(c->ic_root_bh->b_data + c->ic_descr->id_root_gap + sizeof(struct dx_countlimit)); - down(&c->ic_idle_sem); + mutex_lock(&c->ic_idle_mutex); bh = iam_load_idle_blocks(c, le32_to_cpu(*idle_blocks)); if (bh != NULL && IS_ERR(bh)) result = PTR_ERR(bh); else c->ic_idle_bh = bh; - up(&c->ic_idle_sem); + mutex_unlock(&c->ic_idle_mutex); } return result; @@ -260,7 +260,7 @@ int iam_container_init(struct iam_container *c, c->ic_object = inode; init_rwsem(&c->ic_sem); dynlock_init(&c->ic_tree_lock); - sema_init(&c->ic_idle_sem, 1); + mutex_init(&c->ic_idle_mutex); return 0; } EXPORT_SYMBOL(iam_container_init); @@ -1665,9 +1665,9 @@ iam_new_node(handle_t *h, struct iam_container *c, iam_ptr_t *b, int *e) if (c->ic_idle_bh == NULL) goto newblock; - down(&c->ic_idle_sem); + mutex_lock(&c->ic_idle_mutex); if (unlikely(c->ic_idle_bh == NULL)) { - up(&c->ic_idle_sem); + mutex_unlock(&c->ic_idle_mutex); goto newblock; } @@ -1685,7 +1685,7 @@ iam_new_node(handle_t *h, struct iam_container *c, iam_ptr_t *b, int *e) if (*e != 0) goto fail; - up(&c->ic_idle_sem); + mutex_unlock(&c->ic_idle_mutex); bh = ldiskfs_bread(NULL, inode, *b, 0, e); if (bh == NULL) return NULL; @@ -1723,7 +1723,7 @@ iam_new_node(handle_t *h, struct iam_container *c, iam_ptr_t *b, int *e) } c->ic_idle_bh = idle; - up(&c->ic_idle_sem); + mutex_unlock(&c->ic_idle_mutex); got: /* get write access for the found buffer head */ @@ -1744,7 +1744,7 @@ newblock: return bh; fail: - up(&c->ic_idle_sem); + mutex_unlock(&c->ic_idle_mutex); ldiskfs_std_error(inode->i_sb, *e); return NULL; } @@ -2382,7 +2382,7 @@ static void iam_recycle_leaf(handle_t *h, struct iam_path *p, int count; int rc; - down(&c->ic_idle_sem); + mutex_lock(&c->ic_idle_mutex); if (unlikely(c->ic_idle_failed)) { rc = -EFAULT; goto unlock; @@ -2415,7 +2415,7 @@ static void iam_recycle_leaf(handle_t *h, struct iam_path *p, rc = iam_txn_dirty(h, p, c->ic_idle_bh); unlock: - up(&c->ic_idle_sem); + mutex_unlock(&c->ic_idle_mutex); if (rc != 0) CWARN("%.16s: idle blocks failed, will lose the blk %u\n", LDISKFS_SB(inode->i_sb)->s_es->s_volume_name, blk); diff --git a/lustre/osd-ldiskfs/osd_iam.h b/lustre/osd-ldiskfs/osd_iam.h index aeccdbc..697dd15 100644 --- a/lustre/osd-ldiskfs/osd_iam.h +++ b/lustre/osd-ldiskfs/osd_iam.h @@ -485,10 +485,8 @@ struct iam_container { */ struct rw_semaphore ic_sem; struct dynlock ic_tree_lock; - /* - * Protect ic_idle_bh - */ - struct semaphore ic_idle_sem; + /* Protect ic_idle_bh */ + struct mutex ic_idle_mutex; /* * BH for idle blocks */ diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index d806a70..185d63d 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -45,6 +45,8 @@ #if defined(__KERNEL__) +/* struct mutex */ +#include /* struct rw_semaphore */ #include /* struct dentry */ @@ -152,7 +154,7 @@ struct osd_obj_map { rwlock_t om_seq_list_lock; /* lock for seq_list */ cfs_list_t om_seq_list; /* list head for seq */ int om_subdir_count; - struct semaphore om_dir_init_sem; + struct mutex om_dir_init_mutex; }; struct osd_mdobj { diff --git a/lustre/quota/qsd_config.c b/lustre/quota/qsd_config.c index 8bb6dbd..1ad6fc9 100644 --- a/lustre/quota/qsd_config.c +++ b/lustre/quota/qsd_config.c @@ -88,7 +88,7 @@ struct qsd_fsinfo *qsd_get_fsinfo(char *name, bool create) if (new == NULL) RETURN(NULL); - sema_init(&new->qfs_sem, 1); + mutex_init(&new->qfs_mutex); CFS_INIT_LIST_HEAD(&new->qfs_qsd_list); strcpy(new->qfs_name, name); new->qfs_ref = 1; @@ -160,7 +160,7 @@ int qsd_process_config(struct lustre_cfg *lcfg) if (strchr(valstr, 'g')) enabled |= 1 << GRPQUOTA; - down(&qfs->qfs_sem); + mutex_lock(&qfs->qfs_mutex); if (qfs->qfs_enabled[pool - LQUOTA_FIRST_RES] == enabled) /* no change required */ GOTO(out, rc = 0); @@ -205,7 +205,7 @@ int qsd_process_config(struct lustre_cfg *lcfg) } } out: - up(&qfs->qfs_sem); + mutex_unlock(&qfs->qfs_mutex); qsd_put_fsinfo(qfs); RETURN(0); } diff --git a/lustre/quota/qsd_internal.h b/lustre/quota/qsd_internal.h index 05fa589..b533fdd 100644 --- a/lustre/quota/qsd_internal.h +++ b/lustre/quota/qsd_internal.h @@ -192,7 +192,7 @@ struct qsd_fsinfo { /* list of all qsd_instance for this fs */ cfs_list_t qfs_qsd_list; - struct semaphore qfs_sem; + struct mutex qfs_mutex; /* link to the global quota fsinfo list. */ cfs_list_t qfs_link; diff --git a/lustre/quota/qsd_lib.c b/lustre/quota/qsd_lib.c index bf3dfcc..3e396d5 100644 --- a/lustre/quota/qsd_lib.c +++ b/lustre/quota/qsd_lib.c @@ -512,10 +512,10 @@ void qsd_fini(const struct lu_env *env, struct qsd_instance *qsd) /* release per-filesystem information */ if (qsd->qsd_fsinfo != NULL) { - down(&qsd->qsd_fsinfo->qfs_sem); + mutex_lock(&qsd->qsd_fsinfo->qfs_mutex); /* remove from the list of fsinfo */ cfs_list_del_init(&qsd->qsd_link); - up(&qsd->qsd_fsinfo->qfs_sem); + mutex_unlock(&qsd->qsd_fsinfo->qfs_mutex); qsd_put_fsinfo(qsd->qsd_fsinfo); qsd->qsd_fsinfo = NULL; } @@ -612,9 +612,9 @@ struct qsd_instance *qsd_init(const struct lu_env *env, char *svname, } /* add in the list of lquota_fsinfo */ - down(&qsd->qsd_fsinfo->qfs_sem); + mutex_lock(&qsd->qsd_fsinfo->qfs_mutex); list_add_tail(&qsd->qsd_link, &qsd->qsd_fsinfo->qfs_qsd_list); - up(&qsd->qsd_fsinfo->qfs_sem); + mutex_unlock(&qsd->qsd_fsinfo->qfs_mutex); /* register procfs directory */ qsd->qsd_proc = lprocfs_seq_register(QSD_DIR, osd_proc, -- 1.8.3.1