* [PATCH 2/4] infiniband-diags: move core saquery functionality to ibdiag_common
@ 2011-07-05 19:08 Ira Weiny
[not found] ` <20110705120813.39fc4ab5.weiny2-i2BcT+NCU+M@public.gmane.org>
0 siblings, 1 reply; 4+ messages in thread
From: Ira Weiny @ 2011-07-05 19:08 UTC (permalink / raw)
To: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
While this is sub-optimal it is the easiest way to get saquery support to the
other diags.
Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
---
include/ibdiag_common.h | 45 +++++++++++
src/ibdiag_common.c | 172 ++++++++++++++++++++++++++++++++++++++++
src/saquery.c | 198 ++---------------------------------------------
3 files changed, 224 insertions(+), 191 deletions(-)
diff --git a/include/ibdiag_common.h b/include/ibdiag_common.h
index b113cfe..69cddfb 100644
--- a/include/ibdiag_common.h
+++ b/include/ibdiag_common.h
@@ -81,4 +81,49 @@ extern int ibdiag_process_opts(int argc, char *const argv[], void *context,
extern void ibdiag_show_usage();
extern void iberror(const char *fn, char *msg, ...);
+/* define an SA query structure to be common
+ * This is by no means optimal but it moves the saquery functionality out of
+ * the saquery tool and provides it to other utilities.
+ */
+struct bind_handle {
+ int fd, agent;
+ ib_portid_t dport;
+ struct ibmad_port *srcport;
+};
+typedef struct bind_handle * bind_handle_t;
+bind_handle_t sa_get_bind_handle(void);
+void sa_free_bind_handle(bind_handle_t h);
+
+struct sa_query_result {
+ uint32_t status;
+ unsigned result_cnt;
+ void *p_result_madw;
+};
+int sa_query(struct bind_handle *h, uint8_t method,
+ uint16_t attr, uint32_t mod, uint64_t comp_mask, uint64_t sm_key,
+ void *data, struct sa_query_result *result);
+void sa_free_result_mad(struct sa_query_result *result);
+void *sa_get_query_rec(void *mad, unsigned i);
+void sa_report_err(int status);
+
+#define cl_hton8(x) (x)
+#define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \
+ if ((int##size##_t) val != (int##size##_t) comp_with) { \
+ target = cl_hton##size((uint##size##_t) val); \
+ comp_mask |= IB_##name##_COMPMASK_##mask; \
+ }
+
+#define CHECK_AND_SET_GID(val, target, name, mask) \
+ if (valid_gid(&(val))) { \
+ memcpy(&(target), &(val), sizeof(val)); \
+ comp_mask |= IB_##name##_COMPMASK_##mask; \
+ }
+
+#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \
+ if (val) { \
+ target = val; \
+ comp_mask |= IB_##name##_COMPMASK_##mask##sel; \
+ comp_mask |= IB_##name##_COMPMASK_##mask; \
+ }
+
#endif /* _IBDIAG_COMMON_H_ */
diff --git a/src/ibdiag_common.c b/src/ibdiag_common.c
index 82f72af..6d03a43 100644
--- a/src/ibdiag_common.c
+++ b/src/ibdiag_common.c
@@ -337,3 +337,175 @@ void iberror(const char *fn, char *msg, ...)
exit(-1);
}
+
+/* define an SA query structure to be common
+ * This is by no means optimal but it moves the saquery functionality out of
+ * the saquery tool and provides it to other utilities.
+ */
+bind_handle_t sa_get_bind_handle(void)
+{
+ struct ibmad_port * srcport;
+ bind_handle_t handle;
+ int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
+
+ srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2);
+ if (!srcport) {
+ IBWARN("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
+ return (NULL);
+ }
+
+ handle = calloc(1, sizeof(*handle));
+ if (!handle)
+ IBPANIC("calloc failed");
+
+ ib_resolve_smlid_via(&handle->dport, ibd_timeout, srcport);
+ if (!handle->dport.lid) {
+ IBWARN("No SM found.");
+ free(handle);
+ return (NULL);
+ }
+
+ handle->dport.qp = 1;
+ if (!handle->dport.qkey)
+ handle->dport.qkey = IB_DEFAULT_QP1_QKEY;
+
+ handle->srcport = srcport;
+ handle->fd = mad_rpc_portid(srcport);
+ handle->agent = umad_register(handle->fd, IB_SA_CLASS, 2, 1, NULL);
+
+ return handle;
+}
+
+void sa_free_bind_handle(bind_handle_t h)
+{
+ umad_unregister(h->fd, h->agent);
+ mad_rpc_close_port(h->srcport);
+ free(h);
+}
+
+int sa_query(bind_handle_t h, uint8_t method,
+ uint16_t attr, uint32_t mod, uint64_t comp_mask,
+ uint64_t sm_key, void *data, struct sa_query_result *result)
+{
+ ib_rpc_t rpc;
+ void *umad, *mad;
+ int ret, offset, len = 256;
+
+ memset(&rpc, 0, sizeof(rpc));
+ rpc.mgtclass = IB_SA_CLASS;
+ rpc.method = method;
+ rpc.attr.id = attr;
+ rpc.attr.mod = mod;
+ rpc.mask = comp_mask;
+ rpc.datasz = IB_SA_DATA_SIZE;
+ rpc.dataoffs = IB_SA_DATA_OFFS;
+
+ umad = calloc(1, len + umad_size());
+ if (!umad)
+ IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno));
+
+ mad_build_pkt(umad, &rpc, &h->dport, NULL, data);
+
+ mad_set_field64(umad_get_mad(umad), 0, IB_SA_MKEY_F, sm_key);
+
+ if (ibdebug > 1)
+ xdump(stdout, "SA Request:\n", umad_get_mad(umad), len);
+
+ ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0);
+ if (ret < 0) {
+ IBWARN("umad_send failed: attr %u: %s\n",
+ attr, strerror(errno));
+ free(umad);
+ return (IB_ERROR);
+ }
+
+recv_mad:
+ ret = umad_recv(h->fd, umad, &len, ibd_timeout);
+ if (ret < 0) {
+ if (errno == ENOSPC) {
+ umad = realloc(umad, umad_size() + len);
+ goto recv_mad;
+ }
+ IBWARN("umad_recv failed: attr 0x%x: %s\n", attr,
+ strerror(errno));
+ free(umad);
+ return (IB_ERROR);
+ }
+
+ if ((ret = umad_status(umad)))
+ return ret;
+
+ mad = umad_get_mad(umad);
+
+ if (ibdebug > 1)
+ xdump(stdout, "SA Response:\n", mad, len);
+
+ method = (uint8_t) mad_get_field(mad, 0, IB_MAD_METHOD_F);
+ offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F);
+ result->status = mad_get_field(mad, 0, IB_MAD_STATUS_F);
+ result->p_result_madw = mad;
+ if (result->status != IB_SA_MAD_STATUS_SUCCESS)
+ result->result_cnt = 0;
+ else if (method != IB_MAD_METHOD_GET_TABLE)
+ result->result_cnt = 1;
+ else if (!offset)
+ result->result_cnt = 0;
+ else
+ result->result_cnt = (len - IB_SA_DATA_OFFS) / (offset << 3);
+
+ return 0;
+}
+
+void sa_free_result_mad(struct sa_query_result *result)
+{
+ if (result->p_result_madw) {
+ free((uint8_t *) result->p_result_madw - umad_size());
+ result->p_result_madw = NULL;
+ }
+}
+
+void *sa_get_query_rec(void *mad, unsigned i)
+{
+ int offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F);
+ return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3);
+}
+
+static const char *ib_sa_error_str[] = {
+ "SA_NO_ERROR",
+ "SA_ERR_NO_RESOURCES",
+ "SA_ERR_REQ_INVALID",
+ "SA_ERR_NO_RECORDS",
+ "SA_ERR_TOO_MANY_RECORDS",
+ "SA_ERR_REQ_INVALID_GID",
+ "SA_ERR_REQ_INSUFFICIENT_COMPONENTS",
+ "SA_ERR_REQ_DENIED",
+ "SA_ERR_STATUS_PRIO_SUGGESTED",
+ "SA_ERR_UNKNOWN"
+};
+
+#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0]))
+#define SA_ERR_UNKNOWN (ARR_SIZE(ib_sa_error_str) - 1)
+
+static inline const char *ib_sa_err_str(IN uint8_t status)
+{
+ if (status > SA_ERR_UNKNOWN)
+ status = SA_ERR_UNKNOWN;
+ return (ib_sa_error_str[status]);
+}
+
+void sa_report_err(int status)
+{
+ int st = status & 0xff;
+ char sm_err_str[64] = { 0 };
+ char sa_err_str[64] = { 0 };
+
+ if (st)
+ sprintf(sm_err_str, " SM(%s)", ib_get_err_str(st));
+
+ st = status >> 8;
+ if (st)
+ sprintf(sa_err_str, " SA(%s)", ib_sa_err_str((uint8_t) st));
+
+ fprintf(stderr, "ERROR: Query result returned 0x%04x, %s%s\n",
+ status, sm_err_str, sa_err_str);
+}
diff --git a/src/saquery.c b/src/saquery.c
index 73acea5..95f7e6e 100644
--- a/src/saquery.c
+++ b/src/saquery.c
@@ -59,19 +59,6 @@
#include "ibdiag_common.h"
-struct bind_handle {
- int fd, agent;
- ib_portid_t dport;
-};
-
-struct sa_query_result {
- uint32_t status;
- unsigned result_cnt;
- void *p_result_madw;
-};
-
-typedef struct bind_handle *bind_handle_t;
-
struct query_params {
ib_gid_t sgid, dgid, gid, mgid;
uint16_t slid, dlid, mlid;
@@ -122,121 +109,6 @@ int requested_lid_flag = 0;
uint64_t requested_guid = 0;
int requested_guid_flag = 0;
-#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0]))
-
-static const char *ib_sa_error_str[] = {
- "SA_NO_ERROR",
- "SA_ERR_NO_RESOURCES",
- "SA_ERR_REQ_INVALID",
- "SA_ERR_NO_RECORDS",
- "SA_ERR_TOO_MANY_RECORDS",
- "SA_ERR_REQ_INVALID_GID",
- "SA_ERR_REQ_INSUFFICIENT_COMPONENTS",
- "SA_ERR_REQ_DENIED",
- "SA_ERR_STATUS_PRIO_SUGGESTED",
- "SA_ERR_UNKNOWN"
-};
-
-#define SA_ERR_UNKNOWN (ARR_SIZE(ib_sa_error_str) - 1)
-
-static inline const char *ib_sa_err_str(IN uint8_t status)
-{
- if (status > SA_ERR_UNKNOWN)
- status = SA_ERR_UNKNOWN;
- return (ib_sa_error_str[status]);
-}
-
-static inline void report_err(int status)
-{
- int st = status & 0xff;
- char sm_err_str[64] = { 0 };
- char sa_err_str[64] = { 0 };
-
- if (st)
- sprintf(sm_err_str, " SM(%s)", ib_get_err_str(st));
-
- st = status >> 8;
- if (st)
- sprintf(sa_err_str, " SA(%s)", ib_sa_err_str((uint8_t) st));
-
- fprintf(stderr, "ERROR: Query result returned 0x%04x, %s%s\n",
- status, sm_err_str, sa_err_str);
-}
-
-static int sa_query(struct bind_handle *h, uint8_t method,
- uint16_t attr, uint32_t mod, uint64_t comp_mask,
- uint64_t sm_key, void *data, struct sa_query_result *result)
-{
- ib_rpc_t rpc;
- void *umad, *mad;
- int ret, offset, len = 256;
-
- memset(&rpc, 0, sizeof(rpc));
- rpc.mgtclass = IB_SA_CLASS;
- rpc.method = method;
- rpc.attr.id = attr;
- rpc.attr.mod = mod;
- rpc.mask = comp_mask;
- rpc.datasz = IB_SA_DATA_SIZE;
- rpc.dataoffs = IB_SA_DATA_OFFS;
-
- umad = calloc(1, len + umad_size());
- if (!umad)
- IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno));
-
- mad_build_pkt(umad, &rpc, &h->dport, NULL, data);
-
- mad_set_field64(umad_get_mad(umad), 0, IB_SA_MKEY_F, sm_key);
-
- if (ibdebug > 1)
- xdump(stdout, "SA Request:\n", umad_get_mad(umad), len);
-
- ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0);
- if (ret < 0)
- IBPANIC("umad_send failed: attr %u: %s\n",
- attr, strerror(errno));
-
-recv_mad:
- ret = umad_recv(h->fd, umad, &len, ibd_timeout);
- if (ret < 0) {
- if (errno == ENOSPC) {
- umad = realloc(umad, umad_size() + len);
- goto recv_mad;
- }
- IBPANIC("umad_recv failed: attr 0x%x: %s\n", attr,
- strerror(errno));
- }
-
- if ((ret = umad_status(umad)))
- return ret;
-
- mad = umad_get_mad(umad);
-
- if (ibdebug > 1)
- xdump(stdout, "SA Response:\n", mad, len);
-
- method = (uint8_t) mad_get_field(mad, 0, IB_MAD_METHOD_F);
- offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F);
- result->status = mad_get_field(mad, 0, IB_MAD_STATUS_F);
- result->p_result_madw = mad;
- if (result->status != IB_SA_MAD_STATUS_SUCCESS)
- result->result_cnt = 0;
- else if (method != IB_MAD_METHOD_GET_TABLE)
- result->result_cnt = 1;
- else if (!offset)
- result->result_cnt = 0;
- else
- result->result_cnt = (len - IB_SA_DATA_OFFS) / (offset << 3);
-
- return 0;
-}
-
-static void *sa_get_query_rec(void *mad, unsigned i)
-{
- int offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F);
- return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3);
-}
-
static unsigned valid_gid(ib_gid_t * gid)
{
ib_gid_t zero_gid;
@@ -837,14 +709,6 @@ static void dump_results(struct sa_query_result *r, void (*dump_func) (void *))
}
}
-static void sa_free_result_mad(struct sa_query_result *result)
-{
- if (result->p_result_madw) {
- free((uint8_t *) result->p_result_madw - umad_size());
- result->p_result_madw = NULL;
- }
-}
-
/**
* Get any record(s)
*/
@@ -861,7 +725,7 @@ static int get_any_records(bind_handle_t h,
}
if (result->status != IB_SA_MAD_STATUS_SUCCESS) {
- report_err(result->status);
+ sa_report_err(result->status);
return EIO;
}
@@ -1004,26 +868,6 @@ static int parse_lid_and_ports(bind_handle_t h,
return 0;
}
-#define cl_hton8(x) (x)
-#define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \
- if ((int##size##_t) val != (int##size##_t) comp_with) { \
- target = cl_hton##size((uint##size##_t) val); \
- comp_mask |= IB_##name##_COMPMASK_##mask; \
- }
-
-#define CHECK_AND_SET_GID(val, target, name, mask) \
- if (valid_gid(&(val))) { \
- memcpy(&(target), &(val), sizeof(val)); \
- comp_mask |= IB_##name##_COMPMASK_##mask; \
- }
-
-#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \
- if (val) { \
- target = val; \
- comp_mask |= IB_##name##_COMPMASK_##mask##sel; \
- comp_mask |= IB_##name##_COMPMASK_##mask; \
- }
-
/*
* Get the portinfo records available with IsSM or IsSMdisabled CapabilityMask bit on.
*/
@@ -1095,7 +939,7 @@ static int get_print_class_port_info(bind_handle_t h)
return ret;
}
if (result.status != IB_SA_MAD_STATUS_SUCCESS) {
- report_err(result.status);
+ sa_report_err(result.status);
ret = EIO;
goto Exit;
}
@@ -1434,37 +1278,6 @@ static int query_mft_records(const struct query_cmd *q, bind_handle_t h,
&mftr, 0, dump_one_mft_record);
}
-static bind_handle_t get_bind_handle(void)
-{
- static struct ibmad_port *srcport;
- static struct bind_handle handle;
- int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
-
- srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2);
- if (!srcport)
- IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
-
- ib_resolve_smlid_via(&handle.dport, ibd_timeout, srcport);
- if (!handle.dport.lid)
- IBPANIC("No SM found.");
-
- handle.dport.qp = 1;
- if (!handle.dport.qkey)
- handle.dport.qkey = IB_DEFAULT_QP1_QKEY;
-
- handle.fd = mad_rpc_portid(srcport);
- handle.agent = umad_register(handle.fd, IB_SA_CLASS, 2, 1, NULL);
-
- return &handle;
-}
-
-static void clean_up(struct bind_handle *h)
-{
- umad_unregister(h->fd, h->agent);
- umad_close_port(h->fd);
- umad_done();
-}
-
static const struct query_cmd query_cmds[] = {
{"ClassPortInfo", "CPI", CLASS_PORT_INFO,
NULL, query_class_port_info},
@@ -1861,7 +1674,10 @@ int main(int argc, char **argv)
ibdiag_show_usage();
}
- h = get_bind_handle();
+ h = sa_get_bind_handle();
+ if (!h)
+ IBPANIC("Failed to bind to the SA");
+
node_name_map = open_node_name_map(node_name_map_file);
if (src_lid && *src_lid)
@@ -1898,7 +1714,7 @@ int main(int argc, char **argv)
if (src_lid)
free(src_lid);
- clean_up(h);
+ sa_free_bind_handle(h);
close_node_name_map(node_name_map);
return (status);
}
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 4+ messages in thread[parent not found: <20110705120813.39fc4ab5.weiny2-i2BcT+NCU+M@public.gmane.org>]
* Re: [PATCH 2/4] infiniband-diags: move core saquery functionality to ibdiag_common [not found] ` <20110705120813.39fc4ab5.weiny2-i2BcT+NCU+M@public.gmane.org> @ 2011-07-08 21:41 ` Hal Rosenstock [not found] ` <4E177976.8000101-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> 0 siblings, 1 reply; 4+ messages in thread From: Hal Rosenstock @ 2011-07-08 21:41 UTC (permalink / raw) To: Ira Weiny; +Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org On 7/5/2011 3:08 PM, Ira Weiny wrote: > > While this is sub-optimal it is the easiest way to get saquery support to the > other diags. Just some nits below... > Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org> > --- > include/ibdiag_common.h | 45 +++++++++++ > src/ibdiag_common.c | 172 ++++++++++++++++++++++++++++++++++++++++ > src/saquery.c | 198 ++--------------------------------------------- > 3 files changed, 224 insertions(+), 191 deletions(-) > > diff --git a/include/ibdiag_common.h b/include/ibdiag_common.h > index b113cfe..69cddfb 100644 > --- a/include/ibdiag_common.h > +++ b/include/ibdiag_common.h Merge saquery.c copyrights into here... > @@ -81,4 +81,49 @@ extern int ibdiag_process_opts(int argc, char *const argv[], void *context, > extern void ibdiag_show_usage(); > extern void iberror(const char *fn, char *msg, ...); > > +/* define an SA query structure to be common > + * This is by no means optimal but it moves the saquery functionality out of > + * the saquery tool and provides it to other utilities. > + */ > +struct bind_handle { > + int fd, agent; > + ib_portid_t dport; > + struct ibmad_port *srcport; > +}; > +typedef struct bind_handle * bind_handle_t; > +bind_handle_t sa_get_bind_handle(void); > +void sa_free_bind_handle(bind_handle_t h); > + > +struct sa_query_result { > + uint32_t status; > + unsigned result_cnt; > + void *p_result_madw; > +}; > +int sa_query(struct bind_handle *h, uint8_t method, > + uint16_t attr, uint32_t mod, uint64_t comp_mask, uint64_t sm_key, > + void *data, struct sa_query_result *result); > +void sa_free_result_mad(struct sa_query_result *result); > +void *sa_get_query_rec(void *mad, unsigned i); > +void sa_report_err(int status); > + > +#define cl_hton8(x) (x) > +#define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \ > + if ((int##size##_t) val != (int##size##_t) comp_with) { \ > + target = cl_hton##size((uint##size##_t) val); \ > + comp_mask |= IB_##name##_COMPMASK_##mask; \ > + } > + > +#define CHECK_AND_SET_GID(val, target, name, mask) \ > + if (valid_gid(&(val))) { \ > + memcpy(&(target), &(val), sizeof(val)); \ > + comp_mask |= IB_##name##_COMPMASK_##mask; \ > + } > + > +#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \ > + if (val) { \ > + target = val; \ > + comp_mask |= IB_##name##_COMPMASK_##mask##sel; \ > + comp_mask |= IB_##name##_COMPMASK_##mask; \ > + } > + > #endif /* _IBDIAG_COMMON_H_ */ > diff --git a/src/ibdiag_common.c b/src/ibdiag_common.c > index 82f72af..6d03a43 100644 > --- a/src/ibdiag_common.c > +++ b/src/ibdiag_common.c Merge saquery.c copyrights into here... > @@ -337,3 +337,175 @@ void iberror(const char *fn, char *msg, ...) > > exit(-1); > } > + > +/* define an SA query structure to be common > + * This is by no means optimal but it moves the saquery functionality out of > + * the saquery tool and provides it to other utilities. > + */ > +bind_handle_t sa_get_bind_handle(void) > +{ > + struct ibmad_port * srcport; > + bind_handle_t handle; > + int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS }; > + > + srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2); > + if (!srcport) { > + IBWARN("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); > + return (NULL); > + } > + > + handle = calloc(1, sizeof(*handle)); > + if (!handle) > + IBPANIC("calloc failed"); Should we IBPANIC in a library or IBWARN and return NULL here or some other way to get the app to exit ? > + > + ib_resolve_smlid_via(&handle->dport, ibd_timeout, srcport); > + if (!handle->dport.lid) { > + IBWARN("No SM found."); > + free(handle); > + return (NULL); > + } > + > + handle->dport.qp = 1; > + if (!handle->dport.qkey) > + handle->dport.qkey = IB_DEFAULT_QP1_QKEY; > + > + handle->srcport = srcport; > + handle->fd = mad_rpc_portid(srcport); > + handle->agent = umad_register(handle->fd, IB_SA_CLASS, 2, 1, NULL); > + > + return handle; > +} > + > +void sa_free_bind_handle(bind_handle_t h) > +{ > + umad_unregister(h->fd, h->agent); > + mad_rpc_close_port(h->srcport); > + free(h); > +} > + > +int sa_query(bind_handle_t h, uint8_t method, > + uint16_t attr, uint32_t mod, uint64_t comp_mask, > + uint64_t sm_key, void *data, struct sa_query_result *result) > +{ > + ib_rpc_t rpc; > + void *umad, *mad; > + int ret, offset, len = 256; > + > + memset(&rpc, 0, sizeof(rpc)); > + rpc.mgtclass = IB_SA_CLASS; > + rpc.method = method; > + rpc.attr.id = attr; > + rpc.attr.mod = mod; > + rpc.mask = comp_mask; > + rpc.datasz = IB_SA_DATA_SIZE; > + rpc.dataoffs = IB_SA_DATA_OFFS; > + > + umad = calloc(1, len + umad_size()); > + if (!umad) > + IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno)); Should we IBPANIC in a library or IBWARN and return IB_ERROR here or some other way to get the app to exit ? -- Hal > + > + mad_build_pkt(umad, &rpc, &h->dport, NULL, data); > + > + mad_set_field64(umad_get_mad(umad), 0, IB_SA_MKEY_F, sm_key); > + > + if (ibdebug > 1) > + xdump(stdout, "SA Request:\n", umad_get_mad(umad), len); > + > + ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0); > + if (ret < 0) { > + IBWARN("umad_send failed: attr %u: %s\n", > + attr, strerror(errno)); > + free(umad); > + return (IB_ERROR); > + } > + > +recv_mad: > + ret = umad_recv(h->fd, umad, &len, ibd_timeout); > + if (ret < 0) { > + if (errno == ENOSPC) { > + umad = realloc(umad, umad_size() + len); > + goto recv_mad; > + } > + IBWARN("umad_recv failed: attr 0x%x: %s\n", attr, > + strerror(errno)); > + free(umad); > + return (IB_ERROR); > + } > + > + if ((ret = umad_status(umad))) > + return ret; > + > + mad = umad_get_mad(umad); > + > + if (ibdebug > 1) > + xdump(stdout, "SA Response:\n", mad, len); > + > + method = (uint8_t) mad_get_field(mad, 0, IB_MAD_METHOD_F); > + offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); > + result->status = mad_get_field(mad, 0, IB_MAD_STATUS_F); > + result->p_result_madw = mad; > + if (result->status != IB_SA_MAD_STATUS_SUCCESS) > + result->result_cnt = 0; > + else if (method != IB_MAD_METHOD_GET_TABLE) > + result->result_cnt = 1; > + else if (!offset) > + result->result_cnt = 0; > + else > + result->result_cnt = (len - IB_SA_DATA_OFFS) / (offset << 3); > + > + return 0; > +} > + > +void sa_free_result_mad(struct sa_query_result *result) > +{ > + if (result->p_result_madw) { > + free((uint8_t *) result->p_result_madw - umad_size()); > + result->p_result_madw = NULL; > + } > +} > + > +void *sa_get_query_rec(void *mad, unsigned i) > +{ > + int offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); > + return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3); > +} > + > +static const char *ib_sa_error_str[] = { > + "SA_NO_ERROR", > + "SA_ERR_NO_RESOURCES", > + "SA_ERR_REQ_INVALID", > + "SA_ERR_NO_RECORDS", > + "SA_ERR_TOO_MANY_RECORDS", > + "SA_ERR_REQ_INVALID_GID", > + "SA_ERR_REQ_INSUFFICIENT_COMPONENTS", > + "SA_ERR_REQ_DENIED", > + "SA_ERR_STATUS_PRIO_SUGGESTED", > + "SA_ERR_UNKNOWN" > +}; > + > +#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) > +#define SA_ERR_UNKNOWN (ARR_SIZE(ib_sa_error_str) - 1) > + > +static inline const char *ib_sa_err_str(IN uint8_t status) > +{ > + if (status > SA_ERR_UNKNOWN) > + status = SA_ERR_UNKNOWN; > + return (ib_sa_error_str[status]); > +} > + > +void sa_report_err(int status) > +{ > + int st = status & 0xff; > + char sm_err_str[64] = { 0 }; > + char sa_err_str[64] = { 0 }; > + > + if (st) > + sprintf(sm_err_str, " SM(%s)", ib_get_err_str(st)); > + > + st = status >> 8; > + if (st) > + sprintf(sa_err_str, " SA(%s)", ib_sa_err_str((uint8_t) st)); > + > + fprintf(stderr, "ERROR: Query result returned 0x%04x, %s%s\n", > + status, sm_err_str, sa_err_str); > +} > diff --git a/src/saquery.c b/src/saquery.c > index 73acea5..95f7e6e 100644 > --- a/src/saquery.c > +++ b/src/saquery.c > @@ -59,19 +59,6 @@ > > #include "ibdiag_common.h" > > -struct bind_handle { > - int fd, agent; > - ib_portid_t dport; > -}; > - > -struct sa_query_result { > - uint32_t status; > - unsigned result_cnt; > - void *p_result_madw; > -}; > - > -typedef struct bind_handle *bind_handle_t; > - > struct query_params { > ib_gid_t sgid, dgid, gid, mgid; > uint16_t slid, dlid, mlid; > @@ -122,121 +109,6 @@ int requested_lid_flag = 0; > uint64_t requested_guid = 0; > int requested_guid_flag = 0; > > -#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) > - > -static const char *ib_sa_error_str[] = { > - "SA_NO_ERROR", > - "SA_ERR_NO_RESOURCES", > - "SA_ERR_REQ_INVALID", > - "SA_ERR_NO_RECORDS", > - "SA_ERR_TOO_MANY_RECORDS", > - "SA_ERR_REQ_INVALID_GID", > - "SA_ERR_REQ_INSUFFICIENT_COMPONENTS", > - "SA_ERR_REQ_DENIED", > - "SA_ERR_STATUS_PRIO_SUGGESTED", > - "SA_ERR_UNKNOWN" > -}; > - > -#define SA_ERR_UNKNOWN (ARR_SIZE(ib_sa_error_str) - 1) > - > -static inline const char *ib_sa_err_str(IN uint8_t status) > -{ > - if (status > SA_ERR_UNKNOWN) > - status = SA_ERR_UNKNOWN; > - return (ib_sa_error_str[status]); > -} > - > -static inline void report_err(int status) > -{ > - int st = status & 0xff; > - char sm_err_str[64] = { 0 }; > - char sa_err_str[64] = { 0 }; > - > - if (st) > - sprintf(sm_err_str, " SM(%s)", ib_get_err_str(st)); > - > - st = status >> 8; > - if (st) > - sprintf(sa_err_str, " SA(%s)", ib_sa_err_str((uint8_t) st)); > - > - fprintf(stderr, "ERROR: Query result returned 0x%04x, %s%s\n", > - status, sm_err_str, sa_err_str); > -} > - > -static int sa_query(struct bind_handle *h, uint8_t method, > - uint16_t attr, uint32_t mod, uint64_t comp_mask, > - uint64_t sm_key, void *data, struct sa_query_result *result) > -{ > - ib_rpc_t rpc; > - void *umad, *mad; > - int ret, offset, len = 256; > - > - memset(&rpc, 0, sizeof(rpc)); > - rpc.mgtclass = IB_SA_CLASS; > - rpc.method = method; > - rpc.attr.id = attr; > - rpc.attr.mod = mod; > - rpc.mask = comp_mask; > - rpc.datasz = IB_SA_DATA_SIZE; > - rpc.dataoffs = IB_SA_DATA_OFFS; > - > - umad = calloc(1, len + umad_size()); > - if (!umad) > - IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno)); > - > - mad_build_pkt(umad, &rpc, &h->dport, NULL, data); > - > - mad_set_field64(umad_get_mad(umad), 0, IB_SA_MKEY_F, sm_key); > - > - if (ibdebug > 1) > - xdump(stdout, "SA Request:\n", umad_get_mad(umad), len); > - > - ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0); > - if (ret < 0) > - IBPANIC("umad_send failed: attr %u: %s\n", > - attr, strerror(errno)); > - > -recv_mad: > - ret = umad_recv(h->fd, umad, &len, ibd_timeout); > - if (ret < 0) { > - if (errno == ENOSPC) { > - umad = realloc(umad, umad_size() + len); > - goto recv_mad; > - } > - IBPANIC("umad_recv failed: attr 0x%x: %s\n", attr, > - strerror(errno)); > - } > - > - if ((ret = umad_status(umad))) > - return ret; > - > - mad = umad_get_mad(umad); > - > - if (ibdebug > 1) > - xdump(stdout, "SA Response:\n", mad, len); > - > - method = (uint8_t) mad_get_field(mad, 0, IB_MAD_METHOD_F); > - offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); > - result->status = mad_get_field(mad, 0, IB_MAD_STATUS_F); > - result->p_result_madw = mad; > - if (result->status != IB_SA_MAD_STATUS_SUCCESS) > - result->result_cnt = 0; > - else if (method != IB_MAD_METHOD_GET_TABLE) > - result->result_cnt = 1; > - else if (!offset) > - result->result_cnt = 0; > - else > - result->result_cnt = (len - IB_SA_DATA_OFFS) / (offset << 3); > - > - return 0; > -} > - > -static void *sa_get_query_rec(void *mad, unsigned i) > -{ > - int offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); > - return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3); > -} > - > static unsigned valid_gid(ib_gid_t * gid) > { > ib_gid_t zero_gid; > @@ -837,14 +709,6 @@ static void dump_results(struct sa_query_result *r, void (*dump_func) (void *)) > } > } > > -static void sa_free_result_mad(struct sa_query_result *result) > -{ > - if (result->p_result_madw) { > - free((uint8_t *) result->p_result_madw - umad_size()); > - result->p_result_madw = NULL; > - } > -} > - > /** > * Get any record(s) > */ > @@ -861,7 +725,7 @@ static int get_any_records(bind_handle_t h, > } > > if (result->status != IB_SA_MAD_STATUS_SUCCESS) { > - report_err(result->status); > + sa_report_err(result->status); > return EIO; > } > > @@ -1004,26 +868,6 @@ static int parse_lid_and_ports(bind_handle_t h, > return 0; > } > > -#define cl_hton8(x) (x) > -#define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \ > - if ((int##size##_t) val != (int##size##_t) comp_with) { \ > - target = cl_hton##size((uint##size##_t) val); \ > - comp_mask |= IB_##name##_COMPMASK_##mask; \ > - } > - > -#define CHECK_AND_SET_GID(val, target, name, mask) \ > - if (valid_gid(&(val))) { \ > - memcpy(&(target), &(val), sizeof(val)); \ > - comp_mask |= IB_##name##_COMPMASK_##mask; \ > - } > - > -#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \ > - if (val) { \ > - target = val; \ > - comp_mask |= IB_##name##_COMPMASK_##mask##sel; \ > - comp_mask |= IB_##name##_COMPMASK_##mask; \ > - } > - > /* > * Get the portinfo records available with IsSM or IsSMdisabled CapabilityMask bit on. > */ > @@ -1095,7 +939,7 @@ static int get_print_class_port_info(bind_handle_t h) > return ret; > } > if (result.status != IB_SA_MAD_STATUS_SUCCESS) { > - report_err(result.status); > + sa_report_err(result.status); > ret = EIO; > goto Exit; > } > @@ -1434,37 +1278,6 @@ static int query_mft_records(const struct query_cmd *q, bind_handle_t h, > &mftr, 0, dump_one_mft_record); > } > > -static bind_handle_t get_bind_handle(void) > -{ > - static struct ibmad_port *srcport; > - static struct bind_handle handle; > - int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS }; > - > - srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2); > - if (!srcport) > - IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); > - > - ib_resolve_smlid_via(&handle.dport, ibd_timeout, srcport); > - if (!handle.dport.lid) > - IBPANIC("No SM found."); > - > - handle.dport.qp = 1; > - if (!handle.dport.qkey) > - handle.dport.qkey = IB_DEFAULT_QP1_QKEY; > - > - handle.fd = mad_rpc_portid(srcport); > - handle.agent = umad_register(handle.fd, IB_SA_CLASS, 2, 1, NULL); > - > - return &handle; > -} > - > -static void clean_up(struct bind_handle *h) > -{ > - umad_unregister(h->fd, h->agent); > - umad_close_port(h->fd); > - umad_done(); > -} > - > static const struct query_cmd query_cmds[] = { > {"ClassPortInfo", "CPI", CLASS_PORT_INFO, > NULL, query_class_port_info}, > @@ -1861,7 +1674,10 @@ int main(int argc, char **argv) > ibdiag_show_usage(); > } > > - h = get_bind_handle(); > + h = sa_get_bind_handle(); > + if (!h) > + IBPANIC("Failed to bind to the SA"); > + > node_name_map = open_node_name_map(node_name_map_file); > > if (src_lid && *src_lid) > @@ -1898,7 +1714,7 @@ int main(int argc, char **argv) > > if (src_lid) > free(src_lid); > - clean_up(h); > + sa_free_bind_handle(h); > close_node_name_map(node_name_map); > return (status); > } -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 4+ messages in thread
[parent not found: <4E177976.8000101-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>]
* Re: [PATCH 2/4] infiniband-diags: move core saquery functionality to ibdiag_common [not found] ` <4E177976.8000101-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> @ 2011-07-11 12:09 ` Hal Rosenstock 2011-07-14 17:01 ` Ira Weiny 1 sibling, 0 replies; 4+ messages in thread From: Hal Rosenstock @ 2011-07-11 12:09 UTC (permalink / raw) To: Ira Weiny; +Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org On 7/8/2011 5:41 PM, Hal Rosenstock wrote: > On 7/5/2011 3:08 PM, Ira Weiny wrote: >> >> While this is sub-optimal it is the easiest way to get saquery support to the >> other diags. > > Just some nits below... > >> Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org> >> --- >> include/ibdiag_common.h | 45 +++++++++++ >> src/ibdiag_common.c | 172 ++++++++++++++++++++++++++++++++++++++++ >> src/saquery.c | 198 ++--------------------------------------------- >> 3 files changed, 224 insertions(+), 191 deletions(-) >> >> diff --git a/include/ibdiag_common.h b/include/ibdiag_common.h >> index b113cfe..69cddfb 100644 >> --- a/include/ibdiag_common.h >> +++ b/include/ibdiag_common.h > > Merge saquery.c copyrights into here... > >> @@ -81,4 +81,49 @@ extern int ibdiag_process_opts(int argc, char *const argv[], void *context, >> extern void ibdiag_show_usage(); >> extern void iberror(const char *fn, char *msg, ...); >> >> +/* define an SA query structure to be common >> + * This is by no means optimal but it moves the saquery functionality out of >> + * the saquery tool and provides it to other utilities. >> + */ >> +struct bind_handle { >> + int fd, agent; >> + ib_portid_t dport; >> + struct ibmad_port *srcport; >> +}; >> +typedef struct bind_handle * bind_handle_t; >> +bind_handle_t sa_get_bind_handle(void); >> +void sa_free_bind_handle(bind_handle_t h); >> + >> +struct sa_query_result { >> + uint32_t status; >> + unsigned result_cnt; >> + void *p_result_madw; >> +}; >> +int sa_query(struct bind_handle *h, uint8_t method, >> + uint16_t attr, uint32_t mod, uint64_t comp_mask, uint64_t sm_key, >> + void *data, struct sa_query_result *result); >> +void sa_free_result_mad(struct sa_query_result *result); >> +void *sa_get_query_rec(void *mad, unsigned i); >> +void sa_report_err(int status); >> + >> +#define cl_hton8(x) (x) >> +#define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \ >> + if ((int##size##_t) val != (int##size##_t) comp_with) { \ >> + target = cl_hton##size((uint##size##_t) val); \ >> + comp_mask |= IB_##name##_COMPMASK_##mask; \ >> + } >> + >> +#define CHECK_AND_SET_GID(val, target, name, mask) \ >> + if (valid_gid(&(val))) { \ >> + memcpy(&(target), &(val), sizeof(val)); \ >> + comp_mask |= IB_##name##_COMPMASK_##mask; \ >> + } >> + >> +#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \ >> + if (val) { \ >> + target = val; \ >> + comp_mask |= IB_##name##_COMPMASK_##mask##sel; \ >> + comp_mask |= IB_##name##_COMPMASK_##mask; \ >> + } >> + >> #endif /* _IBDIAG_COMMON_H_ */ >> diff --git a/src/ibdiag_common.c b/src/ibdiag_common.c >> index 82f72af..6d03a43 100644 >> --- a/src/ibdiag_common.c >> +++ b/src/ibdiag_common.c > > Merge saquery.c copyrights into here... > >> @@ -337,3 +337,175 @@ void iberror(const char *fn, char *msg, ...) >> >> exit(-1); >> } >> + >> +/* define an SA query structure to be common >> + * This is by no means optimal but it moves the saquery functionality out of >> + * the saquery tool and provides it to other utilities. >> + */ >> +bind_handle_t sa_get_bind_handle(void) >> +{ >> + struct ibmad_port * srcport; >> + bind_handle_t handle; >> + int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS }; >> + >> + srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2); >> + if (!srcport) { >> + IBWARN("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); >> + return (NULL); >> + } >> + >> + handle = calloc(1, sizeof(*handle)); >> + if (!handle) >> + IBPANIC("calloc failed"); > > Should we IBPANIC in a library or IBWARN and return NULL here or some > other way to get the app to exit ? IBPANIC is fine. I mistakenly thought this (ibdiag_common) was being moved into a library. > >> + >> + ib_resolve_smlid_via(&handle->dport, ibd_timeout, srcport); >> + if (!handle->dport.lid) { >> + IBWARN("No SM found."); >> + free(handle); >> + return (NULL); >> + } >> + >> + handle->dport.qp = 1; >> + if (!handle->dport.qkey) >> + handle->dport.qkey = IB_DEFAULT_QP1_QKEY; >> + >> + handle->srcport = srcport; >> + handle->fd = mad_rpc_portid(srcport); >> + handle->agent = umad_register(handle->fd, IB_SA_CLASS, 2, 1, NULL); >> + >> + return handle; >> +} >> + >> +void sa_free_bind_handle(bind_handle_t h) >> +{ >> + umad_unregister(h->fd, h->agent); >> + mad_rpc_close_port(h->srcport); >> + free(h); >> +} >> + >> +int sa_query(bind_handle_t h, uint8_t method, >> + uint16_t attr, uint32_t mod, uint64_t comp_mask, >> + uint64_t sm_key, void *data, struct sa_query_result *result) >> +{ >> + ib_rpc_t rpc; >> + void *umad, *mad; >> + int ret, offset, len = 256; >> + >> + memset(&rpc, 0, sizeof(rpc)); >> + rpc.mgtclass = IB_SA_CLASS; >> + rpc.method = method; >> + rpc.attr.id = attr; >> + rpc.attr.mod = mod; >> + rpc.mask = comp_mask; >> + rpc.datasz = IB_SA_DATA_SIZE; >> + rpc.dataoffs = IB_SA_DATA_OFFS; >> + >> + umad = calloc(1, len + umad_size()); >> + if (!umad) >> + IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno)); > > Should we IBPANIC in a library or IBWARN and return IB_ERROR here or > some other way to get the app to exit ? Ditto. -- Hal > -- Hal > >> + >> + mad_build_pkt(umad, &rpc, &h->dport, NULL, data); >> + >> + mad_set_field64(umad_get_mad(umad), 0, IB_SA_MKEY_F, sm_key); >> + >> + if (ibdebug > 1) >> + xdump(stdout, "SA Request:\n", umad_get_mad(umad), len); >> + >> + ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0); >> + if (ret < 0) { >> + IBWARN("umad_send failed: attr %u: %s\n", >> + attr, strerror(errno)); >> + free(umad); >> + return (IB_ERROR); >> + } >> + >> +recv_mad: >> + ret = umad_recv(h->fd, umad, &len, ibd_timeout); >> + if (ret < 0) { >> + if (errno == ENOSPC) { >> + umad = realloc(umad, umad_size() + len); >> + goto recv_mad; >> + } >> + IBWARN("umad_recv failed: attr 0x%x: %s\n", attr, >> + strerror(errno)); >> + free(umad); >> + return (IB_ERROR); >> + } >> + >> + if ((ret = umad_status(umad))) >> + return ret; >> + >> + mad = umad_get_mad(umad); >> + >> + if (ibdebug > 1) >> + xdump(stdout, "SA Response:\n", mad, len); >> + >> + method = (uint8_t) mad_get_field(mad, 0, IB_MAD_METHOD_F); >> + offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); >> + result->status = mad_get_field(mad, 0, IB_MAD_STATUS_F); >> + result->p_result_madw = mad; >> + if (result->status != IB_SA_MAD_STATUS_SUCCESS) >> + result->result_cnt = 0; >> + else if (method != IB_MAD_METHOD_GET_TABLE) >> + result->result_cnt = 1; >> + else if (!offset) >> + result->result_cnt = 0; >> + else >> + result->result_cnt = (len - IB_SA_DATA_OFFS) / (offset << 3); >> + >> + return 0; >> +} >> + >> +void sa_free_result_mad(struct sa_query_result *result) >> +{ >> + if (result->p_result_madw) { >> + free((uint8_t *) result->p_result_madw - umad_size()); >> + result->p_result_madw = NULL; >> + } >> +} >> + >> +void *sa_get_query_rec(void *mad, unsigned i) >> +{ >> + int offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); >> + return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3); >> +} >> + >> +static const char *ib_sa_error_str[] = { >> + "SA_NO_ERROR", >> + "SA_ERR_NO_RESOURCES", >> + "SA_ERR_REQ_INVALID", >> + "SA_ERR_NO_RECORDS", >> + "SA_ERR_TOO_MANY_RECORDS", >> + "SA_ERR_REQ_INVALID_GID", >> + "SA_ERR_REQ_INSUFFICIENT_COMPONENTS", >> + "SA_ERR_REQ_DENIED", >> + "SA_ERR_STATUS_PRIO_SUGGESTED", >> + "SA_ERR_UNKNOWN" >> +}; >> + >> +#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) >> +#define SA_ERR_UNKNOWN (ARR_SIZE(ib_sa_error_str) - 1) >> + >> +static inline const char *ib_sa_err_str(IN uint8_t status) >> +{ >> + if (status > SA_ERR_UNKNOWN) >> + status = SA_ERR_UNKNOWN; >> + return (ib_sa_error_str[status]); >> +} >> + >> +void sa_report_err(int status) >> +{ >> + int st = status & 0xff; >> + char sm_err_str[64] = { 0 }; >> + char sa_err_str[64] = { 0 }; >> + >> + if (st) >> + sprintf(sm_err_str, " SM(%s)", ib_get_err_str(st)); >> + >> + st = status >> 8; >> + if (st) >> + sprintf(sa_err_str, " SA(%s)", ib_sa_err_str((uint8_t) st)); >> + >> + fprintf(stderr, "ERROR: Query result returned 0x%04x, %s%s\n", >> + status, sm_err_str, sa_err_str); >> +} >> diff --git a/src/saquery.c b/src/saquery.c >> index 73acea5..95f7e6e 100644 >> --- a/src/saquery.c >> +++ b/src/saquery.c >> @@ -59,19 +59,6 @@ >> >> #include "ibdiag_common.h" >> >> -struct bind_handle { >> - int fd, agent; >> - ib_portid_t dport; >> -}; >> - >> -struct sa_query_result { >> - uint32_t status; >> - unsigned result_cnt; >> - void *p_result_madw; >> -}; >> - >> -typedef struct bind_handle *bind_handle_t; >> - >> struct query_params { >> ib_gid_t sgid, dgid, gid, mgid; >> uint16_t slid, dlid, mlid; >> @@ -122,121 +109,6 @@ int requested_lid_flag = 0; >> uint64_t requested_guid = 0; >> int requested_guid_flag = 0; >> >> -#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) >> - >> -static const char *ib_sa_error_str[] = { >> - "SA_NO_ERROR", >> - "SA_ERR_NO_RESOURCES", >> - "SA_ERR_REQ_INVALID", >> - "SA_ERR_NO_RECORDS", >> - "SA_ERR_TOO_MANY_RECORDS", >> - "SA_ERR_REQ_INVALID_GID", >> - "SA_ERR_REQ_INSUFFICIENT_COMPONENTS", >> - "SA_ERR_REQ_DENIED", >> - "SA_ERR_STATUS_PRIO_SUGGESTED", >> - "SA_ERR_UNKNOWN" >> -}; >> - >> -#define SA_ERR_UNKNOWN (ARR_SIZE(ib_sa_error_str) - 1) >> - >> -static inline const char *ib_sa_err_str(IN uint8_t status) >> -{ >> - if (status > SA_ERR_UNKNOWN) >> - status = SA_ERR_UNKNOWN; >> - return (ib_sa_error_str[status]); >> -} >> - >> -static inline void report_err(int status) >> -{ >> - int st = status & 0xff; >> - char sm_err_str[64] = { 0 }; >> - char sa_err_str[64] = { 0 }; >> - >> - if (st) >> - sprintf(sm_err_str, " SM(%s)", ib_get_err_str(st)); >> - >> - st = status >> 8; >> - if (st) >> - sprintf(sa_err_str, " SA(%s)", ib_sa_err_str((uint8_t) st)); >> - >> - fprintf(stderr, "ERROR: Query result returned 0x%04x, %s%s\n", >> - status, sm_err_str, sa_err_str); >> -} >> - >> -static int sa_query(struct bind_handle *h, uint8_t method, >> - uint16_t attr, uint32_t mod, uint64_t comp_mask, >> - uint64_t sm_key, void *data, struct sa_query_result *result) >> -{ >> - ib_rpc_t rpc; >> - void *umad, *mad; >> - int ret, offset, len = 256; >> - >> - memset(&rpc, 0, sizeof(rpc)); >> - rpc.mgtclass = IB_SA_CLASS; >> - rpc.method = method; >> - rpc.attr.id = attr; >> - rpc.attr.mod = mod; >> - rpc.mask = comp_mask; >> - rpc.datasz = IB_SA_DATA_SIZE; >> - rpc.dataoffs = IB_SA_DATA_OFFS; >> - >> - umad = calloc(1, len + umad_size()); >> - if (!umad) >> - IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno)); >> - >> - mad_build_pkt(umad, &rpc, &h->dport, NULL, data); >> - >> - mad_set_field64(umad_get_mad(umad), 0, IB_SA_MKEY_F, sm_key); >> - >> - if (ibdebug > 1) >> - xdump(stdout, "SA Request:\n", umad_get_mad(umad), len); >> - >> - ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0); >> - if (ret < 0) >> - IBPANIC("umad_send failed: attr %u: %s\n", >> - attr, strerror(errno)); >> - >> -recv_mad: >> - ret = umad_recv(h->fd, umad, &len, ibd_timeout); >> - if (ret < 0) { >> - if (errno == ENOSPC) { >> - umad = realloc(umad, umad_size() + len); >> - goto recv_mad; >> - } >> - IBPANIC("umad_recv failed: attr 0x%x: %s\n", attr, >> - strerror(errno)); >> - } >> - >> - if ((ret = umad_status(umad))) >> - return ret; >> - >> - mad = umad_get_mad(umad); >> - >> - if (ibdebug > 1) >> - xdump(stdout, "SA Response:\n", mad, len); >> - >> - method = (uint8_t) mad_get_field(mad, 0, IB_MAD_METHOD_F); >> - offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); >> - result->status = mad_get_field(mad, 0, IB_MAD_STATUS_F); >> - result->p_result_madw = mad; >> - if (result->status != IB_SA_MAD_STATUS_SUCCESS) >> - result->result_cnt = 0; >> - else if (method != IB_MAD_METHOD_GET_TABLE) >> - result->result_cnt = 1; >> - else if (!offset) >> - result->result_cnt = 0; >> - else >> - result->result_cnt = (len - IB_SA_DATA_OFFS) / (offset << 3); >> - >> - return 0; >> -} >> - >> -static void *sa_get_query_rec(void *mad, unsigned i) >> -{ >> - int offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); >> - return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3); >> -} >> - >> static unsigned valid_gid(ib_gid_t * gid) >> { >> ib_gid_t zero_gid; >> @@ -837,14 +709,6 @@ static void dump_results(struct sa_query_result *r, void (*dump_func) (void *)) >> } >> } >> >> -static void sa_free_result_mad(struct sa_query_result *result) >> -{ >> - if (result->p_result_madw) { >> - free((uint8_t *) result->p_result_madw - umad_size()); >> - result->p_result_madw = NULL; >> - } >> -} >> - >> /** >> * Get any record(s) >> */ >> @@ -861,7 +725,7 @@ static int get_any_records(bind_handle_t h, >> } >> >> if (result->status != IB_SA_MAD_STATUS_SUCCESS) { >> - report_err(result->status); >> + sa_report_err(result->status); >> return EIO; >> } >> >> @@ -1004,26 +868,6 @@ static int parse_lid_and_ports(bind_handle_t h, >> return 0; >> } >> >> -#define cl_hton8(x) (x) >> -#define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \ >> - if ((int##size##_t) val != (int##size##_t) comp_with) { \ >> - target = cl_hton##size((uint##size##_t) val); \ >> - comp_mask |= IB_##name##_COMPMASK_##mask; \ >> - } >> - >> -#define CHECK_AND_SET_GID(val, target, name, mask) \ >> - if (valid_gid(&(val))) { \ >> - memcpy(&(target), &(val), sizeof(val)); \ >> - comp_mask |= IB_##name##_COMPMASK_##mask; \ >> - } >> - >> -#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \ >> - if (val) { \ >> - target = val; \ >> - comp_mask |= IB_##name##_COMPMASK_##mask##sel; \ >> - comp_mask |= IB_##name##_COMPMASK_##mask; \ >> - } >> - >> /* >> * Get the portinfo records available with IsSM or IsSMdisabled CapabilityMask bit on. >> */ >> @@ -1095,7 +939,7 @@ static int get_print_class_port_info(bind_handle_t h) >> return ret; >> } >> if (result.status != IB_SA_MAD_STATUS_SUCCESS) { >> - report_err(result.status); >> + sa_report_err(result.status); >> ret = EIO; >> goto Exit; >> } >> @@ -1434,37 +1278,6 @@ static int query_mft_records(const struct query_cmd *q, bind_handle_t h, >> &mftr, 0, dump_one_mft_record); >> } >> >> -static bind_handle_t get_bind_handle(void) >> -{ >> - static struct ibmad_port *srcport; >> - static struct bind_handle handle; >> - int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS }; >> - >> - srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2); >> - if (!srcport) >> - IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); >> - >> - ib_resolve_smlid_via(&handle.dport, ibd_timeout, srcport); >> - if (!handle.dport.lid) >> - IBPANIC("No SM found."); >> - >> - handle.dport.qp = 1; >> - if (!handle.dport.qkey) >> - handle.dport.qkey = IB_DEFAULT_QP1_QKEY; >> - >> - handle.fd = mad_rpc_portid(srcport); >> - handle.agent = umad_register(handle.fd, IB_SA_CLASS, 2, 1, NULL); >> - >> - return &handle; >> -} >> - >> -static void clean_up(struct bind_handle *h) >> -{ >> - umad_unregister(h->fd, h->agent); >> - umad_close_port(h->fd); >> - umad_done(); >> -} >> - >> static const struct query_cmd query_cmds[] = { >> {"ClassPortInfo", "CPI", CLASS_PORT_INFO, >> NULL, query_class_port_info}, >> @@ -1861,7 +1674,10 @@ int main(int argc, char **argv) >> ibdiag_show_usage(); >> } >> >> - h = get_bind_handle(); >> + h = sa_get_bind_handle(); >> + if (!h) >> + IBPANIC("Failed to bind to the SA"); >> + >> node_name_map = open_node_name_map(node_name_map_file); >> >> if (src_lid && *src_lid) >> @@ -1898,7 +1714,7 @@ int main(int argc, char **argv) >> >> if (src_lid) >> free(src_lid); >> - clean_up(h); >> + sa_free_bind_handle(h); >> close_node_name_map(node_name_map); >> return (status); >> } > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/4] infiniband-diags: move core saquery functionality to ibdiag_common [not found] ` <4E177976.8000101-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> 2011-07-11 12:09 ` Hal Rosenstock @ 2011-07-14 17:01 ` Ira Weiny 1 sibling, 0 replies; 4+ messages in thread From: Ira Weiny @ 2011-07-14 17:01 UTC (permalink / raw) To: Hal Rosenstock; +Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org I incorporated this into the new patch. Thanks, Ira On Fri, 8 Jul 2011 14:41:10 -0700 Hal Rosenstock <hal-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> wrote: > On 7/5/2011 3:08 PM, Ira Weiny wrote: > > > > While this is sub-optimal it is the easiest way to get saquery support to the > > other diags. > > Just some nits below... > > > Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org> > > --- > > include/ibdiag_common.h | 45 +++++++++++ > > src/ibdiag_common.c | 172 ++++++++++++++++++++++++++++++++++++++++ > > src/saquery.c | 198 ++--------------------------------------------- > > 3 files changed, 224 insertions(+), 191 deletions(-) > > > > diff --git a/include/ibdiag_common.h b/include/ibdiag_common.h > > index b113cfe..69cddfb 100644 > > --- a/include/ibdiag_common.h > > +++ b/include/ibdiag_common.h > > Merge saquery.c copyrights into here... > > > @@ -81,4 +81,49 @@ extern int ibdiag_process_opts(int argc, char *const argv[], void *context, > > extern void ibdiag_show_usage(); > > extern void iberror(const char *fn, char *msg, ...); > > > > +/* define an SA query structure to be common > > + * This is by no means optimal but it moves the saquery functionality out of > > + * the saquery tool and provides it to other utilities. > > + */ > > +struct bind_handle { > > + int fd, agent; > > + ib_portid_t dport; > > + struct ibmad_port *srcport; > > +}; > > +typedef struct bind_handle * bind_handle_t; > > +bind_handle_t sa_get_bind_handle(void); > > +void sa_free_bind_handle(bind_handle_t h); > > + > > +struct sa_query_result { > > + uint32_t status; > > + unsigned result_cnt; > > + void *p_result_madw; > > +}; > > +int sa_query(struct bind_handle *h, uint8_t method, > > + uint16_t attr, uint32_t mod, uint64_t comp_mask, uint64_t sm_key, > > + void *data, struct sa_query_result *result); > > +void sa_free_result_mad(struct sa_query_result *result); > > +void *sa_get_query_rec(void *mad, unsigned i); > > +void sa_report_err(int status); > > + > > +#define cl_hton8(x) (x) > > +#define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \ > > + if ((int##size##_t) val != (int##size##_t) comp_with) { \ > > + target = cl_hton##size((uint##size##_t) val); \ > > + comp_mask |= IB_##name##_COMPMASK_##mask; \ > > + } > > + > > +#define CHECK_AND_SET_GID(val, target, name, mask) \ > > + if (valid_gid(&(val))) { \ > > + memcpy(&(target), &(val), sizeof(val)); \ > > + comp_mask |= IB_##name##_COMPMASK_##mask; \ > > + } > > + > > +#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \ > > + if (val) { \ > > + target = val; \ > > + comp_mask |= IB_##name##_COMPMASK_##mask##sel; \ > > + comp_mask |= IB_##name##_COMPMASK_##mask; \ > > + } > > + > > #endif /* _IBDIAG_COMMON_H_ */ > > diff --git a/src/ibdiag_common.c b/src/ibdiag_common.c > > index 82f72af..6d03a43 100644 > > --- a/src/ibdiag_common.c > > +++ b/src/ibdiag_common.c > > Merge saquery.c copyrights into here... > > > @@ -337,3 +337,175 @@ void iberror(const char *fn, char *msg, ...) > > > > exit(-1); > > } > > + > > +/* define an SA query structure to be common > > + * This is by no means optimal but it moves the saquery functionality out of > > + * the saquery tool and provides it to other utilities. > > + */ > > +bind_handle_t sa_get_bind_handle(void) > > +{ > > + struct ibmad_port * srcport; > > + bind_handle_t handle; > > + int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS }; > > + > > + srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2); > > + if (!srcport) { > > + IBWARN("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); > > + return (NULL); > > + } > > + > > + handle = calloc(1, sizeof(*handle)); > > + if (!handle) > > + IBPANIC("calloc failed"); > > Should we IBPANIC in a library or IBWARN and return NULL here or some > other way to get the app to exit ? > > > + > > + ib_resolve_smlid_via(&handle->dport, ibd_timeout, srcport); > > + if (!handle->dport.lid) { > > + IBWARN("No SM found."); > > + free(handle); > > + return (NULL); > > + } > > + > > + handle->dport.qp = 1; > > + if (!handle->dport.qkey) > > + handle->dport.qkey = IB_DEFAULT_QP1_QKEY; > > + > > + handle->srcport = srcport; > > + handle->fd = mad_rpc_portid(srcport); > > + handle->agent = umad_register(handle->fd, IB_SA_CLASS, 2, 1, NULL); > > + > > + return handle; > > +} > > + > > +void sa_free_bind_handle(bind_handle_t h) > > +{ > > + umad_unregister(h->fd, h->agent); > > + mad_rpc_close_port(h->srcport); > > + free(h); > > +} > > + > > +int sa_query(bind_handle_t h, uint8_t method, > > + uint16_t attr, uint32_t mod, uint64_t comp_mask, > > + uint64_t sm_key, void *data, struct sa_query_result *result) > > +{ > > + ib_rpc_t rpc; > > + void *umad, *mad; > > + int ret, offset, len = 256; > > + > > + memset(&rpc, 0, sizeof(rpc)); > > + rpc.mgtclass = IB_SA_CLASS; > > + rpc.method = method; > > + rpc.attr.id = attr; > > + rpc.attr.mod = mod; > > + rpc.mask = comp_mask; > > + rpc.datasz = IB_SA_DATA_SIZE; > > + rpc.dataoffs = IB_SA_DATA_OFFS; > > + > > + umad = calloc(1, len + umad_size()); > > + if (!umad) > > + IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno)); > > Should we IBPANIC in a library or IBWARN and return IB_ERROR here or > some other way to get the app to exit ? > > -- Hal > > > + > > + mad_build_pkt(umad, &rpc, &h->dport, NULL, data); > > + > > + mad_set_field64(umad_get_mad(umad), 0, IB_SA_MKEY_F, sm_key); > > + > > + if (ibdebug > 1) > > + xdump(stdout, "SA Request:\n", umad_get_mad(umad), len); > > + > > + ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0); > > + if (ret < 0) { > > + IBWARN("umad_send failed: attr %u: %s\n", > > + attr, strerror(errno)); > > + free(umad); > > + return (IB_ERROR); > > + } > > + > > +recv_mad: > > + ret = umad_recv(h->fd, umad, &len, ibd_timeout); > > + if (ret < 0) { > > + if (errno == ENOSPC) { > > + umad = realloc(umad, umad_size() + len); > > + goto recv_mad; > > + } > > + IBWARN("umad_recv failed: attr 0x%x: %s\n", attr, > > + strerror(errno)); > > + free(umad); > > + return (IB_ERROR); > > + } > > + > > + if ((ret = umad_status(umad))) > > + return ret; > > + > > + mad = umad_get_mad(umad); > > + > > + if (ibdebug > 1) > > + xdump(stdout, "SA Response:\n", mad, len); > > + > > + method = (uint8_t) mad_get_field(mad, 0, IB_MAD_METHOD_F); > > + offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); > > + result->status = mad_get_field(mad, 0, IB_MAD_STATUS_F); > > + result->p_result_madw = mad; > > + if (result->status != IB_SA_MAD_STATUS_SUCCESS) > > + result->result_cnt = 0; > > + else if (method != IB_MAD_METHOD_GET_TABLE) > > + result->result_cnt = 1; > > + else if (!offset) > > + result->result_cnt = 0; > > + else > > + result->result_cnt = (len - IB_SA_DATA_OFFS) / (offset << 3); > > + > > + return 0; > > +} > > + > > +void sa_free_result_mad(struct sa_query_result *result) > > +{ > > + if (result->p_result_madw) { > > + free((uint8_t *) result->p_result_madw - umad_size()); > > + result->p_result_madw = NULL; > > + } > > +} > > + > > +void *sa_get_query_rec(void *mad, unsigned i) > > +{ > > + int offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); > > + return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3); > > +} > > + > > +static const char *ib_sa_error_str[] = { > > + "SA_NO_ERROR", > > + "SA_ERR_NO_RESOURCES", > > + "SA_ERR_REQ_INVALID", > > + "SA_ERR_NO_RECORDS", > > + "SA_ERR_TOO_MANY_RECORDS", > > + "SA_ERR_REQ_INVALID_GID", > > + "SA_ERR_REQ_INSUFFICIENT_COMPONENTS", > > + "SA_ERR_REQ_DENIED", > > + "SA_ERR_STATUS_PRIO_SUGGESTED", > > + "SA_ERR_UNKNOWN" > > +}; > > + > > +#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) > > +#define SA_ERR_UNKNOWN (ARR_SIZE(ib_sa_error_str) - 1) > > + > > +static inline const char *ib_sa_err_str(IN uint8_t status) > > +{ > > + if (status > SA_ERR_UNKNOWN) > > + status = SA_ERR_UNKNOWN; > > + return (ib_sa_error_str[status]); > > +} > > + > > +void sa_report_err(int status) > > +{ > > + int st = status & 0xff; > > + char sm_err_str[64] = { 0 }; > > + char sa_err_str[64] = { 0 }; > > + > > + if (st) > > + sprintf(sm_err_str, " SM(%s)", ib_get_err_str(st)); > > + > > + st = status >> 8; > > + if (st) > > + sprintf(sa_err_str, " SA(%s)", ib_sa_err_str((uint8_t) st)); > > + > > + fprintf(stderr, "ERROR: Query result returned 0x%04x, %s%s\n", > > + status, sm_err_str, sa_err_str); > > +} > > diff --git a/src/saquery.c b/src/saquery.c > > index 73acea5..95f7e6e 100644 > > --- a/src/saquery.c > > +++ b/src/saquery.c > > @@ -59,19 +59,6 @@ > > > > #include "ibdiag_common.h" > > > > -struct bind_handle { > > - int fd, agent; > > - ib_portid_t dport; > > -}; > > - > > -struct sa_query_result { > > - uint32_t status; > > - unsigned result_cnt; > > - void *p_result_madw; > > -}; > > - > > -typedef struct bind_handle *bind_handle_t; > > - > > struct query_params { > > ib_gid_t sgid, dgid, gid, mgid; > > uint16_t slid, dlid, mlid; > > @@ -122,121 +109,6 @@ int requested_lid_flag = 0; > > uint64_t requested_guid = 0; > > int requested_guid_flag = 0; > > > > -#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) > > - > > -static const char *ib_sa_error_str[] = { > > - "SA_NO_ERROR", > > - "SA_ERR_NO_RESOURCES", > > - "SA_ERR_REQ_INVALID", > > - "SA_ERR_NO_RECORDS", > > - "SA_ERR_TOO_MANY_RECORDS", > > - "SA_ERR_REQ_INVALID_GID", > > - "SA_ERR_REQ_INSUFFICIENT_COMPONENTS", > > - "SA_ERR_REQ_DENIED", > > - "SA_ERR_STATUS_PRIO_SUGGESTED", > > - "SA_ERR_UNKNOWN" > > -}; > > - > > -#define SA_ERR_UNKNOWN (ARR_SIZE(ib_sa_error_str) - 1) > > - > > -static inline const char *ib_sa_err_str(IN uint8_t status) > > -{ > > - if (status > SA_ERR_UNKNOWN) > > - status = SA_ERR_UNKNOWN; > > - return (ib_sa_error_str[status]); > > -} > > - > > -static inline void report_err(int status) > > -{ > > - int st = status & 0xff; > > - char sm_err_str[64] = { 0 }; > > - char sa_err_str[64] = { 0 }; > > - > > - if (st) > > - sprintf(sm_err_str, " SM(%s)", ib_get_err_str(st)); > > - > > - st = status >> 8; > > - if (st) > > - sprintf(sa_err_str, " SA(%s)", ib_sa_err_str((uint8_t) st)); > > - > > - fprintf(stderr, "ERROR: Query result returned 0x%04x, %s%s\n", > > - status, sm_err_str, sa_err_str); > > -} > > - > > -static int sa_query(struct bind_handle *h, uint8_t method, > > - uint16_t attr, uint32_t mod, uint64_t comp_mask, > > - uint64_t sm_key, void *data, struct sa_query_result *result) > > -{ > > - ib_rpc_t rpc; > > - void *umad, *mad; > > - int ret, offset, len = 256; > > - > > - memset(&rpc, 0, sizeof(rpc)); > > - rpc.mgtclass = IB_SA_CLASS; > > - rpc.method = method; > > - rpc.attr.id = attr; > > - rpc.attr.mod = mod; > > - rpc.mask = comp_mask; > > - rpc.datasz = IB_SA_DATA_SIZE; > > - rpc.dataoffs = IB_SA_DATA_OFFS; > > - > > - umad = calloc(1, len + umad_size()); > > - if (!umad) > > - IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno)); > > - > > - mad_build_pkt(umad, &rpc, &h->dport, NULL, data); > > - > > - mad_set_field64(umad_get_mad(umad), 0, IB_SA_MKEY_F, sm_key); > > - > > - if (ibdebug > 1) > > - xdump(stdout, "SA Request:\n", umad_get_mad(umad), len); > > - > > - ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0); > > - if (ret < 0) > > - IBPANIC("umad_send failed: attr %u: %s\n", > > - attr, strerror(errno)); > > - > > -recv_mad: > > - ret = umad_recv(h->fd, umad, &len, ibd_timeout); > > - if (ret < 0) { > > - if (errno == ENOSPC) { > > - umad = realloc(umad, umad_size() + len); > > - goto recv_mad; > > - } > > - IBPANIC("umad_recv failed: attr 0x%x: %s\n", attr, > > - strerror(errno)); > > - } > > - > > - if ((ret = umad_status(umad))) > > - return ret; > > - > > - mad = umad_get_mad(umad); > > - > > - if (ibdebug > 1) > > - xdump(stdout, "SA Response:\n", mad, len); > > - > > - method = (uint8_t) mad_get_field(mad, 0, IB_MAD_METHOD_F); > > - offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); > > - result->status = mad_get_field(mad, 0, IB_MAD_STATUS_F); > > - result->p_result_madw = mad; > > - if (result->status != IB_SA_MAD_STATUS_SUCCESS) > > - result->result_cnt = 0; > > - else if (method != IB_MAD_METHOD_GET_TABLE) > > - result->result_cnt = 1; > > - else if (!offset) > > - result->result_cnt = 0; > > - else > > - result->result_cnt = (len - IB_SA_DATA_OFFS) / (offset << 3); > > - > > - return 0; > > -} > > - > > -static void *sa_get_query_rec(void *mad, unsigned i) > > -{ > > - int offset = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); > > - return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3); > > -} > > - > > static unsigned valid_gid(ib_gid_t * gid) > > { > > ib_gid_t zero_gid; > > @@ -837,14 +709,6 @@ static void dump_results(struct sa_query_result *r, void (*dump_func) (void *)) > > } > > } > > > > -static void sa_free_result_mad(struct sa_query_result *result) > > -{ > > - if (result->p_result_madw) { > > - free((uint8_t *) result->p_result_madw - umad_size()); > > - result->p_result_madw = NULL; > > - } > > -} > > - > > /** > > * Get any record(s) > > */ > > @@ -861,7 +725,7 @@ static int get_any_records(bind_handle_t h, > > } > > > > if (result->status != IB_SA_MAD_STATUS_SUCCESS) { > > - report_err(result->status); > > + sa_report_err(result->status); > > return EIO; > > } > > > > @@ -1004,26 +868,6 @@ static int parse_lid_and_ports(bind_handle_t h, > > return 0; > > } > > > > -#define cl_hton8(x) (x) > > -#define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \ > > - if ((int##size##_t) val != (int##size##_t) comp_with) { \ > > - target = cl_hton##size((uint##size##_t) val); \ > > - comp_mask |= IB_##name##_COMPMASK_##mask; \ > > - } > > - > > -#define CHECK_AND_SET_GID(val, target, name, mask) \ > > - if (valid_gid(&(val))) { \ > > - memcpy(&(target), &(val), sizeof(val)); \ > > - comp_mask |= IB_##name##_COMPMASK_##mask; \ > > - } > > - > > -#define CHECK_AND_SET_VAL_AND_SEL(val, target, name, mask, sel) \ > > - if (val) { \ > > - target = val; \ > > - comp_mask |= IB_##name##_COMPMASK_##mask##sel; \ > > - comp_mask |= IB_##name##_COMPMASK_##mask; \ > > - } > > - > > /* > > * Get the portinfo records available with IsSM or IsSMdisabled CapabilityMask bit on. > > */ > > @@ -1095,7 +939,7 @@ static int get_print_class_port_info(bind_handle_t h) > > return ret; > > } > > if (result.status != IB_SA_MAD_STATUS_SUCCESS) { > > - report_err(result.status); > > + sa_report_err(result.status); > > ret = EIO; > > goto Exit; > > } > > @@ -1434,37 +1278,6 @@ static int query_mft_records(const struct query_cmd *q, bind_handle_t h, > > &mftr, 0, dump_one_mft_record); > > } > > > > -static bind_handle_t get_bind_handle(void) > > -{ > > - static struct ibmad_port *srcport; > > - static struct bind_handle handle; > > - int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS }; > > - > > - srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2); > > - if (!srcport) > > - IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); > > - > > - ib_resolve_smlid_via(&handle.dport, ibd_timeout, srcport); > > - if (!handle.dport.lid) > > - IBPANIC("No SM found."); > > - > > - handle.dport.qp = 1; > > - if (!handle.dport.qkey) > > - handle.dport.qkey = IB_DEFAULT_QP1_QKEY; > > - > > - handle.fd = mad_rpc_portid(srcport); > > - handle.agent = umad_register(handle.fd, IB_SA_CLASS, 2, 1, NULL); > > - > > - return &handle; > > -} > > - > > -static void clean_up(struct bind_handle *h) > > -{ > > - umad_unregister(h->fd, h->agent); > > - umad_close_port(h->fd); > > - umad_done(); > > -} > > - > > static const struct query_cmd query_cmds[] = { > > {"ClassPortInfo", "CPI", CLASS_PORT_INFO, > > NULL, query_class_port_info}, > > @@ -1861,7 +1674,10 @@ int main(int argc, char **argv) > > ibdiag_show_usage(); > > } > > > > - h = get_bind_handle(); > > + h = sa_get_bind_handle(); > > + if (!h) > > + IBPANIC("Failed to bind to the SA"); > > + > > node_name_map = open_node_name_map(node_name_map_file); > > > > if (src_lid && *src_lid) > > @@ -1898,7 +1714,7 @@ int main(int argc, char **argv) > > > > if (src_lid) > > free(src_lid); > > - clean_up(h); > > + sa_free_bind_handle(h); > > close_node_name_map(node_name_map); > > return (status); > > } > -- Ira Weiny Math Programmer/Computer Scientist Lawrence Livermore National Lab 925-423-8008 weiny2-i2BcT+NCU+M@public.gmane.org -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-07-14 17:01 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-05 19:08 [PATCH 2/4] infiniband-diags: move core saquery functionality to ibdiag_common Ira Weiny
[not found] ` <20110705120813.39fc4ab5.weiny2-i2BcT+NCU+M@public.gmane.org>
2011-07-08 21:41 ` Hal Rosenstock
[not found] ` <4E177976.8000101-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2011-07-11 12:09 ` Hal Rosenstock
2011-07-14 17:01 ` Ira Weiny
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox