RDS/IB: wait for IB dev freeing work to finish during rmmod
authorZach Brown <zach.brown@oracle.com>
Fri, 25 Jun 2010 21:59:49 +0000 (14:59 -0700)
committerAndy Grover <andy.grover@oracle.com>
Thu, 9 Sep 2010 01:16:32 +0000 (18:16 -0700)
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>
net/rds/ib.c

index b21e24fd060c3633722094d73e8df9e310c31d8c..fc14f637d645a5e21aaa73a146ed0d1f9fcd35c4 100644 (file)
@@ -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);
@@ -404,7 +411,7 @@ out_recv:
 out_sysctl:
        rds_ib_sysctl_exit();
 out_ibreg:
-       ib_unregister_client(&rds_ib_client);
+       rds_ib_unregister_client();
 out:
        return ret;
 }