Showing error 803

User: Jiri Slaby
Error type: Memory Leak
Error type description: There the code omits to free some allocated memory
File location: drivers/infiniband/core/mad.c
Line in file: 838
Project: Linux Kernel
Project version: 2.6.28
Tools: Stanse (1.2)
Entered: 2011-11-07 22:26:27 UTC


Source:

 808}
 809
 810static int alloc_send_rmpp_list(struct ib_mad_send_wr_private *send_wr,
 811                                gfp_t gfp_mask)
 812{
 813        struct ib_mad_send_buf *send_buf = &send_wr->send_buf;
 814        struct ib_rmpp_mad *rmpp_mad = send_buf->mad;
 815        struct ib_rmpp_segment *seg = NULL;
 816        int left, seg_size, pad;
 817
 818        send_buf->seg_size = sizeof (struct ib_mad) - send_buf->hdr_len;
 819        seg_size = send_buf->seg_size;
 820        pad = send_wr->pad;
 821
 822        /* Allocate data segments. */
 823        for (left = send_buf->data_len + pad; left > 0; left -= seg_size) {
 824                seg = kmalloc(sizeof (*seg) + seg_size, gfp_mask);
 825                if (!seg) {
 826                        printk(KERN_ERR "alloc_send_rmpp_segs: RMPP mem "
 827                               "alloc failed for len %zd, gfp %#x\n",
 828                               sizeof (*seg) + seg_size, gfp_mask);
 829                        free_send_rmpp_list(send_wr);
 830                        return -ENOMEM;
 831                }
 832                seg->num = ++send_buf->seg_count;
 833                list_add_tail(&seg->list, &send_wr->rmpp_list);
 834        }
 835
 836        /* Zero any padding */
 837        if (pad)
 838                memset(seg->data + seg_size - pad, 0, pad);
 839
 840        rmpp_mad->rmpp_hdr.rmpp_version = send_wr->mad_agent_priv->
 841                                          agent.rmpp_version;
 842        rmpp_mad->rmpp_hdr.rmpp_type = IB_MGMT_RMPP_TYPE_DATA;
 843        ib_set_rmpp_flags(&rmpp_mad->rmpp_hdr, IB_MGMT_RMPP_FLAG_ACTIVE);
 844
 845        send_wr->cur_seg = container_of(send_wr->rmpp_list.next,
 846                                        struct ib_rmpp_segment, list);
 847        send_wr->last_ack_seg = send_wr->cur_seg;
 848        return 0;
Show full sources