very real cases, so I reworked it to be simpler.
It's started once from ptlrpc_init now, and stopped once from ptlrpc_exit
Adding and deleting imports no longer causes the thread to be created
and go away. Most importantly, we no longer hold the sem in
stop_pinger across the wake_up and subsequent l_wait_event; if the
pinger thread was already doing something, blocked on the pinger_sem,
it would never wake up and deadlock would ensue.
int ptlrpc_expire_one_request(struct ptlrpc_request *req);
+/* pinger.c */
+int ptlrpc_start_pinger(void);
+int ptlrpc_stop_pinger(void);
void ptlrpc_pinger_sending_on_import(struct obd_import *imp);
+
#endif /* PTLRPC_INTERNAL_H */
ptlrpc_put_connection_superhack = ptlrpc_put_connection;
ptlrpc_abort_inflight_superhack = ptlrpc_abort_inflight;
+
+ ptlrpc_start_pinger();
RETURN(0);
}
static void __exit ptlrpc_exit(void)
{
+ ptlrpc_stop_pinger();
ptlrpc_exit_portals();
ptlrpc_cleanup_connection();
llog_cleanup_commit_master(0);