--- /dev/null
+Bottom: fad6610d1d2786b12bafb5cd923f53cfb674ebdb
+Top: 1b26eded9caf73f86edaf805711f031f86f8a82c
+Author: Sean Hefty <sean.hefty@intel.com>
+Date: 2011-06-27 22:25:28 -0700
+
+Refresh of counters
+
+---
+
+diff --git a/src/acm.c b/src/acm.c
+index 8b01adb..1380124 100644
+--- a/src/acm.c
++++ b/src/acm.c
+@@ -60,6 +60,16 @@ enum acm_state {
+ ACM_READY
+ };
+
++enum {
++ ACM_CNTR_ERROR,
++ ACM_CNTR_REQUEST,
++ ACM_CNTR_ADDR_CACHE,
++ ACM_CNTR_ADDR_QUERY,
++ ACM_CNTR_ROUTE_CACHE,
++ ACM_CNTR_ROUTE_QUERY,
++ ACM_MAX_COUNTER
++};
++
+ enum acm_addr_prot {
+ ACM_ADDR_PROT_ACM
+ };
+@@ -194,7 +204,11 @@ static struct acm_client client[FD_SETSIZE - 1];
+ static FILE *flog;
+ static lock_t log_lock;
+ PER_THREAD char log_data[ACM_MAX_ADDRESS];
++static atomic_t counter[ACM_MAX_COUNTER];
+
++/*
++ * Service options - may be set through acm_opts file.
++ */
+ static char *opts_file = "/etc/ibacm/acm_opts.cfg";
+ static char *addr_file = "/etc/ibacm/acm_addr.cfg";
+ static char log_file[128] = "/var/log/ibacm.log";
+@@ -893,6 +907,7 @@ static uint8_t acm_resolve_path(struct acm_ep *ep, struct acm_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]);
+ dest->state = ACM_QUERY_ROUTE;
+ acm_post_send(&ep->sa_queue, msg);
+ return ACM_STATUS_SUCCESS;
+@@ -1848,6 +1863,7 @@ acm_svr_query_path(struct acm_client *client, struct acm_resolve_msg *msg)
+ memcpy(mad->data, &msg->data[0].info.path, sizeof(struct ibv_path_record));
+ mad->comp_mask = acm_path_comp_mask(&msg->data[0].info.path);
+
++ atomic_inc(&counter[ACM_CNTR_ROUTE_QUERY]);
+ acm_post_send(&ep->sa_queue, sa_msg);
+ return ACM_STATUS_SUCCESS;
+
+@@ -1896,6 +1912,7 @@ acm_send_resolve(struct acm_ep *ep, struct acm_dest *dest,
+ 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_post_send(&ep->resolve_queue, msg);
+ return 0;
+ }
+@@ -2082,10 +2099,12 @@ acm_svr_resolve(struct acm_client *client, struct acm_resolve_msg *msg)
+ switch (dest->state) {
+ case ACM_READY:
+ acm_log(2, "request satisfied from local cache\n");
++ atomic_inc(&counter[ACM_CNTR_ROUTE_CACHE]);
+ status = ACM_STATUS_SUCCESS;
+ break;
+ case ACM_ADDR_RESOLVED:
+ acm_log(2, "have address, resolving route\n");
++ atomic_inc(&counter[ACM_CNTR_ADDR_CACHE]);
+ status = acm_resolve_path(ep, dest, acm_dest_sa_resp);
+ if (status) {
+ break;
+@@ -2175,6 +2194,7 @@ acm_svr_resolve_path(struct acm_client *client, struct acm_resolve_msg *msg)
+ switch (dest->state) {
+ case ACM_READY:
+ acm_log(2, "request satisfied from local cache\n");
++ atomic_inc(&counter[ACM_CNTR_ROUTE_CACHE]);
+ status = ACM_STATUS_SUCCESS;
+ break;
+ case ACM_INIT:
+@@ -2223,6 +2243,7 @@ static void acm_svr_receive(struct acm_client *client)
+ goto out;
+ }
+
++ atomic_inc(&counter[ACM_CNTR_REQUEST]);
+ if (msg.hdr.version != ACM_VERSION) {
+ acm_log(0, "ERROR - unsupported version %d\n", msg.hdr.version);
+ goto out;
+@@ -2577,9 +2598,6 @@ acm_alloc_ep(struct acm_port *port, uint16_t pkey, uint16_t pkey_index)
+ DListInit(&ep->wait_queue);
+ lock_init(&ep->lock);
+
+- for (i = 0; i < MAX_EP_MC; i++)
+- acm_init_dest(&ep->mc_dest[i], ACM_ADDRESS_GID, NULL, 0);
+-
+ return ep;
+ }
+
+@@ -3080,7 +3098,7 @@ static void show_usage(char *program)
+
+ int CDECL_FUNC main(int argc, char **argv)
+ {
+- int op, daemon = 1;
++ int i, op, daemon = 1;
+
+ while ((op = getopt(argc, argv, "DA:O:")) != -1) {
+ switch (op) {
+@@ -3120,6 +3138,9 @@ int CDECL_FUNC main(int argc, char **argv)
+ DListInit(&dev_list);
+ DListInit(&timeout_list);
+ event_init(&timeout_event);
++ for (i = 0; i < ACM_MAX_COUNTER; i++)
++ atomic_init(&counter[i]);
++
+ umad_init();
+ if (acm_open_devices()) {
+ acm_log(0, "ERROR - unable to open any devices\n");