From patchwork Wed Mar 15 22:12:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 9626807 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8EBF9604A9 for ; Wed, 15 Mar 2017 22:12:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7EE9A2823D for ; Wed, 15 Mar 2017 22:12:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 73F932838E; Wed, 15 Mar 2017 22:12:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 07F3E2823D for ; Wed, 15 Mar 2017 22:12:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751848AbdCOWMW (ORCPT ); Wed, 15 Mar 2017 18:12:22 -0400 Received: from quartz.orcorp.ca ([184.70.90.242]:36513 "EHLO quartz.orcorp.ca" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752149AbdCOWMS (ORCPT ); Wed, 15 Mar 2017 18:12:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=obsidianresearch.com; s=rsa1; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=ON8xx0Hotw9lLObCW9uUNAjazHfQSzEr9GjgiBVjBZU=; b=FRXmvOewPPtuYMIhZKCwhalCJgGHM/K+qtP5OjtEm7VRqp/C2kgmCK6XuUDglcUrTgPP/XPvCcshX90sBdLcL88L8hiJ5uVguqDrYwqGTWaMNBnxPT0wamcdHLq/gjk4VRcLK78H1/XJPvMXGBGVQtb+P/hUnAY8eu5ld4ph/Pg=; Received: from [10.0.0.156] (helo=jggl.edm.orcorp.ca) by quartz.orcorp.ca with esmtps (TLS1.2:ECDHE_RSA_AES_128_CBC_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1coH9S-0004qS-Tr; Wed, 15 Mar 2017 16:12:14 -0600 From: Jason Gunthorpe To: linux-rdma@vger.kernel.org Cc: Sean Hefty Subject: [PATCH rdma-core 4/6] rdmacm: Use C11 stdatomic for all atomics Date: Wed, 15 Mar 2017 16:12:05 -0600 Message-Id: <1489615927-12117-5-git-send-email-jgunthorpe@obsidianresearch.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1489615927-12117-1-git-send-email-jgunthorpe@obsidianresearch.com> References: <1489615927-12117-1-git-send-email-jgunthorpe@obsidianresearch.com> X-Broken-Reverse-DNS: no host name found for IP address 10.0.0.156 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP No sense in having a private API here. stdatomic will be equivalent to the gcc builtin. This is motivated by sparse which does not handle the gcc atomic builtins. Signed-off-by: Jason Gunthorpe --- librdmacm/cma.h | 49 +++++-------------------------------------------- librdmacm/preload.c | 14 ++++++-------- librdmacm/rsocket.c | 7 +++---- 3 files changed, 14 insertions(+), 56 deletions(-) diff --git a/librdmacm/cma.h b/librdmacm/cma.h index 8795d2894d262f..645d1e43576279 100644 --- a/librdmacm/cma.h +++ b/librdmacm/cma.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -53,46 +54,14 @@ /* * Fast synchronization for low contention locking. */ -#if DEFINE_ATOMICS -#define fastlock_t pthread_mutex_t -#define fastlock_init(lock) pthread_mutex_init(lock, NULL) -#define fastlock_destroy(lock) pthread_mutex_destroy(lock) -#define fastlock_acquire(lock) pthread_mutex_lock(lock) -#define fastlock_release(lock) pthread_mutex_unlock(lock) - -typedef struct { pthread_mutex_t mut; int val; } atomic_t; -static inline int atomic_inc(atomic_t *atomic) -{ - int v; - - pthread_mutex_lock(&atomic->mut); - v = ++(atomic->val); - pthread_mutex_unlock(&atomic->mut); - return v; -} -static inline int atomic_dec(atomic_t *atomic) -{ - int v; - - pthread_mutex_lock(&atomic->mut); - v = --(atomic->val); - pthread_mutex_unlock(&atomic->mut); - return v; -} -static inline void atomic_init(atomic_t *atomic) -{ - pthread_mutex_init(&atomic->mut, NULL); - atomic->val = 0; -} -#else typedef struct { sem_t sem; - volatile int cnt; + _Atomic(int) cnt; } fastlock_t; static inline void fastlock_init(fastlock_t *lock) { sem_init(&lock->sem, 0, 0); - lock->cnt = 0; + atomic_store(&lock->cnt, 0); } static inline void fastlock_destroy(fastlock_t *lock) { @@ -100,23 +69,15 @@ static inline void fastlock_destroy(fastlock_t *lock) } static inline void fastlock_acquire(fastlock_t *lock) { - if (__sync_add_and_fetch(&lock->cnt, 1) > 1) + if (atomic_fetch_add(&lock->cnt, 1) > 1) sem_wait(&lock->sem); } static inline void fastlock_release(fastlock_t *lock) { - if (__sync_sub_and_fetch(&lock->cnt, 1) > 0) + if (atomic_fetch_sub(&lock->cnt, 1) > 0) sem_post(&lock->sem); } -typedef struct { volatile int val; } atomic_t; -#define atomic_inc(v) (__sync_add_and_fetch(&(v)->val, 1)) -#define atomic_dec(v) (__sync_sub_and_fetch(&(v)->val, 1)) -#define atomic_init(v) ((v)->val = 0) -#endif /* DEFINE_ATOMICS */ -#define atomic_get(v) ((v)->val) -#define atomic_set(v, s) ((v)->val = s) - uint16_t ucma_get_port(struct sockaddr *addr); int ucma_addrlen(struct sockaddr *addr); void ucma_set_sid(enum rdma_port_space ps, struct sockaddr *addr, diff --git a/librdmacm/preload.c b/librdmacm/preload.c index 1aea3a7f0a247a..bd1bcb1d701015 100644 --- a/librdmacm/preload.c +++ b/librdmacm/preload.c @@ -119,7 +119,7 @@ struct fd_info { enum fd_fork_state state; int fd; int dupfd; - atomic_t refcnt; + _Atomic(int) refcnt; }; struct config_entry { @@ -266,8 +266,7 @@ static int fd_open(void) } fdi->dupfd = -1; - atomic_init(&fdi->refcnt); - atomic_set(&fdi->refcnt, 1); + atomic_store(&fdi->refcnt, 1); pthread_mutex_lock(&mut); ret = idm_set(&idm, index, fdi); pthread_mutex_unlock(&mut); @@ -1013,7 +1012,7 @@ int close(int socket) return ret; } - if (atomic_dec(&fdi->refcnt)) + if (atomic_fetch_sub(&fdi->refcnt, 1)) return 0; idm_clear(&idm, socket); @@ -1118,7 +1117,7 @@ int dup2(int oldfd, int newfd) newfdi = idm_lookup(&idm, newfd); if (newfdi) { /* newfd cannot have been dup'ed directly */ - if (atomic_get(&newfdi->refcnt) > 1) + if (atomic_load(&newfdi->refcnt) > 1) return ERR(EBUSY); close(newfd); } @@ -1145,9 +1144,8 @@ int dup2(int oldfd, int newfd) } else { newfdi->dupfd = oldfd; } - atomic_init(&newfdi->refcnt); - atomic_set(&newfdi->refcnt, 1); - atomic_inc(&oldfdi->refcnt); + atomic_store(&newfdi->refcnt, 1); + atomic_fetch_add(&oldfdi->refcnt, 1); return newfd; } diff --git a/librdmacm/rsocket.c b/librdmacm/rsocket.c index 69ceab6de745d0..a0bc604845c118 100644 --- a/librdmacm/rsocket.c +++ b/librdmacm/rsocket.c @@ -190,7 +190,7 @@ struct rs_iomap_mr { uint64_t offset; struct ibv_mr *mr; dlist_entry entry; - atomic_t refcnt; + _Atomic(int) refcnt; int index; /* -1 if mapping is local and not in iomap_list */ }; @@ -898,7 +898,7 @@ static int rs_create_ep(struct rsocket *rs) static void rs_release_iomap_mr(struct rs_iomap_mr *iomr) { - if (atomic_dec(&iomr->refcnt)) + if (atomic_fetch_sub(&iomr->refcnt, 1)) return; dlist_remove(&iomr->entry); @@ -3798,8 +3798,7 @@ off_t riomap(int socket, void *buf, size_t len, int prot, int flags, off_t offse if (offset == -1) offset = (uintptr_t) buf; iomr->offset = offset; - atomic_init(&iomr->refcnt); - atomic_set(&iomr->refcnt, 1); + atomic_store(&iomr->refcnt, 1); if (iomr->index >= 0) { dlist_insert_tail(&iomr->entry, &rs->iomap_queue);