- int rc;
- int eqsz;
-#ifndef __KERNEL__
- lnet_peer_t *rtr;
- __u64 version;
- int nrtr = 0;
- int router_checker_max_eqsize = 10240;
-
- LASSERT (check_routers_before_use);
- LASSERT (dead_router_check_interval > 0);
-
- lnet_net_lock(0);
-
- /* As an approximation, allow each router the same number of
- * outstanding events as it is allowed outstanding sends */
- eqsz = 0;
- version = the_lnet.ln_routers_version;
- cfs_list_for_each_entry(rtr, &the_lnet.ln_routers, lp_rtr_list) {
- lnet_ni_t *ni = rtr->lp_ni;
- lnet_process_id_t id;
-
- nrtr++;
- eqsz += ni->ni_peertxcredits;
-
- /* one async ping reply per router */
- id.nid = rtr->lp_nid;
- id.pid = LUSTRE_SRV_LNET_PID;
-
- lnet_net_unlock(0);
-
- rc = LNetSetAsync(id, 1);
- if (rc != 0) {
- CWARN("LNetSetAsync %s failed: %d\n",
- libcfs_id2str(id), rc);
- return rc;
- }
-
- lnet_net_lock(0);
- /* NB router list doesn't change in userspace */
- LASSERT(version == the_lnet.ln_routers_version);
- }
-
- lnet_net_unlock(0);
-
- if (nrtr == 0) {
- CDEBUG(D_NET,
- "No router found, not starting router checker\n");
- return 0;
- }
-
- /* at least allow a SENT and a REPLY per router */
- if (router_checker_max_eqsize < 2 * nrtr)
- router_checker_max_eqsize = 2 * nrtr;
-
- LASSERT (eqsz > 0);
- if (eqsz > router_checker_max_eqsize)
- eqsz = router_checker_max_eqsize;
-#endif
-
- LASSERT (the_lnet.ln_rc_state == LNET_RC_STATE_SHUTDOWN);
-
- if (check_routers_before_use &&
- dead_router_check_interval <= 0) {
- LCONSOLE_ERROR_MSG(0x10a, "'dead_router_check_interval' must be"
- " set if 'check_routers_before_use' is set"
- "\n");
- return -EINVAL;
- }
-
- if (!the_lnet.ln_routing &&
- live_router_check_interval <= 0 &&
- dead_router_check_interval <= 0)
- return 0;
-
-#ifdef __KERNEL__
- sema_init(&the_lnet.ln_rc_signal, 0);
- /* EQ size doesn't matter; the callback is guaranteed to get every
- * event */
- eqsz = 0;
- rc = LNetEQAlloc(eqsz, lnet_router_checker_event,
- &the_lnet.ln_rc_eqh);
-#else
- rc = LNetEQAlloc(eqsz, LNET_EQ_HANDLER_NONE,
- &the_lnet.ln_rc_eqh);
-#endif
- if (rc != 0) {
- CERROR("Can't allocate EQ(%d): %d\n", eqsz, rc);
- return -ENOMEM;
- }
-
- the_lnet.ln_rc_state = LNET_RC_STATE_RUNNING;
-#ifdef __KERNEL__
- rc = PTR_ERR(kthread_run(lnet_router_checker,
- NULL, "router_checker"));
- if (IS_ERR_VALUE(rc)) {
- CERROR("Can't start router checker thread: %d\n", rc);
- /* block until event callback signals exit */
- down(&the_lnet.ln_rc_signal);
- rc = LNetEQFree(the_lnet.ln_rc_eqh);
- LASSERT(rc == 0);
- the_lnet.ln_rc_state = LNET_RC_STATE_SHUTDOWN;
- return -ENOMEM;
- }
-#endif
-
- if (check_routers_before_use) {
- /* Note that a helpful side-effect of pinging all known routers
- * at startup is that it makes them drop stale connections they
- * may have to a previous instance of me. */
- lnet_wait_known_routerstate();
- }