On 6/20/19 8:03 AM, Jack Wang wrote:
+void ibtrs_clt_update_rdma_lat(struct ibtrs_clt_stats *stats, bool read,
+                              unsigned long ms)
+{
+       struct ibtrs_clt_stats_pcpu *s;
+       int id;
+
+       id = ibtrs_clt_ms_to_id(ms);
+       s = this_cpu_ptr(stats->pcpu_stats);
+       if (read) {
+               s->rdma_lat_distr[id].read++;
+               if (s->rdma_lat_max.read < ms)
+                       s->rdma_lat_max.read = ms;
+       } else {
+               s->rdma_lat_distr[id].write++;
+               if (s->rdma_lat_max.write < ms)
+                       s->rdma_lat_max.write = ms;
+       }
+}

Can it happen that this function is called simultaneously from thread context and from interrupt context?

+void ibtrs_clt_update_wc_stats(struct ibtrs_clt_con *con)
+{
+       struct ibtrs_clt_sess *sess = to_clt_sess(con->c.sess);
+       struct ibtrs_clt_stats *stats = &sess->stats;
+       struct ibtrs_clt_stats_pcpu *s;
+       int cpu;
+
+       cpu = raw_smp_processor_id();
+       s = this_cpu_ptr(stats->pcpu_stats);
+       s->wc_comp.cnt++;
+       s->wc_comp.total_cnt++;
+       if (unlikely(con->cpu != cpu)) {
+               s->cpu_migr.to++;
+
+               /* Careful here, override s pointer */
+               s = per_cpu_ptr(stats->pcpu_stats, con->cpu);
+               atomic_inc(&s->cpu_migr.from);
+       }
+}

Same question here.

+void ibtrs_clt_inc_failover_cnt(struct ibtrs_clt_stats *stats)
+{
+       struct ibtrs_clt_stats_pcpu *s;
+
+       s = this_cpu_ptr(stats->pcpu_stats);
+       s->rdma.failover_cnt++;
+}

And here ...

Thanks,

Bart.

Reply via email to