X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=libcfs%2Flibcfs%2Flibcfs_lock.c;h=c6ba9e728b6880674688af2930bb1bfecbe8ba71;hp=355e47f86836f05ff20d93ec0b73c7f8ac4eee9e;hb=ce8735993473c1055038f7422350c96b092d707d;hpb=08aa217ce49aba1ded52e0f7adb8a607035123fd diff --git a/libcfs/libcfs/libcfs_lock.c b/libcfs/libcfs/libcfs_lock.c index 355e47f..c6ba9e7 100644 --- a/libcfs/libcfs/libcfs_lock.c +++ b/libcfs/libcfs/libcfs_lock.c @@ -21,7 +21,7 @@ * GPL HEADER END */ /* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -30,15 +30,10 @@ * Author: liang@whamcloud.com */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_LNET #include -#ifdef __KERNEL__ - /** destroy cpu-partition lock, see libcfs_private.h for more detail */ void cfs_percpt_lock_free(struct cfs_percpt_lock *pcl) @@ -49,7 +44,7 @@ cfs_percpt_lock_free(struct cfs_percpt_lock *pcl) cfs_percpt_free(pcl->pcl_locks); LIBCFS_FREE(pcl, sizeof(*pcl)); } -CFS_EXPORT_SYMBOL(cfs_percpt_lock_free); +EXPORT_SYMBOL(cfs_percpt_lock_free); /** * create cpu-partition lock, see libcfs_private.h for more detail. @@ -59,7 +54,8 @@ CFS_EXPORT_SYMBOL(cfs_percpt_lock_free); * reason we always allocate cacheline-aligned memory block. */ struct cfs_percpt_lock * -cfs_percpt_lock_alloc(struct cfs_cpt_table *cptab) +cfs_percpt_lock_create(struct cfs_cpt_table *cptab, + struct lock_class_key *keys) { struct cfs_percpt_lock *pcl; spinlock_t *lock; @@ -77,12 +73,20 @@ cfs_percpt_lock_alloc(struct cfs_cpt_table *cptab) return NULL; } - cfs_percpt_for_each(lock, i, pcl->pcl_locks) + if (keys == NULL) { + CWARN("Cannot setup class key for percpt lock, you may see " + "recursive locking warnings which are actually fake.\n"); + } + + cfs_percpt_for_each(lock, i, pcl->pcl_locks) { spin_lock_init(lock); + if (keys != NULL) + lockdep_set_class(lock, &keys[i]); + } return pcl; } -CFS_EXPORT_SYMBOL(cfs_percpt_lock_alloc); +EXPORT_SYMBOL(cfs_percpt_lock_create); /** * lock a CPU partition @@ -95,6 +99,7 @@ CFS_EXPORT_SYMBOL(cfs_percpt_lock_alloc); */ void cfs_percpt_lock(struct cfs_percpt_lock *pcl, int index) +__acquires(pcl->pcl_locks) { int ncpt = cfs_cpt_number(pcl->pcl_cptab); int i; @@ -124,11 +129,12 @@ cfs_percpt_lock(struct cfs_percpt_lock *pcl, int index) } } } -CFS_EXPORT_SYMBOL(cfs_percpt_lock); +EXPORT_SYMBOL(cfs_percpt_lock); /** unlock a CPU partition */ void cfs_percpt_unlock(struct cfs_percpt_lock *pcl, int index) +__releases(pcl->pcl_locks) { int ncpt = cfs_cpt_number(pcl->pcl_cptab); int i; @@ -148,108 +154,4 @@ cfs_percpt_unlock(struct cfs_percpt_lock *pcl, int index) spin_unlock(pcl->pcl_locks[i]); } } -CFS_EXPORT_SYMBOL(cfs_percpt_unlock); - -#else /* !__KERNEL__ */ -# ifdef HAVE_LIBPTHREAD - -struct cfs_percpt_lock * -cfs_percpt_lock_alloc(struct cfs_cpt_table *cptab) -{ - struct cfs_percpt_lock *pcl; - - CFS_ALLOC_PTR(pcl); - if (pcl != NULL) - pthread_mutex_init(&pcl->pcl_mutex, NULL); - - return pcl; -} - -void -cfs_percpt_lock_free(struct cfs_percpt_lock *pcl) -{ - pthread_mutex_destroy(&pcl->pcl_mutex); - CFS_FREE_PTR(pcl); -} - -void -cfs_percpt_lock(struct cfs_percpt_lock *pcl, int lock) -{ - pthread_mutex_lock(&(pcl)->pcl_mutex); -} - -void -cfs_percpt_unlock(struct cfs_percpt_lock *pcl, int lock) -{ - pthread_mutex_unlock(&(pcl)->pcl_mutex); -} - -# else /* !HAVE_LIBPTHREAD */ - -struct cfs_percpt_lock * -cfs_percpt_lock_alloc(struct cfs_cpt_table *cptab) -{ - return ((struct cfs_percpt_lock *) &CFS_PERCPT_LOCK_MAGIC); -} - -void -cfs_percpt_lock_free(struct cfs_percpt_lock *pcl) -{ - LASSERT(pcl == (struct cfs_percpt_lock *) &CFS_PERCPT_LOCK_MAGIC); -} - -void -cfs_percpt_lock(struct cfs_percpt_lock *pcl, int index) -{ - LASSERT(pcl == (struct cfs_percpt_lock *) &CFS_PERCPT_LOCK_MAGIC); -} - -void -cfs_percpt_unlock(struct cfs_percpt_lock *pcl, int index) -{ - LASSERT(pcl == (struct cfs_percpt_lock *) &CFS_PERCPT_LOCK_MAGIC); -} - -# endif /* HAVE_LIBPTHREAD */ -#endif /* __KERNEL__ */ - -/** free cpu-partition refcount */ -void -cfs_percpt_atomic_free(cfs_atomic_t **refs) -{ - cfs_percpt_free(refs); -} -CFS_EXPORT_SYMBOL(cfs_percpt_atomic_free); - -/** allocate cpu-partition refcount with initial value @init_val */ -cfs_atomic_t ** -cfs_percpt_atomic_alloc(struct cfs_cpt_table *cptab, int init_val) -{ - cfs_atomic_t **refs; - cfs_atomic_t *ref; - int i; - - refs = cfs_percpt_alloc(cptab, sizeof(*ref)); - if (refs == NULL) - return NULL; - - cfs_percpt_for_each(ref, i, refs) - cfs_atomic_set(ref, init_val); - return refs; -} -CFS_EXPORT_SYMBOL(cfs_percpt_atomic_alloc); - -/** return sum of cpu-partition refs */ -int -cfs_percpt_atomic_summary(cfs_atomic_t **refs) -{ - cfs_atomic_t *ref; - int i; - int val = 0; - - cfs_percpt_for_each(ref, i, refs) - val += cfs_atomic_read(ref); - - return val; -} -CFS_EXPORT_SYMBOL(cfs_percpt_atomic_summary); +EXPORT_SYMBOL(cfs_percpt_unlock);