Commit 1852d1da authored by Naresh Gottumukkala's avatar Naresh Gottumukkala Committed by Roland Dreier

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: default avatarNaresh Gottumukkala <bgottumukkala@emulex.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 6ebacdfc
...@@ -122,6 +122,32 @@ struct mqe_ctx { ...@@ -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 { ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment