RDMA/ocrdma: Fix a crash in rmmod
1) ocrdma_remove_free() is called from a call_rcu callback funtion context, which can be a bottom-half context. So the code in ocrdma_remove_free should not sleep. But ocrdma_cleanup_hw() can sleep, So move it ocrdma_remove() instead of ocrdma_remove_free. 2) Fix a couple of kbuild test robot warnings. Signed-off-by: Naresh Gottumukkala <bgottumukkala@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
6ebacdfc07
commit
1852d1da3b
@ -122,6 +122,32 @@ struct mqe_ctx {
|
|||||||
bool cmd_done;
|
bool cmd_done;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ocrdma_hw_mr {
|
||||||
|
u32 lkey;
|
||||||
|
u8 fr_mr;
|
||||||
|
u8 remote_atomic;
|
||||||
|
u8 remote_rd;
|
||||||
|
u8 remote_wr;
|
||||||
|
u8 local_rd;
|
||||||
|
u8 local_wr;
|
||||||
|
u8 mw_bind;
|
||||||
|
u8 rsvd;
|
||||||
|
u64 len;
|
||||||
|
struct ocrdma_pbl *pbl_table;
|
||||||
|
u32 num_pbls;
|
||||||
|
u32 num_pbes;
|
||||||
|
u32 pbl_size;
|
||||||
|
u32 pbe_size;
|
||||||
|
u64 fbo;
|
||||||
|
u64 va;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ocrdma_mr {
|
||||||
|
struct ib_mr ibmr;
|
||||||
|
struct ib_umem *umem;
|
||||||
|
struct ocrdma_hw_mr hwmr;
|
||||||
|
};
|
||||||
|
|
||||||
struct ocrdma_dev {
|
struct ocrdma_dev {
|
||||||
struct ib_device ibdev;
|
struct ib_device ibdev;
|
||||||
struct ocrdma_dev_attr attr;
|
struct ocrdma_dev_attr attr;
|
||||||
@ -169,7 +195,7 @@ struct ocrdma_dev {
|
|||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
struct rcu_head rcu;
|
struct rcu_head rcu;
|
||||||
int id;
|
int id;
|
||||||
u64 stag_arr[OCRDMA_MAX_STAG];
|
struct ocrdma_mr *stag_arr[OCRDMA_MAX_STAG];
|
||||||
u16 pvid;
|
u16 pvid;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -294,31 +320,6 @@ struct ocrdma_qp {
|
|||||||
u16 db_cache;
|
u16 db_cache;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ocrdma_hw_mr {
|
|
||||||
u32 lkey;
|
|
||||||
u8 fr_mr;
|
|
||||||
u8 remote_atomic;
|
|
||||||
u8 remote_rd;
|
|
||||||
u8 remote_wr;
|
|
||||||
u8 local_rd;
|
|
||||||
u8 local_wr;
|
|
||||||
u8 mw_bind;
|
|
||||||
u8 rsvd;
|
|
||||||
u64 len;
|
|
||||||
struct ocrdma_pbl *pbl_table;
|
|
||||||
u32 num_pbls;
|
|
||||||
u32 num_pbes;
|
|
||||||
u32 pbl_size;
|
|
||||||
u32 pbe_size;
|
|
||||||
u64 fbo;
|
|
||||||
u64 va;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ocrdma_mr {
|
|
||||||
struct ib_mr ibmr;
|
|
||||||
struct ib_umem *umem;
|
|
||||||
struct ocrdma_hw_mr hwmr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ocrdma_ucontext {
|
struct ocrdma_ucontext {
|
||||||
struct ib_ucontext ibucontext;
|
struct ib_ucontext ibucontext;
|
||||||
|
@ -452,9 +452,6 @@ static void ocrdma_remove_free(struct rcu_head *rcu)
|
|||||||
{
|
{
|
||||||
struct ocrdma_dev *dev = container_of(rcu, struct ocrdma_dev, rcu);
|
struct ocrdma_dev *dev = container_of(rcu, struct ocrdma_dev, rcu);
|
||||||
|
|
||||||
ocrdma_free_resources(dev);
|
|
||||||
ocrdma_cleanup_hw(dev);
|
|
||||||
|
|
||||||
idr_remove(&ocrdma_dev_id, dev->id);
|
idr_remove(&ocrdma_dev_id, dev->id);
|
||||||
kfree(dev->mbx_cmd);
|
kfree(dev->mbx_cmd);
|
||||||
ib_dealloc_device(&dev->ibdev);
|
ib_dealloc_device(&dev->ibdev);
|
||||||
@ -470,6 +467,10 @@ static void ocrdma_remove(struct ocrdma_dev *dev)
|
|||||||
spin_lock(&ocrdma_devlist_lock);
|
spin_lock(&ocrdma_devlist_lock);
|
||||||
list_del_rcu(&dev->entry);
|
list_del_rcu(&dev->entry);
|
||||||
spin_unlock(&ocrdma_devlist_lock);
|
spin_unlock(&ocrdma_devlist_lock);
|
||||||
|
|
||||||
|
ocrdma_free_resources(dev);
|
||||||
|
ocrdma_cleanup_hw(dev);
|
||||||
|
|
||||||
call_rcu(&dev->rcu, ocrdma_remove_free);
|
call_rcu(&dev->rcu, ocrdma_remove_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2839,7 +2839,7 @@ struct ib_mr *ocrdma_alloc_frmr(struct ib_pd *ibpd, int max_page_list_len)
|
|||||||
goto mbx_err;
|
goto mbx_err;
|
||||||
mr->ibmr.rkey = mr->hwmr.lkey;
|
mr->ibmr.rkey = mr->hwmr.lkey;
|
||||||
mr->ibmr.lkey = mr->hwmr.lkey;
|
mr->ibmr.lkey = mr->hwmr.lkey;
|
||||||
dev->stag_arr[(mr->hwmr.lkey >> 8) & (OCRDMA_MAX_STAG - 1)] = (unsigned long) mr;
|
dev->stag_arr[(mr->hwmr.lkey >> 8) & (OCRDMA_MAX_STAG - 1)] = mr;
|
||||||
return &mr->ibmr;
|
return &mr->ibmr;
|
||||||
mbx_err:
|
mbx_err:
|
||||||
ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr);
|
ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user