On Wed, 2006-08-30 at 10:35 -0700, Roland Dreier wrote:
> OK, getting closer to finishing the merge...
> 
> anyway, why is iw_cm_private.h in include/rdma where it is visible
> everywhere?  As far as I can tell drivers/infiniband/core/iwcm.c is
> the only place it's included.  So why not just put this stuff in
> drivers/infiniband/core/iwcm.h and do

The data structures really belong in iwcm.c...but I have a KDB module
that dumps IB data structures. So when I was writing the IWCM, I pulled
them out where I could see them without include gymnastics. It seems
pretty dumb though to have header files called *private.h in a public
directory. Putting them in iwcm.h is fine with me... 

Here's a patch for the KDB code if anyone is interested...

KDB module for dumping OpenFabrics stack data types

From: Tom Tucker <[EMAIL PROTECTED]>


---

 kdb/kdbmain.c                  |    2 
 kdb/modules/Makefile           |    3 
 kdb/modules/kdbm_openfabrics.c |  372
++++++++++++++++++++++++++++++++++++++++
 3 files changed, 375 insertions(+), 2 deletions(-)

diff --git a/kdb/kdbmain.c b/kdb/kdbmain.c
index 931b643..b35139a 100644
--- a/kdb/kdbmain.c
+++ b/kdb/kdbmain.c
@@ -1154,8 +1154,8 @@ kdb_quiet(int reason)
  *     none
  */
 
+void kdba_cpu_up(void) {};
 extern char kdb_prompt_str[];
-
 static int
 kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
