* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
RETURN(0);
}
-void ptlrpc_update_next_ping(struct obd_import *imp)
+void ptlrpc_update_next_ping(struct obd_import *imp, int soon)
{
#ifdef ENABLE_PINGER
- int time = PING_INTERVAL;
+ int time = soon ? PING_INTERVAL_SHORT : PING_INTERVAL;
if (imp->imp_state == LUSTRE_IMP_DISCON) {
int dtime = max_t(int, CONNECTION_SWITCH_MIN,
AT_OFF ? 0 :
cfs_time_after(imp->imp_next_ping,
cfs_time_add(this_ping,
cfs_time_seconds(PING_INTERVAL))))
- ptlrpc_update_next_ping(imp);
+ ptlrpc_update_next_ping(imp, 0);
}
cfs_mutex_up(&pinger_sem);
/* update memory usage info */
/* CLONE_VM and CLONE_FILES just avoid a needless copy, because we
* just drop the VM and FILES in cfs_daemonize_ctxt() right away. */
- rc = cfs_kernel_thread(ptlrpc_pinger_main, &d, CLONE_VM | CLONE_FILES);
+ rc = cfs_create_thread(ptlrpc_pinger_main, &d, CFS_DAEMON_FLAGS);
if (rc < 0) {
CERROR("cannot start thread: %d\n", rc);
OBD_FREE(pinger_thread, sizeof(*pinger_thread));
void ptlrpc_pinger_sending_on_import(struct obd_import *imp)
{
- ptlrpc_update_next_ping(imp);
+ ptlrpc_update_next_ping(imp, 0);
+}
+
+void ptlrpc_pinger_commit_expected(struct obd_import *imp)
+{
+ ptlrpc_update_next_ping(imp, 1);
}
int ptlrpc_pinger_add_import(struct obd_import *imp)
imp->imp_obd->obd_uuid.uuid, obd2cli_tgt(imp->imp_obd));
/* if we add to pinger we want recovery on this import */
imp->imp_obd->obd_no_recov = 0;
- ptlrpc_update_next_ping(imp);
+ ptlrpc_update_next_ping(imp, 0);
/* XXX sort, blah blah */
cfs_list_add_tail(&imp->imp_pinger_chain, &pinger_imports);
class_import_get(imp);
obd = class_exp2obd(exp);
if (cfs_list_empty(&obd->obd_evict_list)) {
- class_incref(obd, __FUNCTION__, cfs_current());
+ class_incref(obd, "evictor", obd);
cfs_list_add(&obd->obd_evict_list, &pet_list);
}
cfs_spin_unlock(&pet_lock);
cfs_list_del_init(&obd->obd_evict_list);
cfs_spin_unlock(&pet_lock);
- class_decref(obd, __FUNCTION__, cfs_current());
+ class_decref(obd, "evictor", obd);
}
CDEBUG(D_HA, "Exiting Ping Evictor\n");
cfs_waitq_init(&pet_waitq);
- rc = cfs_kernel_thread(ping_evictor_main, NULL, CLONE_VM | CLONE_FILES);
+ rc = cfs_create_thread(ping_evictor_main, NULL, CFS_DAEMON_FLAGS);
if (rc < 0) {
pet_refcount--;
CERROR("Cannot start ping evictor thread: %d\n", rc);
cfs_mutex_up(&pinger_sem);
/* Might be empty, that's OK. */
- if (set->set_remaining == 0)
+ if (cfs_atomic_read(&set->set_remaining) == 0)
CDEBUG(D_RPCTRACE, "nothing to ping\n");
cfs_list_for_each(iter, &set->set_requests) {
cfs_atomic_dec(&imp->imp_inflight);
}
cfs_spin_unlock(&imp->imp_lock);
- set->set_remaining--;
+ cfs_atomic_dec(&set->set_remaining);
}
cfs_mutex_up(&pinger_sem);
{
#ifdef ENABLE_PINGER
cfs_mutex_down(&pinger_sem);
- ptlrpc_update_next_ping(imp);
+ ptlrpc_update_next_ping(imp, 0);
if (pinger_args.pd_set == NULL &&
cfs_time_before(imp->imp_next_ping, pinger_args.pd_next_ping)) {
CDEBUG(D_HA, "set next ping to "CFS_TIME_T"(cur "CFS_TIME_T")\n",
#endif
}
+void ptlrpc_pinger_commit_expected(struct obd_import *imp)
+{
+#ifdef ENABLE_PINGER
+ cfs_mutex_down(&pinger_sem);
+ ptlrpc_update_next_ping(imp, 1);
+ if (pinger_args.pd_set == NULL &&
+ cfs_time_before(imp->imp_next_ping, pinger_args.pd_next_ping)) {
+ CDEBUG(D_HA,"set next ping to "CFS_TIME_T"(cur "CFS_TIME_T")\n",
+ imp->imp_next_ping, cfs_time_current());
+ pinger_args.pd_next_ping = imp->imp_next_ping;
+ }
+ cfs_mutex_up(&pinger_sem);
+#endif
+}
+
int ptlrpc_add_timeout_client(int time, enum timeout_event event,
timeout_cb_t cb, void *data,
cfs_list_t *obd_list)