diff options
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/io/ib/clients/rdsv3/ib.c | 9 | ||||
| -rw-r--r-- | usr/src/uts/common/io/ib/clients/rdsv3/ib_stats.c | 4 | ||||
| -rw-r--r-- | usr/src/uts/common/io/ib/clients/rdsv3/stats.c | 18 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/ib/clients/rdsv3/ib.h | 5 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3.h | 28 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3_impl.h | 5 |
6 files changed, 39 insertions, 30 deletions
diff --git a/usr/src/uts/common/io/ib/clients/rdsv3/ib.c b/usr/src/uts/common/io/ib/clients/rdsv3/ib.c index e64e3b2617..86ca34000a 100644 --- a/usr/src/uts/common/io/ib/clients/rdsv3/ib.c +++ b/usr/src/uts/common/io/ib/clients/rdsv3/ib.c @@ -385,6 +385,8 @@ rdsv3_ib_exit(void) rdsv3_ib_sysctl_exit(); rdsv3_ib_recv_exit(); rdsv3_trans_unregister(&rdsv3_ib_transport); + kmem_free(rdsv3_ib_stats, + nr_cpus * sizeof (struct rdsv3_ib_statistics)); mutex_destroy(&ib_nodev_conns_lock); list_destroy(&ib_nodev_conns); list_destroy(&rdsv3_ib_devices); @@ -435,6 +437,11 @@ rdsv3_ib_init(void) offsetof(struct rdsv3_ib_connection, ib_node)); mutex_init(&ib_nodev_conns_lock, NULL, MUTEX_DRIVER, NULL); + /* allocate space for ib statistics */ + ASSERT(rdsv3_ib_stats == NULL); + rdsv3_ib_stats = kmem_zalloc(nr_cpus * + sizeof (struct rdsv3_ib_statistics), KM_SLEEP); + rdsv3_ib_client.dip = rdsv3_dev_info; ret = ib_register_client(&rdsv3_ib_client); if (ret) @@ -465,6 +472,8 @@ out_sysctl: out_ibreg: ib_unregister_client(&rdsv3_ib_client); out: + kmem_free(rdsv3_ib_stats, + nr_cpus * sizeof (struct rdsv3_ib_statistics)); mutex_destroy(&ib_nodev_conns_lock); list_destroy(&ib_nodev_conns); list_destroy(&rdsv3_ib_devices); diff --git a/usr/src/uts/common/io/ib/clients/rdsv3/ib_stats.c b/usr/src/uts/common/io/ib/clients/rdsv3/ib_stats.c index d925c94222..d7dd82aab9 100644 --- a/usr/src/uts/common/io/ib/clients/rdsv3/ib_stats.c +++ b/usr/src/uts/common/io/ib/clients/rdsv3/ib_stats.c @@ -47,7 +47,7 @@ #include <sys/ib/clients/rdsv3/ib.h> #include <sys/ib/clients/rdsv3/rdsv3_debug.h> -RDSV3_DEFINE_PER_CPU(struct rdsv3_ib_statistics, rdsv3_ib_stats); +struct rdsv3_ib_statistics *rdsv3_ib_stats = NULL; static char *rdsv3_ib_stat_names[] = { "ib_connect_raced", @@ -95,7 +95,7 @@ rdsv3_ib_stats_info_copy(struct rdsv3_info_iterator *iter, if (avail < ARRAY_SIZE(rdsv3_ib_stat_names)) goto out; - for (cpu = 0; cpu < NR_CPUS; cpu++) { + for (cpu = 0; cpu < nr_cpus; cpu++) { src = (uint64_t *)&(rdsv3_per_cpu(rdsv3_ib_stats, cpu)); sum = (uint64_t *)&stats; for (i = 0; i < sizeof (stats) / sizeof (uint64_t); i++) diff --git a/usr/src/uts/common/io/ib/clients/rdsv3/stats.c b/usr/src/uts/common/io/ib/clients/rdsv3/stats.c index 47f9c2e8c9..26406815f6 100644 --- a/usr/src/uts/common/io/ib/clients/rdsv3/stats.c +++ b/usr/src/uts/common/io/ib/clients/rdsv3/stats.c @@ -45,7 +45,8 @@ #include <sys/ib/clients/rdsv3/rdsv3.h> -RDSV3_DEFINE_PER_CPU(struct rdsv3_statistics, rdsv3_stats); +struct rdsv3_statistics *rdsv3_stats = NULL; +uint_t nr_cpus; static char *rdsv3_stat_names[] = { "conn_reset", @@ -132,7 +133,7 @@ rdsv3_stats_info(struct rsock *sock, unsigned int len, bzero(&stats, sizeof (struct rdsv3_statistics)); - for (cpu = 0; cpu < NR_CPUS; cpu++) { + for (cpu = 0; cpu < nr_cpus; cpu++) { src = (uint64_t *)&(rdsv3_per_cpu(rdsv3_stats, cpu)); sum = (uint64_t *)&stats; for (i = 0; @@ -155,11 +156,24 @@ void rdsv3_stats_exit(void) { rdsv3_info_deregister_func(RDS_INFO_COUNTERS, rdsv3_stats_info); + + ASSERT(rdsv3_stats); + kmem_free(rdsv3_stats, + nr_cpus * sizeof (struct rdsv3_statistics)); + rdsv3_stats = NULL; } int rdsv3_stats_init(void) { + /* + * Note the max number of cpus that ths system can have at most. + */ + nr_cpus = max_ncpus; + ASSERT(rdsv3_stats == NULL); + rdsv3_stats = kmem_zalloc(nr_cpus * + sizeof (struct rdsv3_statistics), KM_SLEEP); + rdsv3_info_register_func(RDS_INFO_COUNTERS, rdsv3_stats_info); return (0); } diff --git a/usr/src/uts/common/sys/ib/clients/rdsv3/ib.h b/usr/src/uts/common/sys/ib/clients/rdsv3/ib.h index 8e1f0f74a6..23593ec94f 100644 --- a/usr/src/uts/common/sys/ib/clients/rdsv3/ib.h +++ b/usr/src/uts/common/sys/ib/clients/rdsv3/ib.h @@ -362,8 +362,9 @@ int rdsv3_ib_send_grab_credits(struct rdsv3_ib_connection *ic, uint32_t wanted, uint32_t *adv_credits, int need_posted); /* ib_stats.c */ -RDSV3_DECLARE_PER_CPU(struct rdsv3_ib_statistics, rdsv3_ib_stats); -#define rdsv3_ib_stats_inc(member) rdsv3_stats_inc_which(rdsv3_ib_stats, member) +extern struct rdsv3_ib_statistics *rdsv3_ib_stats; +#define rdsv3_ib_stats_inc(member) \ + rdsv3_stats_add_which(rdsv3_ib_stats, member, 1) unsigned int rdsv3_ib_stats_info_copy(struct rdsv3_info_iterator *iter, unsigned int avail); diff --git a/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3.h b/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3.h index a4b47b9bac..e39d4347da 100644 --- a/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3.h +++ b/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3.h @@ -38,6 +38,9 @@ extern "C" { #include <sys/ib/clients/rdsv3/rdsv3_impl.h> #include <sys/ib/clients/rdsv3/info.h> +#include <sys/cpuvar.h> +#include <sys/disp.h> + #define NIPQUAD(addr) \ (unsigned char)((ntohl(addr) >> 24) & 0xFF), \ (unsigned char)((ntohl(addr) >> 16) & 0xFF), \ @@ -67,17 +70,6 @@ extern "C" { #define RDSV3_REAPER_WAIT_SECS (5*60) #define RDSV3_REAPER_WAIT_JIFFIES SEC_TO_TICK(RDSV3_REAPER_WAIT_SECS) -/* - * This is the sad making. Some kernels have a bug in the per_cpu() api which - * makes DEFINE_PER_CPU trigger an oops on insmod because the per-cpu section - * in the module is not cacheline-aligned. As much as we'd like to tell users - * with older kernels to stuff it, that's not reasonable. We'll roll our own - * until this doesn't have to build against older kernels. - */ -#define RDSV3_DEFINE_PER_CPU(type, var) type var[NR_CPUS] -#define RDSV3_DECLARE_PER_CPU(type, var) extern type var[NR_CPUS] -#define rdsv3_per_cpu(var, cpu) var[cpu] - static inline ulong_t ceil(ulong_t x, ulong_t y) { @@ -655,16 +647,14 @@ void rdsv3_cong_exit(void); struct rdsv3_message *rdsv3_cong_update_alloc(struct rdsv3_connection *conn); /* stats.c */ -RDSV3_DECLARE_PER_CPU(struct rdsv3_statistics, rdsv3_stats); -#define rdsv3_stats_inc_which(which, member) do { \ - rdsv3_per_cpu(which, get_cpu()).member++; \ - put_cpu(); \ -} while (0) -#define rdsv3_stats_inc(member) rdsv3_stats_inc_which(rdsv3_stats, member) +extern uint_t nr_cpus; +extern struct rdsv3_statistics *rdsv3_stats; +#define rdsv3_per_cpu(var, cpu) var[cpu] #define rdsv3_stats_add_which(which, member, count) do { \ - rdsv3_per_cpu(which, get_cpu()).member += count; \ - put_cpu(); \ + rdsv3_per_cpu(which, CPU->cpu_seqid).member += count; \ } while (0) +#define rdsv3_stats_inc(member) \ + rdsv3_stats_add_which(rdsv3_stats, member, 1) #define rdsv3_stats_add(member, count) \ rdsv3_stats_add_which(rdsv3_stats, member, count) int rdsv3_stats_init(void); diff --git a/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3_impl.h b/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3_impl.h index fc9053a8b4..84eb2074df 100644 --- a/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3_impl.h +++ b/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3_impl.h @@ -136,11 +136,6 @@ uint_t rdsv3_one_sec_in_hz; #define IS_ERR(ptr) (((uintptr_t)ptr) >= (uintptr_t)-MAX_ERRNO) #define PTR_ERR(ptr) (int)(uintptr_t)ptr -/* cpu */ -#define NR_CPUS 1 -#define put_cpu() -#define get_cpu() 0 - #define MAX_SCHEDULE_TIMEOUT (~0UL>>1) #define RDMA_CM_EVENT_ADDR_CHANGE 14 |