kdb_dbtrap_t db_result)
 {
diff --git a/kdb/modules/Makefile b/kdb/modules/Makefile
index ae2ac53..fbf05e1 100644
--- a/kdb/modules/Makefile
+++ b/kdb/modules/Makefile
@@ -6,7 +6,8 @@ #
 # Copyright (c) 1999-2006 Silicon Graphics, Inc.  All Rights Reserved.
 #
 
-obj-$(CONFIG_KDB_MODULES) += kdbm_pg.o kdbm_task.o kdbm_vm.o
kdbm_sched.o
+obj-$(CONFIG_KDB_MODULES) += kdbm_pg.o kdbm_task.o kdbm_vm.o
kdbm_sched.o \
+                               kdbm_openfabrics.o
 ifdef CONFIG_X86
 ifndef CONFIG_X86_64
 obj-$(CONFIG_KDB_MODULES) += kdbm_x86.o
diff --git a/kdb/modules/kdbm_openfabrics.c
b/kdb/modules/kdbm_openfabrics.c
new file mode 100644
index 0000000..fdf204b
--- /dev/null
+++ b/kdb/modules/kdbm_openfabrics.c
@@ -0,0 +1,372 @@
+/*
+ * Copyright (c) 2006 Tom Tucker, Open Grid Computing, Inc. 
+ */
+
+#include <linux/kdb.h>
+#include <linux/kdbprivate.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <rdma/ib_verbs.h>
+#include <rdma/rdma_cm.h>
+#include <rdma/iw_cm.h>
+#include <rdma/iw_cm_private.h>
+#include "../drivers/infiniband/hw/amso1100/c2_provider.h"
+
+MODULE_AUTHOR("Tom Tucker");
+MODULE_DESCRIPTION("Debug RDMA");
+MODULE_LICENSE("Dual BSD/GPL");
+
+static const char *wc_status_str[] = {
+       "SUCCESS",
+       "LOC_LEN_ERR",
+       "LOC_QP_OP_ERR",
+       "LOC_EEC_OP_ERR",
+       "LOC_PROT_ERR",
+       "WR_FLUSH_ERR",
+       "MW_BIND_ERR",
+       "BAD_RESP_ERR",
+       "LOC_ACCESS_ERR",
+       "REM_INV_REQ_ERR",
+       "REM_ACCESS_ERR",
+       "REM_OP_ERR",
+       "RETRY_EXC_ERR",
+       "RNR_RETRY_EXC_ERR",
+       "LOC_RDD_VIOL_ERR",
+       "REM_INV_RD_REQ_ERR",
+       "REM_ABORT_ERR",
+       "INV_EECN_ERR",
+       "INV_EEC_STATE_ERR",
+       "FATAL_ERR",
+       "RESP_TIMEOUT_ERR",
+       "GENERAL_ERR"
+};
+
+static inline const char *wc_status_to_str(int status)
+{
+       if (status > (sizeof(wc_status_str) / sizeof(wc_status_str[0])))
+               return "<bad status>";
+
+       return wc_status_str[status];
+}
+
+static const char *wc_opcode_str[] = {
+       "SEND",
+       "RDMA_WRITE",
+       "RDMA_READ",
+       "COMP_SWAP",
+       "FETCH_ADD",
+       "BIND_MW",
+       "RECV",
+       "RECV_RDMA_WITH_IMM",
+};
+
+static inline const char* wc_opcode_to_str(int op) 
+{
+       
+       if (op > 129)
+               return "<bad opcode>";
+       else if (op >= 128)
+               op -= 122;
+       return wc_opcode_str[op];
+}
+
+static int
+print_ib_wc(int argc, const char **argv, const char **envp,
+           struct pt_regs *regs)
+{
+       int ret = 0;
+
+       if (argc == 1) {
+               kdb_machreg_t addr;
+               int nextarg = 1;
+               long offset = 0;
+               struct ib_wc wc;
+
+               ret = kdbgetaddrarg(argc, argv, &nextarg, &addr, 
+                                   &offset, NULL, regs);
+               if (ret) 
+                       return ret;
+
+               kdb_printf("struct ib_wc [%p]\n", (void*)addr);
+               ret = kdb_getarea_size((void*)&wc, (unsigned long)addr, 
+                                      sizeof wc);
+               if (ret)
+                       return ret;
+
+               kdb_printf("  wr_id          : %llx\n", wc.wr_id);
+               kdb_printf("  status         : \"%s\"\n",
wc_status_to_str(wc.status));
+               kdb_printf("  opcode         : %s\n", 
wc_opcode_to_str(wc.opcode));
+               kdb_printf("  vendor_err     : %d\n", wc.vendor_err);
+               kdb_printf("  byte_len       : %d\n", wc.byte_len);
+               kdb_printf("  imm_data       : %d\n", wc.imm_data);
+               kdb_printf("  qp_num         : %d\n", wc.qp_num);
+               kdb_printf("  src_qp         : %d\n", wc.src_qp);
+               kdb_printf("  wc_flags       : %x\n", wc.wc_flags);
+               kdb_printf("  pkey_index     : %d\n", wc.pkey_index);
+               kdb_printf("  slid           : %d\n", wc.slid);
+               kdb_printf("  sl             : %d\n", wc.sl);
+               kdb_printf("  dlid_path_bits : %d\n", wc.dlid_path_bits);
+               kdb_printf("  port_num       : %d\n", wc.port_num);
+       } else {
+               /* More than one arg */
+               kdb_printf("Specify address of ib_wc to dump\n");
+               return KDB_ARGCOUNT;
+       }
+       return ret;
+}
+
+static kdb_machreg_t sge_addr;
+static kdb_machreg_t addr;
+static int sge_no;
+
+static int
+print_ib_sge(int argc, const char **argv, const char **envp,
+           struct pt_regs *regs)
+{
+       int ret = 0;
+       struct ib_sge sge;
+
+       if (argc == 1) {
+               int nextarg = 1;
+               long offset = 0;
+
+               sge_no = 0;
+               ret = kdbgetaddrarg(argc, argv, &nextarg, &sge_addr, 
+                                   &offset, NULL, regs);
+               if (ret) 
+                       return ret;
+
+               ret = kdb_getarea_size((void*)&sge, (unsigned long)sge_addr, 
+                                      sizeof(struct ib_sge));
+               if (ret)
+                       return ret;
+
+       } 
+       kdb_printf("sge[%d].addr   : %llx\n", sge_no, sge.addr);
+       kdb_printf("sge[%d].length : %d\n", sge_no, sge.length);
+       kdb_printf("sge[%d].lkey   : %08x\n", sge_no, sge.lkey);
+       sge_no += 1;
+       sge_addr = (kdb_machreg_t)
+               ((unsigned long)sge_addr + sizeof(struct ib_sge));
+       return ret;
+}
+
+static const char *iwcm_state_str[] = {
+       "IW_CM_STATE_IDLE",
+       "IW_CM_STATE_LISTEN",
+       "IW_CM_STATE_CONN_RECV",
+       "IW_CM_STATE_CONN_SENT",
+       "IW_CM_STATE_ESTABLISHED",
+       "IW_CM_STATE_CLOSING",
+       "IW_CM_STATE_DESTROYING"
+};
+
+static inline const char *to_iwcm_state_str(int state)
+{
+       if (state < 0 || 
+           state > sizeof(iwcm_state_str)/sizeof(iwcm_state_str[0]))
+               return "<invalid state>";
+
+       
+       return iwcm_state_str[state];
+}
+
+static int
+print_iw_cm_id(int argc, const char **argv, const char **envp,
+           struct pt_regs *regs)
+{
+       int ret = 0;
+       struct iwcm_id_private id;
+       struct sockaddr_in *sin;
+
+       if (argc == 1) {
+               int nextarg = 1;
+               long offset = 0;
+
+               ret = kdbgetaddrarg(argc, argv, &nextarg, &addr, 
+                                   &offset, NULL, regs);
+               if (ret) 
+                       return ret;
+
+               ret = kdb_getarea_size((void*)&id, (unsigned long)addr, 
+                                      sizeof(struct iwcm_id_private));
+               if (ret)
+                       return ret;
+       } 
+       kdb_printf("iw_cm_handler   : %p\n", id.id.cm_handler);
+       kdb_printf("context         : %p\n", id.id.context);
+       sin = (struct sockaddr_in*)&id.id.local_addr;
+       kdb_printf("local_addr      : %d.%d.%d.%d\n", 
+                  NIPQUAD(sin->sin_addr.s_addr));
+       sin = (struct sockaddr_in*)&id.id.remote_addr;
+       kdb_printf("remote_addr     : %d.%d.%d.%d\n", 
+                  NIPQUAD(sin->sin_addr.s_addr));
+       kdb_printf("provider_data   : %p\n", id.id.provider_data);
+       kdb_printf("event_handler   : %p\n", id.id.event_handler);
+       kdb_printf("state           : %s\n", to_iwcm_state_str(id.state));
+       kdb_printf("flags           : %lx\n", id.flags);
+       kdb_printf("qp              : %p\n", id.qp);
+       kdb_printf("refcount        : %d\n", atomic_read(&id.refcount));
+
+       return ret;
+}
+
+
+static int
+print_ib_cq(int argc, const char **argv, const char **envp,
+           struct pt_regs *regs)
+{
+       int ret = 0;
+       struct ib_cq cq;
+
+       if (argc == 1) {
+               int nextarg = 1;
+               long offset = 0;
+
+               ret = kdbgetaddrarg(argc, argv, &nextarg, &addr, 
+                                   &offset, NULL, regs);
+               if (ret) 
+                       return ret;
+
+               ret = kdb_getarea_size((void*)&cq, (unsigned long)addr, 
+                                      sizeof(struct ib_cq));
+               if (ret)
+                       return ret;
+       } 
+
+       kdb_printf("Completion Queue\n"
+                  "----------------------------------------\n");
+       kdb_printf("device              : %p\n",cq.device);
+       kdb_printf("uobject             : %p\n",cq.uobject);
+       kdb_printf("comp_handler        : %p\n",cq.comp_handler);
+       kdb_printf("event_handler       : %p\n",cq.event_handler);
+       kdb_printf("cq_context          : %p\n",cq.cq_context);
+       kdb_printf("cqe                 : %d\n",cq.cqe);
+       kdb_printf("usecnt              : %d\n",atomic_read(&cq.usecnt));
+
+       return ret;
+}
+
+static const char *qp_type_str[] = {
+       "IB_QPT_SMI",
+       "IB_QPT_GSI",
+       "IB_QPT_RC",
+       "IB_QPT_UC",
+       "IB_QPT_UD",
+       "IB_QPT_RAW_IPV6",
+       "IB_QPT_RAW_ETY"
+};
+
+static inline const char *qp_type_to_str(int state)
+{
+       if (state < 0 || 
+           state >= sizeof(qp_type_str)/sizeof(qp_type_str[0]))
+               return "<invalid type>";
+
+       return qp_type_str[state];
+}
+
+static int
+print_ib_qp(int argc, const char **argv, const char **envp,
+           struct pt_regs *regs)
+{
+       int ret = 0;
+       struct ib_qp qp;
+
+       if (argc == 1) {
+               int nextarg = 1;
+               long offset = 0;
+
+               ret = kdbgetaddrarg(argc, argv, &nextarg, &addr, 
+                                   &offset, NULL, regs);
+               if (ret) 
+                       return ret;
+
+               ret = kdb_getarea_size((void*)&qp, (unsigned long)addr, 
+                                      sizeof(struct ib_qp));
+               if (ret)
+                       return ret;
+       } 
+
+       kdb_printf("Queueu Pair\n"
+                  "----------------------------------------\n");
+       kdb_printf("device              : %p\n",qp.device);
+       kdb_printf("pd                  : %p\n",qp.pd);
+       kdb_printf("send_cq             : %p\n",qp.send_cq);
+       kdb_printf("recv_cq             : %p\n",qp.recv_cq);
+       kdb_printf("srq                 : %p\n",qp.srq);
+       kdb_printf("uobject             : %p\n",qp.uobject);
+       kdb_printf("event_handler       : %p\n",qp.event_handler);
+       kdb_printf("qp_context          : %p\n",qp.qp_context);
+       kdb_printf("qp_num              : %d\n",qp.qp_num);
+       kdb_printf("qp_type             : %s\n",qp_type_to_str(qp.qp_type));
+
+       return ret;
+}
+
+static int
+print_ib_mr(int argc, const char **argv, const char **envp,
+           struct pt_regs *regs)
+{
+       int ret = 0;
+       struct ib_mr mr;
+
+       if (argc == 1) {
+               int nextarg = 1;
+               long offset = 0;
+
+               ret = kdbgetaddrarg(argc, argv, &nextarg, &addr, 
+                                   &offset, NULL, regs);
+               if (ret) 
+                       return ret;
+
+               ret = kdb_getarea_size((void*)&mr, (unsigned long)addr, 
+                                      sizeof(struct ib_mr));
+               if (ret)
+                       return ret;
+       } 
+
+       kdb_printf("Memory Region\n"
+                  "----------------------------------------\n");
+       kdb_printf("device      : %p\n", mr.device);
+       kdb_printf("pd          : %p\n", mr.pd);
+       kdb_printf("uobject     : %p\n", mr.uobject);
+       kdb_printf("lkey        : %08x\n", mr.lkey);
+       kdb_printf("rkey        : %08x\n", mr.rkey);
+       kdb_printf("usecnt      : %d\n", atomic_read(&mr.usecnt));
+
+       return ret;
+}
+
+static int __init rdma_init(void)
+{
+       kdb_register("ib_wc",  
+                    print_ib_wc, "<*ib_wc>", 
+                    "Display the specified IB Work Completion", 0);
+       kdb_register("ib_sge",  
+                    print_ib_sge, "<*ib_sge>", 
+                    "Display the specified IB Scatter Gather Entry", 0);
+       kdb_register("ib_qp",  
+                    print_ib_qp, "<*ib_qp>", 
+                    "Display the specified IB Queue Pair", 0);
+       kdb_register("ib_cq",  
+                    print_ib_cq, "<*ib_cq>", 
+                    "Display the specified IB Completion Queue", 0);
+       kdb_register("ib_mr",  
+                    print_ib_mr, "<*ib_mr>", 
+                    "Display the specified IB Memory Region", 0);
+       kdb_register("iw_cm_id",  
+                    print_iw_cm_id, "<*iw_cm_id>", 
+                    "Display the specified IW CM ID", 0);
+       return 0;
+}
+
+static void __exit rdma_exit(void)
+{
+       kdb_unregister("ib_wc");
+       kdb_unregister("ib_sge");
+}
+
+module_init(rdma_init)
+module_exit(rdma_exit)

> 
>       #include "iwcm.h"
> 
> Or the file is small enough that maybe it's simpler just to stuff this
> at the top of iwcm.c and kill the include entirely?
> 
>  - R.
> 
>  > --- /dev/null
>  > +++ b/include/rdma/iw_cm_private.h
>  > @@ -0,0 +1,63 @@
>  > +#ifndef IW_CM_PRIVATE_H
>  > +#define IW_CM_PRIVATE_H
>  > +
>  > +#include <rdma/iw_cm.h>
>  > +
>  > +enum iw_cm_state {
>  > +  IW_CM_STATE_IDLE,             /* unbound, inactive */
>  > +  IW_CM_STATE_LISTEN,           /* listen waiting for connect */
>  > +  IW_CM_STATE_CONN_RECV,        /* inbound waiting for user accept */
>  > +  IW_CM_STATE_CONN_SENT,        /* outbound waiting for peer accept */
>  > +  IW_CM_STATE_ESTABLISHED,      /* established */
>  > +  IW_CM_STATE_CLOSING,          /* disconnect */
>  > +  IW_CM_STATE_DESTROYING        /* object being deleted */
>  > +};
>  > +
>  > +struct iwcm_id_private {
>  > +  struct iw_cm_id id;
>  > +  enum iw_cm_state state;
>  > +  unsigned long flags;
>  > +  struct ib_qp *qp;
>  > +  struct completion destroy_comp;
>  > +  wait_queue_head_t connect_wait;
>  > +  struct list_head work_list;
>  > +  spinlock_t lock;
>  > +  atomic_t refcount;
>  > +  struct list_head work_free_list;
>  > +};
>  > +#define IWCM_F_CALLBACK_DESTROY   1
>  > +#define IWCM_F_CONNECT_WAIT       2
>  > +
>  > +#endif /* IW_CM_PRIVATE_H */
> -
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to