Thanks Sasha for patch I will try it and looks like it would work.

Regards
sumit

Sasha Khapyorsky wrote:
On 04:50 Fri 12 Oct     , Hal Rosenstock wrote:

On Fri, 2007-10-12 at 12:09 +0530, Sumit Gaur - Sun Microsystem wrote:

Hi ,

Sean Hefty wrote:

There is no per thread demuxing. You would need two different mad agents
to do this with one looking at the SMI side and the other the GSI side.
I haven't looked at libibmad in terms of using this model though.


umad_receive() doesn't take the mad_agent as an input parameter.  The only
possibility I see is calling umad_open_port() twice for the same port, with the
GSI/SMI registrations going to separate port_id's.

I think this solution is also not possible as calling umad_open_port() twice for the same port and ca_name is always gives error in port_alloc because dev_to_umad_id generate same umad_id for same ca_name and portnum.

ibwarn: [9634] port_alloc: umad port id 1 is already allocated for mthca0 2

So looks like it is impossible to generate two separate portid for the same 
port.

It might be possible to support this with some changes to libibumad.
Sasha ?


Yes, it could be possible this way.

Sumit, could you try this patch?

Sasha


diff --git a/libibumad/src/umad.c b/libibumad/src/umad.c
index 589684c..5ccdcfb 100644
--- a/libibumad/src/umad.c
+++ b/libibumad/src/umad.c
@@ -82,6 +82,7 @@ int umaddebug = 0;
#define UMAD_DEV_NAME_SZ 32
 #define UMAD_DEV_FILE_SZ       256
+#define MAX_OPEN_PORTS 2048
static char *def_ca_name = "mthca0";
 static int def_ca_port = 1;
@@ -94,54 +95,18 @@ typedef struct Port {
        int id;
 } Port;
-static Port ports[UMAD_MAX_PORTS];
+static Port *open_ports[MAX_OPEN_PORTS];
/*************************************
  * Port
  */
 static Port *
-port_alloc(int portid, char *dev, int portnum)
-{
-       Port *port = ports + portid;
-
-       if (portid < 0 || portid >= UMAD_MAX_PORTS) {
-               IBWARN("bad umad portid %d", portid);
-               errno = EINVAL;
-               return 0;
-       }
-
-       if (port->dev_name[0]) {
-               IBWARN("umad port id %d is already allocated for %s %d",
-                       portid, port->dev_name, port->dev_port);
-               errno = EBUSY;
-               return 0;
-       }
-
-       strncpy(port->dev_name, dev, UMAD_CA_NAME_LEN);
-       port->dev_port = portnum;
-       port->id = portid;
-
-       return port;
-}
-
-static Port *
 port_get(int portid)
 {
-       Port *port = ports + portid;
-
-       if (portid < 0 || portid >= UMAD_MAX_PORTS)
-               return 0;
-
-       if (port->dev_name[0] == 0)
-               return 0;
-
-       return port;
-}
+       if (portid < 0 || portid >= MAX_OPEN_PORTS)
+               return NULL;
-static void
-port_free(Port *port)
-{
-       memset(port, 0, sizeof *port);
+       return open_ports[portid];
 }
static int
@@ -571,7 +536,7 @@ umad_get_ca_portguids(char *ca_name, uint64_t *portguids, 
int max)
 int
 umad_open_port(char *ca_name, int portnum)
 {
-       int umad_id;
+       int umad_id, fd;
        Port *port;
TRACE("ca %s port %d", ca_name, portnum);
@@ -584,19 +549,35 @@ umad_open_port(char *ca_name, int portnum)
        if ((umad_id = dev_to_umad_id(ca_name, portnum)) < 0)
                return -EINVAL;
- if (!(port = port_alloc(umad_id, ca_name, portnum)))
-               return -errno;
+       port = malloc(sizeof(*port));
+       if (!port)
+               return -ENOMEM;
+       memset(port, 0, sizeof(*port));
snprintf(port->dev_file, sizeof port->dev_file - 1, "%s/umad%d",
                 UMAD_DEV_DIR , umad_id);
- if ((port->dev_fd = open(port->dev_file, O_RDWR|O_NONBLOCK)) < 0) {
+       fd = open(port->dev_file, O_RDWR|O_NONBLOCK);
+       if (fd < 0) {
                DEBUG("open %s failed: %s", port->dev_file, strerror(errno));
+               free(port);
                return -EIO;
+       } else if (fd >= MAX_OPEN_PORTS) {
+               DEBUG("no ports space for %s", port->dev_file);
+               errno = ENOMEM;
+               free(port);
+               return -ENOMEM;
        }
+ port->id = umad_id;
+       port->dev_port = portnum;
+       port->dev_fd = fd;
+       strncpy(port->dev_name, ca_name, UMAD_CA_NAME_LEN);
+
+       open_ports[fd] = port;
+
        DEBUG("opened %s fd %d portid %d", port->dev_file, port->dev_fd, 
port->id);
-       return port->id;
+       return fd;
 }
int
@@ -677,7 +658,8 @@ umad_close_port(int portid)
close(port->dev_fd); - port_free(port);
+       open_ports[portid] = NULL;
+       free(port);
DEBUG("closed %s fd %d", port->dev_file, port->dev_fd);
        return 0;
_______________________________________________
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