summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/ib/clients/rdsv3/ib.c9
-rw-r--r--usr/src/uts/common/io/ib/clients/rdsv3/ib_stats.c4
-rw-r--r--usr/src/uts/common/io/ib/clients/rdsv3/stats.c18
-rw-r--r--usr/src/uts/common/sys/ib/clients/rdsv3/ib.h5
-rw-r--r--usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3.h28
-rw-r--r--usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3_impl.h5
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