Skip to content

Commit

Permalink
RDS/IB: wait for IB dev freeing work to finish during rmmod
Browse files Browse the repository at this point in the history
The RDS IB client removal callback can queue work to drop the final reference
to an IB device.  We have to make sure that this function has returned before
we complete rmmod or the work threads can try to execute freed code.

Signed-off-by: Zach Brown <zach.brown@oracle.com>
  • Loading branch information
Zach Brown authored and Andy Grover committed Sep 9, 2010
1 parent b6fb0df commit 24fa163
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions net/rds/ib.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,11 +336,18 @@ static int rds_ib_laddr_check(__be32 addr)
return ret;
}

static void rds_ib_unregister_client(void)
{
ib_unregister_client(&rds_ib_client);
/* wait for rds_ib_dev_free() to complete */
flush_workqueue(rds_wq);
}

void rds_ib_exit(void)
{
rds_info_deregister_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info);
rds_ib_destroy_nodev_conns();
ib_unregister_client(&rds_ib_client);
rds_ib_unregister_client();
rds_ib_sysctl_exit();
rds_ib_recv_exit();
rds_trans_unregister(&rds_ib_transport);
Expand Down Expand Up @@ -404,7 +411,7 @@ int __init rds_ib_init(void)
out_sysctl:
rds_ib_sysctl_exit();
out_ibreg:
ib_unregister_client(&rds_ib_client);
rds_ib_unregister_client();
out:
return ret;
}
Expand Down

0 comments on commit 24fa163

Please sign in to comment.