return rc;
}
- i = 4;
- while (atomic_read(&kgnilnd_data.kgn_npending_conns) ||
- atomic_read(&kgnilnd_data.kgn_npending_detach) ||
- atomic_read(&kgnilnd_data.kgn_npending_unlink)) {
-
- schedule_timeout_uninterruptible(cfs_time_seconds(1));
- i++;
-
- CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, "Waiting on %d peers %d closes %d detaches\n",
+ wait_var_event_warning(&kgnilnd_data,
+ !atomic_read(&kgnilnd_data.kgn_npending_conns) &&
+ !atomic_read(&kgnilnd_data.kgn_npending_detach) &&
+ !atomic_read(&kgnilnd_data.kgn_npending_unlink),
+ "Waiting on %d peers %d closes %d detaches\n",
atomic_read(&kgnilnd_data.kgn_npending_unlink),
atomic_read(&kgnilnd_data.kgn_npending_conns),
atomic_read(&kgnilnd_data.kgn_npending_detach));
- }
return rc;
}
#error "this code uses actions inside LASSERT for ref counting"
#endif
-#define kgnilnd_admin_addref(atomic) \
-do { \
- int val = atomic_inc_return(&atomic); \
- LASSERTF(val > 0, #atomic " refcount %d\n", val); \
- CDEBUG(D_NETTRACE, #atomic " refcount %d\n", val); \
+#define kgnilnd_admin_addref(atomic) \
+do { \
+ int val = atomic_inc_return(&atomic); \
+ LASSERTF(val > 0, #atomic " refcount %d\n", val); \
+ CDEBUG(D_NETTRACE, #atomic " refcount %d\n", val); \
} while (0)
-#define kgnilnd_admin_decref(atomic) \
-do { \
- int val = atomic_dec_return(&atomic); \
- LASSERTF(val >=0, #atomic " refcount %d\n", val); \
- CDEBUG(D_NETTRACE, #atomic " refcount %d\n", val); \
+#define kgnilnd_admin_decref(atomic) \
+do { \
+ int val = atomic_dec_return(&atomic); \
+ LASSERTF(val >= 0, #atomic " refcount %d\n", val); \
+ CDEBUG(D_NETTRACE, #atomic " refcount %d\n", val); \
+ if (!val) \
+ wake_up_var(&kgnilnd_data); \
}while (0)
#define kgnilnd_net_addref(net) \