[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