[ofa-general] RE: [PATCHv3] mad.c: Fix memory leak in switch handling and improve error handling

Suresh Shelvapille suri at baymicrosystems.com
Thu Oct 18 08:08:55 PDT 2007


Hal:

I don't have a copy of the email with a patch but, here is the email chain that I and
you exchanged. This patch was submitted as part of the memory leak fix and it 
should have made it to 2.6.23 rc-2 or 3 I think.

Thanks,
Suri


> > > >
> > > > mad.c: Fix memory leak in switch handling and improve error handling
> > > >
> > > > Signed-off-by: Suresh Shelvapille <suri at baymicrosystems.com>
> > > > Signed-off-by: Hal Rosenstock <hal.rosenstock at gmail.com>
> > > >
> > > > diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
> > > > index bc547f1..6310dc3 100644
> > > > --- a/drivers/infiniband/core/mad.c
> > > > +++ b/drivers/infiniband/core/mad.c
> > > > @@ -1847,11 +1847,6 @@ static void ib_mad_recv_done_handler(struct
> > > > ib_mad_port_private *port_priv,
> > > >        struct ib_mad_agent_private *mad_agent;
> > > >        int port_num;
> > > >
> > > > -       response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
> > > > -       if (!response)
> > > > -               printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
> > > > -                      "for response buffer\n");
> > > > -
> > > >        mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;
> > > >        qp_info = mad_list->mad_queue->qp_info;
> > > >        dequeue_mad(mad_list);
> > > > @@ -1879,6 +1874,13 @@ static void ib_mad_recv_done_handler(struct
> > > > ib_mad_port_private *port_priv,
> > > >        if (!validate_mad(&recv->mad.mad, qp_info->qp->qp_num))
> > > >                goto out;
> > > >
> > > > +       response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
> > > > +       if (!response) {
> > > > +               printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
> > > > +                      "for response buffer\n");
> > > > +               goto out;
> > > > +       }
> > > > +
> > > >        if (port_priv->device->node_type == RDMA_NODE_IB_SWITCH)
> > > >                port_num = wc->port_num;
> > > >        else
> > > > @@ -1914,12 +1916,11 @@ static void ib_mad_recv_done_handler(struct
> > > > ib_mad_port_private *port_priv,
> > > >                        response->header.recv_wc.recv_buf.mad =
> > > > &response->mad.mad;
> > > >                        response->header.recv_wc.recv_buf.grh = &response->grh;
> > > >
> > > > -                       if (!agent_send_response(&response->mad.mad,
> > > > -                                                &response->grh, wc,
> > > > -                                                port_priv->device,
> > > > -
> > > > smi_get_fwd_port(&recv->mad.smp),
> > > > -                                                qp_info->qp->qp_num))
> > > > -                               response = NULL;
> > > > +                       agent_send_response(&response->mad.mad,
> > > > +                                           &response->grh, wc,
> > > > +                                           port_priv->device,
> > > > +                                           smi_get_fwd_port(&recv->mad.smp),
> > > > +                                           qp_info->qp->qp_num);
> > > >
> > > >                        goto out;
> > > >                }
> > > > @@ -1930,15 +1931,6 @@ local:
> > > >        if (port_priv->device->process_mad) {
> > > >                int ret;
> > > >
> > > > -               if (!response) {
> > > > -                       printk(KERN_ERR PFX "No memory for response MAD\n");
> > > > -                       /*
> > > > -                        * Is it better to assume that
> > > > -                        * it wouldn't be processed ?
> > > > -                        */
> > > > -                       goto out;
> > > > -               }
> > > > -
> > > >                ret = port_priv->device->process_mad(port_priv->device, 0,
> > > >                                                     port_priv->port_num,
> > > >                                                     wc, &recv->grh,
> > >
> > >




More information about the general mailing list