[ofa-general] question regarding umad_recv
Sumit Gaur - Sun Microsystem
Sumit.Gaur at Sun.COM
Sun Oct 14 21:16:16 PDT 2007
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;
More information about the general
mailing list