|
@@ -824,9 +824,9 @@ void rxe_qp_destroy(struct rxe_qp *qp)
|
|
|
}
|
|
|
|
|
|
/* called when the last reference to the qp is dropped */
|
|
|
-void rxe_qp_cleanup(struct rxe_pool_entry *arg)
|
|
|
+static void rxe_qp_do_cleanup(struct work_struct *work)
|
|
|
{
|
|
|
- struct rxe_qp *qp = container_of(arg, typeof(*qp), pelem);
|
|
|
+ struct rxe_qp *qp = container_of(work, typeof(*qp), cleanup_work.work);
|
|
|
|
|
|
rxe_drop_all_mcast_groups(qp);
|
|
|
|
|
@@ -859,3 +859,11 @@ void rxe_qp_cleanup(struct rxe_pool_entry *arg)
|
|
|
kernel_sock_shutdown(qp->sk, SHUT_RDWR);
|
|
|
sock_release(qp->sk);
|
|
|
}
|
|
|
+
|
|
|
+/* called when the last reference to the qp is dropped */
|
|
|
+void rxe_qp_cleanup(struct rxe_pool_entry *arg)
|
|
|
+{
|
|
|
+ struct rxe_qp *qp = container_of(arg, typeof(*qp), pelem);
|
|
|
+
|
|
|
+ execute_in_process_context(rxe_qp_do_cleanup, &qp->cleanup_work);
|
|
|
+}
|