--- /dev/null
+Bottom: 1b26eded9caf73f86edaf805711f031f86f8a82c
+Top: 590da5d69e0758287825bf4e7f25cfd32e149041
+Author: Sean Hefty <sean.hefty@intel.com>
+Date: 2011-06-27 22:46:45 -0700
+
+Refresh of counters
+
+---
+
+diff --git a/include/infiniband/acm.h b/include/infiniband/acm.h
+index 143d512..7f55b47 100644
+--- a/include/infiniband/acm.h
++++ b/include/infiniband/acm.h
+@@ -37,6 +37,7 @@
+
+ #define ACM_OP_MASK 0x0F
+ #define ACM_OP_RESOLVE 0x01
++#define ACM_OP_PERF_QUERY 0x02
+ #define ACM_OP_ACK 0x80
+
+ #define ACM_STATUS_SUCCESS 0
+@@ -97,6 +98,11 @@ struct acm_resolve_msg {
+ struct acm_ep_addr_data data[0];
+ };
+
++struct acm_perf_msg {
++ struct acm_hdr hdr;
++ uint64_t data[0];
++};
++
+ struct acm_msg {
+ struct acm_hdr hdr;
+ uint8_t data[ACM_MSG_DATA_LENGTH];
+diff --git a/src/acm.c b/src/acm.c
+index 1380124..679af44 100644
+--- a/src/acm.c
++++ b/src/acm.c
+@@ -62,7 +62,7 @@ enum acm_state {
+
+ enum {
+ ACM_CNTR_ERROR,
+- ACM_CNTR_REQUEST,
++ ACM_CNTR_RESOLVE,
+ ACM_CNTR_ADDR_CACHE,
+ ACM_CNTR_ADDR_QUERY,
+ ACM_CNTR_ROUTE_CACHE,
+@@ -2055,7 +2055,7 @@ acm_svr_queue_req(struct acm_dest *dest, struct acm_client *client,
+ }
+
+ static int
+-acm_svr_resolve(struct acm_client *client, struct acm_resolve_msg *msg)
++acm_svr_resolve_dest(struct acm_client *client, struct acm_resolve_msg *msg)
+ {
+ struct acm_ep *ep;
+ struct acm_dest *dest;
+@@ -2229,6 +2229,25 @@ put:
+ return ret;
+ }
+
++static int acm_svr_resolve(struct acm_client *client, struct acm_resolve_msg *msg)
++{
++ if (msg->data[0].type == ACM_EP_INFO_PATH) {
++ if (msg->data[0].flags & ACM_FLAGS_QUERY_SA) {
++ return acm_svr_query_path(client, msg);
++ } else {
++ return acm_svr_resolve_path(client, msg);
++ }
++ } else {
++ return acm_svr_resolve_dest(client, msg);
++ }
++}
++
++static int acm_svr_perf_query(struct acm_client *client, struct acm_perf_msg *msg)
++{
++ /* TODO: return perf counters */
++ return 0;
++}
++
+ static void acm_svr_receive(struct acm_client *client)
+ {
+ struct acm_msg msg;
+@@ -2243,25 +2262,22 @@ 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;
+ }
+
+- if ((msg.hdr.opcode & ACM_OP_MASK) != ACM_OP_RESOLVE) {
++ switch (msg.hdr.opcode & ACM_OP_MASK) {
++ case ACM_OP_RESOLVE:
++ atomic_inc(&counter[ACM_CNTR_RESOLVE]);
++ ret = acm_svr_resolve(client, (struct acm_resolve_msg *) &msg);
++ break;
++ case ACM_OP_PERF_QUERY:
++ ret = acm_svr_perf_query(client, (struct acm_perf_msg *) &msg);
++ break;
++ default:
+ acm_log(0, "ERROR - unknown opcode 0x%x\n", msg.hdr.opcode);
+- goto out;
+- }
+-
+- if (resolve_msg->data[0].type == ACM_EP_INFO_PATH) {
+- if (resolve_msg->data[0].flags & ACM_FLAGS_QUERY_SA) {
+- ret = acm_svr_query_path(client, resolve_msg);
+- } else {
+- ret = acm_svr_resolve_path(client, resolve_msg);
+- }
+- } else {
+- ret = acm_svr_resolve(client, resolve_msg);
++ break;
+ }
+
+ out: