IB/rdmavt,hfi1,qib: Fix memory leak
rdi->ports has memory allocated in rvt_alloc_device(), but does not get freed because the hfi1 and qib drivers drivers call ib_dealloc_device() directly instead of going through rdmavt. Add a rvt_dealloc_device() that frees rdi->ports and then calls ib_dealloc_device(). Switch hfi1 and qib drivers to calling rvt_dealloc_device() instead of ib_dealloc_device() directly. Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Reviewed-by: Brian Welty <brian.welty@intel.com> Signed-off-by: Jubin John <jubin.john@intel.com> Reviewed-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
e88c9271d9
commit
ea0e4ce3bc
4 changed files with 18 additions and 4 deletions
|
@ -1090,7 +1090,7 @@ void qib_free_devdata(struct qib_devdata *dd)
|
||||||
qib_dbg_ibdev_exit(&dd->verbs_dev);
|
qib_dbg_ibdev_exit(&dd->verbs_dev);
|
||||||
#endif
|
#endif
|
||||||
free_percpu(dd->int_counter);
|
free_percpu(dd->int_counter);
|
||||||
ib_dealloc_device(&dd->verbs_dev.rdi.ibdev);
|
rvt_dealloc_device(&dd->verbs_dev.rdi);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 qib_int_counter(struct qib_devdata *dd)
|
u64 qib_int_counter(struct qib_devdata *dd)
|
||||||
|
@ -1183,7 +1183,7 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra)
|
||||||
bail:
|
bail:
|
||||||
if (!list_empty(&dd->list))
|
if (!list_empty(&dd->list))
|
||||||
list_del_init(&dd->list);
|
list_del_init(&dd->list);
|
||||||
ib_dealloc_device(&dd->verbs_dev.rdi.ibdev);
|
rvt_dealloc_device(&dd->verbs_dev.rdi);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,6 +106,19 @@ struct rvt_dev_info *rvt_alloc_device(size_t size, int nports)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(rvt_alloc_device);
|
EXPORT_SYMBOL(rvt_alloc_device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rvt_dealloc_device - deallocate rdi
|
||||||
|
* @rdi: structure to free
|
||||||
|
*
|
||||||
|
* Free a structure allocated with rvt_alloc_device()
|
||||||
|
*/
|
||||||
|
void rvt_dealloc_device(struct rvt_dev_info *rdi)
|
||||||
|
{
|
||||||
|
kfree(rdi->ports);
|
||||||
|
ib_dealloc_device(&rdi->ibdev);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(rvt_dealloc_device);
|
||||||
|
|
||||||
static int rvt_query_device(struct ib_device *ibdev,
|
static int rvt_query_device(struct ib_device *ibdev,
|
||||||
struct ib_device_attr *props,
|
struct ib_device_attr *props,
|
||||||
struct ib_udata *uhw)
|
struct ib_udata *uhw)
|
||||||
|
|
|
@ -1007,7 +1007,7 @@ void hfi1_free_devdata(struct hfi1_devdata *dd)
|
||||||
free_percpu(dd->rcv_limit);
|
free_percpu(dd->rcv_limit);
|
||||||
hfi1_dev_affinity_free(dd);
|
hfi1_dev_affinity_free(dd);
|
||||||
free_percpu(dd->send_schedule);
|
free_percpu(dd->send_schedule);
|
||||||
ib_dealloc_device(&dd->verbs_dev.rdi.ibdev);
|
rvt_dealloc_device(&dd->verbs_dev.rdi);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1110,7 +1110,7 @@ struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev, size_t extra)
|
||||||
bail:
|
bail:
|
||||||
if (!list_empty(&dd->list))
|
if (!list_empty(&dd->list))
|
||||||
list_del_init(&dd->list);
|
list_del_init(&dd->list);
|
||||||
ib_dealloc_device(&dd->verbs_dev.rdi.ibdev);
|
rvt_dealloc_device(&dd->verbs_dev.rdi);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -467,6 +467,7 @@ static inline struct rvt_qp *rvt_lookup_qpn(struct rvt_dev_info *rdi,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct rvt_dev_info *rvt_alloc_device(size_t size, int nports);
|
struct rvt_dev_info *rvt_alloc_device(size_t size, int nports);
|
||||||
|
void rvt_dealloc_device(struct rvt_dev_info *rdi);
|
||||||
int rvt_register_device(struct rvt_dev_info *rvd);
|
int rvt_register_device(struct rvt_dev_info *rvd);
|
||||||
void rvt_unregister_device(struct rvt_dev_info *rvd);
|
void rvt_unregister_device(struct rvt_dev_info *rvd);
|
||||||
int rvt_check_ah(struct ib_device *ibdev, struct ib_ah_attr *ah_attr);
|
int rvt_check_ah(struct ib_device *ibdev, struct ib_ah_attr *ah_attr);
|
||||||
|
|
Loading…
Add table
Reference in a new issue