IB/qib: Remove ibport and use rdmavt version
Remove several ibport members from qib and use the rdmavt version. rc_acks, rc_qacks, and rc_delayed_comp are defined as per CPU variables in rdmavt. Add support for these rdmavt per CPU variables which were not per cpu variables in qib ibport structure. Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Harish Chegondi <harish.chegondi@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Tento commit je obsažen v:
@@ -406,7 +406,13 @@ static struct kobj_type qib_sl2vl_ktype = {
|
||||
#define QIB_DIAGC_ATTR(N) \
|
||||
static struct qib_diagc_attr qib_diagc_attr_##N = { \
|
||||
.attr = { .name = __stringify(N), .mode = 0664 }, \
|
||||
.counter = offsetof(struct qib_ibport, n_##N) \
|
||||
.counter = offsetof(struct qib_ibport, rvp.n_##N) \
|
||||
}
|
||||
|
||||
#define QIB_DIAGC_ATTR_PER_CPU(N) \
|
||||
static struct qib_diagc_attr qib_diagc_attr_##N = { \
|
||||
.attr = { .name = __stringify(N), .mode = 0664 }, \
|
||||
.counter = offsetof(struct qib_ibport, rvp.z_##N) \
|
||||
}
|
||||
|
||||
struct qib_diagc_attr {
|
||||
@@ -414,10 +420,11 @@ struct qib_diagc_attr {
|
||||
size_t counter;
|
||||
};
|
||||
|
||||
QIB_DIAGC_ATTR_PER_CPU(rc_acks);
|
||||
QIB_DIAGC_ATTR_PER_CPU(rc_qacks);
|
||||
QIB_DIAGC_ATTR_PER_CPU(rc_delayed_comp);
|
||||
|
||||
QIB_DIAGC_ATTR(rc_resends);
|
||||
QIB_DIAGC_ATTR(rc_acks);
|
||||
QIB_DIAGC_ATTR(rc_qacks);
|
||||
QIB_DIAGC_ATTR(rc_delayed_comp);
|
||||
QIB_DIAGC_ATTR(seq_naks);
|
||||
QIB_DIAGC_ATTR(rdma_seq);
|
||||
QIB_DIAGC_ATTR(rnr_naks);
|
||||
@@ -449,6 +456,35 @@ static struct attribute *diagc_default_attributes[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static u64 get_all_cpu_total(u64 __percpu *cntr)
|
||||
{
|
||||
int cpu;
|
||||
u64 counter = 0;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
counter += *per_cpu_ptr(cntr, cpu);
|
||||
return counter;
|
||||
}
|
||||
|
||||
#define def_write_per_cpu(cntr) \
|
||||
static void write_per_cpu_##cntr(struct qib_pportdata *ppd, u32 data) \
|
||||
{ \
|
||||
struct qib_devdata *dd = ppd->dd; \
|
||||
struct qib_ibport *qibp = &ppd->ibport_data; \
|
||||
/* A write can only zero the counter */ \
|
||||
if (data == 0) \
|
||||
qibp->rvp.z_##cntr = get_all_cpu_total(qibp->rvp.cntr); \
|
||||
else \
|
||||
qib_dev_err(dd, "Per CPU cntrs can only be zeroed"); \
|
||||
}
|
||||
|
||||
def_write_per_cpu(rc_acks)
|
||||
def_write_per_cpu(rc_qacks)
|
||||
def_write_per_cpu(rc_delayed_comp)
|
||||
|
||||
#define READ_PER_CPU_CNTR(cntr) (get_all_cpu_total(qibp->rvp.cntr) - \
|
||||
qibp->rvp.z_##cntr)
|
||||
|
||||
static ssize_t diagc_attr_show(struct kobject *kobj, struct attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
@@ -458,7 +494,16 @@ static ssize_t diagc_attr_show(struct kobject *kobj, struct attribute *attr,
|
||||
container_of(kobj, struct qib_pportdata, diagc_kobj);
|
||||
struct qib_ibport *qibp = &ppd->ibport_data;
|
||||
|
||||
return sprintf(buf, "%u\n", *(u32 *)((char *)qibp + dattr->counter));
|
||||
if (!strncmp(dattr->attr.name, "rc_acks", 7))
|
||||
return sprintf(buf, "%llu\n", READ_PER_CPU_CNTR(rc_acks));
|
||||
else if (!strncmp(dattr->attr.name, "rc_qacks", 8))
|
||||
return sprintf(buf, "%llu\n", READ_PER_CPU_CNTR(rc_qacks));
|
||||
else if (!strncmp(dattr->attr.name, "rc_delayed_comp", 15))
|
||||
return sprintf(buf, "%llu\n",
|
||||
READ_PER_CPU_CNTR(rc_delayed_comp));
|
||||
else
|
||||
return sprintf(buf, "%u\n",
|
||||
*(u32 *)((char *)qibp + dattr->counter));
|
||||
}
|
||||
|
||||
static ssize_t diagc_attr_store(struct kobject *kobj, struct attribute *attr,
|
||||
@@ -475,7 +520,15 @@ static ssize_t diagc_attr_store(struct kobject *kobj, struct attribute *attr,
|
||||
ret = kstrtou32(buf, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
*(u32 *)((char *) qibp + dattr->counter) = val;
|
||||
|
||||
if (!strncmp(dattr->attr.name, "rc_acks", 7))
|
||||
write_per_cpu_rc_acks(ppd, val);
|
||||
else if (!strncmp(dattr->attr.name, "rc_qacks", 8))
|
||||
write_per_cpu_rc_qacks(ppd, val);
|
||||
else if (!strncmp(dattr->attr.name, "rc_delayed_comp", 15))
|
||||
write_per_cpu_rc_delayed_comp(ppd, val);
|
||||
else
|
||||
*(u32 *)((char *)qibp + dattr->counter) = val;
|
||||
return size;
|
||||
}
|
||||
|
||||
|
Odkázat v novém úkolu
Zablokovat Uživatele