--- /dev/null
+Bottom: 07014405cca6b5e9bb67a82361b2ec1d634f6281
+Top: 35fd60e5ad8d8c58e2774173414af34ecd73c204
+Author: Kaike Wan <kaike.wan@intel.com>
+Date: 2014-06-20 08:55:23 -0700
+
+ibacm/prov: export a function to increment performance counters
+
+Instead of exposing the combined counters directly, this patch exports a
+function to providers to increment the combined counters. This offers better
+encapsulation and avoids exposing the private type atomic_t.
+
+Signed-off-by: Kaike Wan <kaike.wan@intel.com>
+
+
+---
+
+diff --git a/include/infiniband/acm_prov.h b/include/infiniband/acm_prov.h
+index 9e299b9..890e6ba 100644
+--- a/include/infiniband/acm_prov.h
++++ b/include/infiniband/acm_prov.h
+@@ -80,9 +80,6 @@ struct acm_provider {
+ void (*query_perf)(void *ep_context, uint64_t *values, uint8_t *cnt);
+ };
+
+-/* Variables exported from core */
+-extern atomic_t counter[ACM_MAX_COUNTER];
+-
+ int provider_query(struct acm_provider **info, uint32_t *version);
+
+ /* Functions exported from core */
+@@ -117,5 +114,6 @@ extern void acm_free_sa_mad(struct acm_sa_mad *mad);
+ extern int acm_send_sa_mad(struct acm_sa_mad *mad);
+
+ extern char * acm_get_opts_file(void);
++extern void acm_increment_counter(int type);
+
+ #endif /* ACM_PROV_H */
+diff --git a/prov/acmp/src/acmp.c b/prov/acmp/src/acmp.c
+index 5db62e2..2dd356d 100644
+--- a/prov/acmp/src/acmp.c
++++ b/prov/acmp/src/acmp.c
+@@ -798,7 +798,7 @@ static uint8_t acmp_resolve_path_sa(struct acmp_ep *ep, struct acmp_dest *dest,
+ memcpy(mad->data, &dest->path, sizeof(dest->path));
+ mad->comp_mask = acm_path_comp_mask(&dest->path);
+
+- atomic_inc(&counter[ACM_CNTR_ROUTE_QUERY]);
++ acm_increment_counter(ACM_CNTR_ROUTE_QUERY);
+ atomic_inc(&ep->counters[ACM_CNTR_ROUTE_QUERY]);
+ dest->state = ACMP_QUERY_ROUTE;
+ if (acm_send_sa_mad(sa_mad)) {
+@@ -1630,7 +1630,7 @@ acmp_query(void *addr_context, struct acm_msg *msg, uint64_t id)
+ sizeof(struct ibv_path_record));
+ mad->comp_mask = acm_path_comp_mask(&msg->resolve_data[0].info.path);
+
+- atomic_inc(&counter[ACM_CNTR_ROUTE_QUERY]);
++ acm_increment_counter(ACM_CNTR_ROUTE_QUERY);
+ atomic_inc(&ep->counters[ACM_CNTR_ROUTE_QUERY]);
+ if (acm_send_sa_mad(sa_mad)) {
+ acm_log(0, "Error - Failed to send sa mad\n");
+@@ -1691,8 +1691,8 @@ acmp_send_resolve(struct acmp_ep *ep, struct acmp_dest *dest,
+ rec->gid_cnt = (uint8_t) ep->mc_cnt;
+ for (i = 0; i < ep->mc_cnt; i++)
+ memcpy(&rec->gid[i], ep->mc_dest[i].address, 16);
+-
+- atomic_inc(&counter[ACM_CNTR_ADDR_QUERY]);
++
++ acm_increment_counter(ACM_CNTR_ADDR_QUERY);
+ atomic_inc(&ep->counters[ACM_CNTR_ADDR_QUERY]);
+ acmp_post_send(&ep->resolve_queue, msg);
+ return 0;
+@@ -1758,13 +1758,13 @@ test:
+ if (acmp_dest_timeout(dest))
+ goto test;
+ acm_log(2, "request satisfied from local cache\n");
+- atomic_inc(&counter[ACM_CNTR_ROUTE_CACHE]);
++ acm_increment_counter(ACM_CNTR_ROUTE_CACHE);
+ atomic_inc(&ep->counters[ACM_CNTR_ROUTE_CACHE]);
+ status = ACM_STATUS_SUCCESS;
+ break;
+ case ACMP_ADDR_RESOLVED:
+ acm_log(2, "have address, resolving route\n");
+- atomic_inc(&counter[ACM_CNTR_ADDR_CACHE]);
++ acm_increment_counter(ACM_CNTR_ADDR_CACHE);
+ atomic_inc(&ep->counters[ACM_CNTR_ADDR_CACHE]);
+ status = acmp_resolve_path_sa(ep, dest, acmp_dest_sa_resp);
+ if (status) {
+@@ -1833,7 +1833,7 @@ test:
+ if (acmp_dest_timeout(dest))
+ goto test;
+ acm_log(2, "request satisfied from local cache\n");
+- atomic_inc(&counter[ACM_CNTR_ROUTE_CACHE]);
++ acm_increment_counter(ACM_CNTR_ROUTE_CACHE);
+ atomic_inc(&ep->counters[ACM_CNTR_ROUTE_CACHE]);
+ status = ACM_STATUS_SUCCESS;
+ break;
+diff --git a/src/acm.c b/src/acm.c
+index 97b773e..8f147ef 100644
+--- a/src/acm.c
++++ b/src/acm.c
+@@ -163,7 +163,7 @@ static struct acmc_client client_array[FD_SETSIZE - 1];
+ static FILE *flog;
+ static lock_t log_lock;
+ PER_THREAD char log_data[ACM_MAX_ADDRESS];
+-atomic_t counter[ACM_MAX_COUNTER];
++static atomic_t counter[ACM_MAX_COUNTER];
+
+ static struct acmc_device *
+ acm_get_device_from_gid(union ibv_gid *sgid, uint8_t *port);
+@@ -261,6 +261,12 @@ char * acm_get_opts_file(void)
+ return opts_file;
+ }
+
++void acm_increment_counter(int type)
++{
++ if (type >= 0 && type < ACM_MAX_COUNTER)
++ atomic_inc(&counter[type]);
++}
++
+ static struct acmc_prov_context *
+ acm_alloc_prov_context(struct acm_provider *prov)
+ {