Hi Sasha,

See below.

Sasha Khapyorsky wrote:
This adds support for new pkey enabled user_mad API. When ABI version
is 5 this tries to use IB_USER_MAD_ENABLE_PKEY ioctl().

Signed-off-by: Sasha Khapyorsky <[EMAIL PROTECTED]>
---
 libibumad/include/infiniband/umad.h |    4 ++-
 libibumad/src/umad.c                |   65 +++++++++++++++++++++++------------
 2 files changed, 46 insertions(+), 23 deletions(-)

diff --git a/libibumad/include/infiniband/umad.h 
b/libibumad/include/infiniband/umad.h
index 2ec8b37..21cf729 100644
--- a/libibumad/include/infiniband/umad.h
+++ b/libibumad/include/infiniband/umad.h
@@ -60,6 +60,8 @@ typedef struct ib_mad_addr {
        uint8_t  traffic_class;
        uint8_t  gid[16];
        uint32_t flow_label;
+       uint16_t pkey_index;
+       uint8_t  reserved[6];
 } ib_mad_addr_t;
typedef struct ib_user_mad {
@@ -80,8 +82,8 @@ typedef struct ib_user_mad {
#define IB_USER_MAD_REGISTER_AGENT _IOWR(IB_IOCTL_MAGIC, 1, \
                                              struct ib_user_mad_reg_req)
-
 #define IB_USER_MAD_UNREGISTER_AGENT   _IOW(IB_IOCTL_MAGIC, 2, uint32_t)
+#define IB_USER_MAD_ENABLE_PKEY                _IO(IB_IOCTL_MAGIC, 3)
#define UMAD_CA_NAME_LEN 20
 #define UMAD_CA_MAX_PORTS      10      /* 0 - 9 */
diff --git a/libibumad/src/umad.c b/libibumad/src/umad.c
index 41373e7..9d9f9c3 100644
--- a/libibumad/src/umad.c
+++ b/libibumad/src/umad.c
@@ -85,6 +85,9 @@ int umaddebug = 0;
 static char *def_ca_name = "mthca0";
 static int def_ca_port = 1;
+static unsigned abi_version;
+static unsigned new_user_mad_api;
+
 /*************************************
  * Port
  */
@@ -428,16 +431,14 @@ dev_to_umad_id(char *dev, unsigned port)
 int
 umad_init(void)
 {
-       unsigned abi_version;
-
        TRACE("umad_init");
        if (sys_read_uint(IB_UMAD_ABI_DIR, IB_UMAD_ABI_FILE, &abi_version) < 0) 
{
                IBWARN("can't read ABI version from %s/%s (%m): is ib_umad module 
loaded?",
                        IB_UMAD_ABI_DIR, IB_UMAD_ABI_FILE);
                return -1;
        }
-       if (abi_version != IB_UMAD_ABI_VERSION) {
-               IBWARN("wrong ABI version: %s/%s is %d but library ABI is %d",
+       if (abi_version < IB_UMAD_ABI_VERSION) {
+               IBWARN("wrong ABI version: %s/%s is %d but library minimal ABI is 
%d",
                        IB_UMAD_ABI_DIR, IB_UMAD_ABI_FILE, abi_version, 
IB_UMAD_ABI_VERSION);
                return -1;
        }
@@ -554,6 +555,21 @@ umad_open_port(char *ca_name, int portnum)
                return -EIO;
        }
+ if (abi_version > 5)
+               new_user_mad_api = 1;
+       else {
+               int ret = ioctl(fd, IB_USER_MAD_ENABLE_PKEY, NULL);
I got (ret = -1) and (errno = 515)
+               if (ret == 0)
+                       new_user_mad_api = 1;
+               else if (ret < 0 && errno == EINVAL)
+                       new_user_mad_api = 0;
+ else {
So eventually I got here.
I have kernel 2.6.9-42.

-- Yevgeny

+                       close(fd);
+                       IBWARN("cannot detect is user_mad P_Key enabled API 
supported.");
+                       return ret;
+               }
+       }
+
        DEBUG("opened %s fd %d portid %d", dev_file, fd, umad_id);
        return fd;
 }
@@ -636,13 +652,15 @@ umad_close_port(int fd)
 void *
 umad_get_mad(void *umad)
 {
-       return ((struct ib_user_mad *)umad)->data;
+       return new_user_mad_api ? ((struct ib_user_mad *)umad)->data :
+               (void *)&((struct ib_user_mad *)umad)->addr.pkey_index;
 }
size_t
 umad_size(void)
 {
-       return sizeof (struct ib_user_mad);
+       return new_user_mad_api ? sizeof (struct ib_user_mad) :
+               sizeof(struct ib_user_mad) - 8;
 }
int
@@ -663,11 +681,13 @@ umad_set_grh(void *umad, void *mad_addr)
 }
int
-umad_set_pkey(void *umad, int pkey)
+umad_set_pkey(void *umad, int pkey_index)
 {
-#if 0
-       mad->addr.pkey = 0;          /* FIXME - PKEY support */
-#endif
+       struct ib_user_mad *mad = umad;
+
+       if (new_user_mad_api)
+               mad->addr.pkey_index = htons(pkey_index);
+
        return 0;
 }
@@ -719,12 +739,12 @@ umad_send(int fd, int agentid, void *umad, int length,
        if (umaddebug > 1)
                umad_dump(mad);
- n = write(fd, mad, length + sizeof *mad);
-       if (n == length + sizeof *mad)
+       n = write(fd, mad, length + umad_size());
+       if (n == length + umad_size())
                return 0;
DEBUG("write returned %d != sizeof umad %zu + length %d (%m)",
-             n, sizeof *mad, length);
+             n, umad_size(), length);
        if (!errno)
                errno = EIO;
        return -EIO;
@@ -768,14 +788,14 @@ umad_recv(int fd, void *umad, int *length, int timeout_ms)
                return n;
        }
- n = read(fd, umad, sizeof *mad + *length);
+       n = read(fd, umad, umad_size() + *length);
- VALGRIND_MAKE_MEM_DEFINED(umad, sizeof *mad + *length);
+       VALGRIND_MAKE_MEM_DEFINED(umad, umad_size() + *length);
- if ((n >= 0) && (n <= sizeof *mad + *length)) {
+       if ((n >= 0) && (n <= umad_size() + *length)) {
                DEBUG("mad received by agent %d length %d", mad->agent_id, n);
-               if (n > sizeof *mad)
-                       *length = n - sizeof *mad;
+               if (n > umad_size())
+                       *length = n - umad_size();
                else
                        *length = 0;
                return mad->agent_id;
@@ -788,9 +808,9 @@ umad_recv(int fd, void *umad, int *length, int timeout_ms)
        }
DEBUG("read returned %zu > sizeof umad %zu + length %d (%m)",
-             mad->length - sizeof *mad, sizeof *mad, *length);
+             mad->length - umad_size(), umad_size(), *length);
- *length = mad->length - sizeof *mad;
+       *length = mad->length - umad_size();
        if (!errno)
                errno = EIO;
        return -errno;
@@ -929,11 +949,12 @@ umad_addr_dump(ib_mad_addr_t *addr)
        }
        gid_str[i*2] = 0;
        IBWARN("qpn %d qkey 0x%x lid 0x%x sl %d\n"
-               "grh_present %d gid_index %d hop_limit %d traffic_class %d 
flow_label 0x%x\n"
+               "grh_present %d gid_index %d hop_limit %d traffic_class %d 
flow_label 0x%x pkey_index 0x%x\n"
                "Gid 0x%s",
                ntohl(addr->qpn), ntohl(addr->qkey), ntohs(addr->lid), addr->sl,
                addr->grh_present, (int)addr->gid_index, (int)addr->hop_limit,
-               (int)addr->traffic_class, addr->flow_label, gid_str);
+               (int)addr->traffic_class, addr->flow_label, addr->pkey_index,
+               gid_str);
 }
void
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to