From 15e06657921e3af9b1fb8dcaf80ff37f5c791b07 Mon Sep 17 00:00:00 2001 From: Chris Horn Date: Mon, 29 Jun 2015 14:31:42 -0500 Subject: [PATCH] LU-6261 gnilnd: Hold shared MDD for gnilnd. Creating and destroying shared MDDs can cause OS noise. This affects benchmarks that are sensitive to OS noise like fwq. Allocate and register some memory so that we always have a shared MDD available. Moved kgnilnd_check_kgni_version() into gnilnd.c to simplify gemini/aries headers. Signed-off-by: Chris Horn Change-Id: Ibc1f4b9a44035c6fb25e88d30552136486c260d6 Reviewed-on: http://review.whamcloud.com/15436 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: James Shimek Reviewed-by: Doug Oucharek Reviewed-by: Oleg Drokin --- lnet/klnds/gnilnd/gnilnd.c | 12 ++++++++++++ lnet/klnds/gnilnd/gnilnd.h | 39 +++++++++++++++++++++++++++++++++++-- lnet/klnds/gnilnd/gnilnd_api_wrap.h | 34 -------------------------------- lnet/klnds/gnilnd/gnilnd_aries.h | 32 ++++++++++++++++++++++++++++++ lnet/klnds/gnilnd/gnilnd_gemini.h | 12 ++++++++++++ 5 files changed, 93 insertions(+), 36 deletions(-) diff --git a/lnet/klnds/gnilnd/gnilnd.c b/lnet/klnds/gnilnd/gnilnd.c index 285c5b0..e110c27 100644 --- a/lnet/klnds/gnilnd/gnilnd.c +++ b/lnet/klnds/gnilnd/gnilnd.c @@ -2095,6 +2095,11 @@ kgnilnd_dev_init(kgn_device_t *dev) GOTO(failed, rc = -EINVAL); } + rrc = kgnilnd_register_smdd_buf(dev); + if (rrc != GNI_RC_SUCCESS) { + GOTO(failed, rc = -EINVAL); + } + RETURN(0); failed: @@ -2145,6 +2150,13 @@ kgnilnd_dev_fini(kgn_device_t *dev) atomic_read(&kgnilnd_data.kgn_nthreads) == 0, "tried to shutdown with threads active\n"); + if (dev->gnd_smdd_hold_buf) { + rrc = kgnilnd_deregister_smdd_buf(dev); + LASSERTF(rrc == GNI_RC_SUCCESS, + "bad rc from deregistion of sMDD buffer: %d\n", rrc); + dev->gnd_smdd_hold_buf = NULL; + } + if (dev->gnd_rcv_fma_cqh) { rrc = kgnilnd_cq_destroy(dev->gnd_rcv_fma_cqh); LASSERTF(rrc == GNI_RC_SUCCESS, diff --git a/lnet/klnds/gnilnd/gnilnd.h b/lnet/klnds/gnilnd/gnilnd.h index b75d850..e2d1a72 100644 --- a/lnet/klnds/gnilnd/gnilnd.h +++ b/lnet/klnds/gnilnd/gnilnd.h @@ -589,6 +589,8 @@ typedef struct kgn_device { atomic_t gnd_n_schedule; atomic_t gnd_canceled_dgrams; /* # of outstanding cancels */ struct rw_semaphore gnd_conn_sem; /* serialize connection changes/data movement */ + void *gnd_smdd_hold_buf; /* buffer to keep smdd */ + gni_mem_handle_t gnd_smdd_hold_hndl; /* buffer mem handle */ } kgn_device_t; typedef struct kgn_net { @@ -1982,6 +1984,8 @@ kgnilnd_conn_dgram_type2str(kgn_dgram_type_t type) /* pulls in tunables per platform and adds in nid/nic conversion * if RCA wasn't available at build time */ #include "gnilnd_hss_ops.h" +/* API wrapper functions - include late to pick up all of the other defines */ +#include "gnilnd_api_wrap.h" #if defined(CONFIG_CRAY_GEMINI) #include "gnilnd_gemini.h" @@ -1991,7 +1995,38 @@ kgnilnd_conn_dgram_type2str(kgn_dgram_type_t type) #error "Undefined Network Hardware Type" #endif -/* API wrapper functions - include late to pick up all of the other defines */ -#include "gnilnd_api_wrap.h" +extern uint32_t kgni_driver_version; + +static inline void +kgnilnd_check_kgni_version(void) +{ + uint32_t *kdv; + + kgnilnd_data.kgn_enable_gl_mutex = 1; + kdv = symbol_get(kgni_driver_version); + if (!kdv) { + LCONSOLE_INFO("Not using thread safe locking -" + " no symbol kgni_driver_version\n"); + return; + } + + /* Thread-safe kgni implemented in minor ver 0x44/45, code rev 0xb9 */ + if (*kdv < GNI_VERSION_CHECK(0, GNILND_KGNI_TS_MINOR_VER, 0xb9)) { + symbol_put(kgni_driver_version); + LCONSOLE_INFO("Not using thread safe locking, gni version 0x%x," + " need >= 0x%x\n", *kdv, + GNI_VERSION_CHECK(0, GNILND_KGNI_TS_MINOR_VER, 0xb9)); + return; + } + + symbol_put(kgni_driver_version); + + if (!*kgnilnd_tunables.kgn_thread_safe) { + return; + } + + /* Use thread-safe locking */ + kgnilnd_data.kgn_enable_gl_mutex = 0; +} #endif /* _GNILND_GNILND_H_ */ diff --git a/lnet/klnds/gnilnd/gnilnd_api_wrap.h b/lnet/klnds/gnilnd/gnilnd_api_wrap.h index a22c665..15be388 100644 --- a/lnet/klnds/gnilnd/gnilnd_api_wrap.h +++ b/lnet/klnds/gnilnd/gnilnd_api_wrap.h @@ -103,40 +103,6 @@ #define CFS_FAIL_GNI_DGRAM_DEADLINE 0xf053 #define CFS_FAIL_GNI_DGRAM_DROP_TX 0xf054 -extern uint32_t kgni_driver_version; - -static inline void -kgnilnd_check_kgni_version(void) -{ - uint32_t *kdv; - - kgnilnd_data.kgn_enable_gl_mutex = 1; - kdv = symbol_get(kgni_driver_version); - if (!kdv) { - LCONSOLE_INFO("Not using thread safe locking -" - " no symbol kgni_driver_version\n"); - return; - } - - /* Thread-safe kgni implemented in minor ver 0x44/45, code rev 0xb9 */ - if (*kdv < GNI_VERSION_CHECK(0, GNILND_KGNI_TS_MINOR_VER, 0xb9)) { - symbol_put(kgni_driver_version); - LCONSOLE_INFO("Not using thread safe locking, gni version 0x%x," - " need >= 0x%x\n", *kdv, - GNI_VERSION_CHECK(0, GNILND_KGNI_TS_MINOR_VER, 0xb9)); - return; - } - - symbol_put(kgni_driver_version); - - if (!*kgnilnd_tunables.kgn_thread_safe) { - return; - } - - /* Use thread-safe locking */ - kgnilnd_data.kgn_enable_gl_mutex = 0; -} - /* helper macros */ extern void _kgnilnd_api_rc_lbug(const char *rcstr, int rc, struct libcfs_debug_msg_data *data, diff --git a/lnet/klnds/gnilnd/gnilnd_aries.h b/lnet/klnds/gnilnd/gnilnd_aries.h index 50ef0b8..70a62af 100644 --- a/lnet/klnds/gnilnd/gnilnd_aries.h +++ b/lnet/klnds/gnilnd/gnilnd_aries.h @@ -58,6 +58,38 @@ #define GNILND_KGNI_TS_MINOR_VER 0x45 #define GNILND_TS_ENABLE 1 +/* register some memory to allocate a shared mdd */ +static inline gni_return_t +kgnilnd_register_smdd_buf(kgn_device_t *dev) +{ + __u32 flags = GNI_MEM_READWRITE; + + if (*kgnilnd_tunables.kgn_bte_relaxed_ordering) { + flags |= GNI_MEM_RELAXED_PI_ORDERING; + } + + LIBCFS_ALLOC(dev->gnd_smdd_hold_buf, PAGE_SIZE); + if (!dev->gnd_smdd_hold_buf) { + CERROR("Can't allocate smdd hold buffer\n"); + return GNI_RC_ERROR_RESOURCE; + } + + return kgnilnd_mem_register(dev->gnd_handle, + (__u64)dev->gnd_smdd_hold_buf, + PAGE_SIZE, NULL, flags, + &dev->gnd_smdd_hold_hndl); +} + +static inline gni_return_t +kgnilnd_deregister_smdd_buf(kgn_device_t *dev) +{ + gni_return_t rc = kgnilnd_mem_deregister(dev->gnd_handle, + &dev->gnd_smdd_hold_hndl, 0); + LIBCFS_FREE(dev->gnd_smdd_hold_buf, PAGE_SIZE); + + return rc; +} + /* plug in our functions for use on the simulator */ #if !defined(GNILND_USE_RCA) diff --git a/lnet/klnds/gnilnd/gnilnd_gemini.h b/lnet/klnds/gnilnd/gnilnd_gemini.h index d405bcf..4cb36a90 100644 --- a/lnet/klnds/gnilnd/gnilnd_gemini.h +++ b/lnet/klnds/gnilnd/gnilnd_gemini.h @@ -42,4 +42,16 @@ #define GNILND_KGNI_TS_MINOR_VER 0x44 #define GNILND_TS_ENABLE 0 +static inline gni_return_t +kgnilnd_register_smdd_buf(kgn_device_t *dev) +{ + return GNI_RC_SUCCESS; +} + +static inline gni_return_t +kgnilnd_deregister_smdd_buf(kgn_device_t *dev) +{ + return GNI_RC_SUCCESS; +} + #endif /* _GNILND_GEMINI_H */ -- 1.8.3.1