router.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 1,077 行 · 第 1/3 页

C
1,077
字号
        /* The unlink event callback will signal final completion */	return 0;}voidlnet_wait_known_routerstate(void){        lnet_peer_t         *rtr;        struct list_head    *entry;        int                  all_known;        for (;;) {                LNET_LOCK();                                all_known = 1;                list_for_each (entry, &the_lnet.ln_routers) {                        rtr = list_entry(entry, lnet_peer_t, lp_rtr_list);                                        if (rtr->lp_alive_count == 0) {                                all_known = 0;                                break;                        }                }                LNET_UNLOCK();                if (all_known)                        return;                cfs_pause(cfs_time_seconds(1));        }}voidlnet_router_checker_stop(void){        int       rc;        LASSERT (the_lnet.ln_rc_state == LNET_RC_STATE_RUNNING ||                 the_lnet.ln_rc_state == LNET_RC_STATE_SHUTDOWN);        if (the_lnet.ln_rc_state == LNET_RC_STATE_SHUTDOWN)                return;        the_lnet.ln_rc_state = LNET_RC_STATE_STOPTHREAD;	/* block until event callback signals exit */	mutex_down(&the_lnet.ln_rc_signal);        LASSERT (the_lnet.ln_rc_state == LNET_RC_STATE_UNLINKED);        rc = LNetEQFree(the_lnet.ln_rc_eqh);        LASSERT (rc == 0);                the_lnet.ln_rc_state = LNET_RC_STATE_SHUTDOWN;}intlnet_router_checker_start(void){        int  rc;        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 (live_router_check_interval <= 0 &&            dead_router_check_interval <= 0)                return 0;	init_mutex_locked(&the_lnet.ln_rc_signal);        /* EQ size doesn't matter; the callback is guaranteed to get every         * event */        rc = LNetEQAlloc(1, lnet_router_checker_event,                         &the_lnet.ln_rc_eqh);        if (rc != 0) {                CERROR("Can't allocate EQ: %d\n", rc);                return -ENOMEM;        }	rc = (int)cfs_kernel_thread(lnet_router_checker, NULL, 0);	if (rc < 0) {		CERROR("Can't start router checker thread: %d\n", rc);                goto failed;	}	mutex_down(&the_lnet.ln_rc_signal);     /* wait for checker to startup */        rc = the_lnet.ln_rc_state;        if (rc < 0) {                the_lnet.ln_rc_state = LNET_RC_STATE_SHUTDOWN;                goto failed;        }                LASSERT (the_lnet.ln_rc_state == LNET_RC_STATE_RUNNING);        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();        }                return 0;         failed:        rc = LNetEQFree(the_lnet.ln_rc_eqh);        LASSERT (rc == 0);        return rc;}voidlnet_destroy_rtrbuf(lnet_rtrbuf_t *rb, int npages){        int sz = offsetof(lnet_rtrbuf_t, rb_kiov[npages]);        while (--npages >= 0)                cfs_free_page(rb->rb_kiov[npages].kiov_page);        LIBCFS_FREE(rb, sz);}lnet_rtrbuf_t *lnet_new_rtrbuf(lnet_rtrbufpool_t *rbp){        int            npages = rbp->rbp_npages;        int            sz = offsetof(lnet_rtrbuf_t, rb_kiov[npages]);        struct page   *page;        lnet_rtrbuf_t *rb;        int            i;        LIBCFS_ALLOC(rb, sz);        if (rb == NULL)                return NULL;        rb->rb_pool = rbp;        for (i = 0; i < npages; i++) {                page = cfs_alloc_page(CFS_ALLOC_ZERO | CFS_ALLOC_STD);                if (page == NULL) {                        while (--i >= 0)                                cfs_free_page(rb->rb_kiov[i].kiov_page);                        LIBCFS_FREE(rb, sz);                        return NULL;                }                rb->rb_kiov[i].kiov_len = CFS_PAGE_SIZE;                rb->rb_kiov[i].kiov_offset = 0;                rb->rb_kiov[i].kiov_page = page;        }        return rb;}voidlnet_rtrpool_free_bufs(lnet_rtrbufpool_t *rbp){        int            npages = rbp->rbp_npages;        int            nbuffers = 0;        lnet_rtrbuf_t *rb;        LASSERT (list_empty(&rbp->rbp_msgs));        LASSERT (rbp->rbp_credits == rbp->rbp_nbuffers);        while (!list_empty(&rbp->rbp_bufs)) {                LASSERT (rbp->rbp_credits > 0);                rb = list_entry(rbp->rbp_bufs.next,                                lnet_rtrbuf_t, rb_list);                list_del(&rb->rb_list);                lnet_destroy_rtrbuf(rb, npages);                nbuffers++;        }        LASSERT (rbp->rbp_nbuffers == nbuffers);        LASSERT (rbp->rbp_credits == nbuffers);        rbp->rbp_nbuffers = rbp->rbp_credits = 0;}intlnet_rtrpool_alloc_bufs(lnet_rtrbufpool_t *rbp, int nbufs){        lnet_rtrbuf_t *rb;        int            i;        if (rbp->rbp_nbuffers != 0) {                LASSERT (rbp->rbp_nbuffers == nbufs);                return 0;        }                for (i = 0; i < nbufs; i++) {                rb = lnet_new_rtrbuf(rbp);                if (rb == NULL) {                        CERROR("Failed to allocate %d router bufs of %d pages\n",                               nbufs, rbp->rbp_npages);                        return -ENOMEM;                }                rbp->rbp_nbuffers++;                rbp->rbp_credits++;                rbp->rbp_mincredits++;                list_add(&rb->rb_list, &rbp->rbp_bufs);                /* No allocation "under fire" */                /* Otherwise we'd need code to schedule blocked msgs etc */                LASSERT (!the_lnet.ln_routing);        }        LASSERT (rbp->rbp_credits == nbufs);        return 0;}voidlnet_rtrpool_init(lnet_rtrbufpool_t *rbp, int npages){        CFS_INIT_LIST_HEAD(&rbp->rbp_msgs);        CFS_INIT_LIST_HEAD(&rbp->rbp_bufs);        rbp->rbp_npages = npages;        rbp->rbp_credits = 0;        rbp->rbp_mincredits = 0;}voidlnet_free_rtrpools(void){        lnet_rtrpool_free_bufs(&the_lnet.ln_rtrpools[0]);        lnet_rtrpool_free_bufs(&the_lnet.ln_rtrpools[1]);        lnet_rtrpool_free_bufs(&the_lnet.ln_rtrpools[2]);}voidlnet_init_rtrpools(void){        int small_pages = 1;        int large_pages = (LNET_MTU + CFS_PAGE_SIZE - 1) >> CFS_PAGE_SHIFT;        lnet_rtrpool_init(&the_lnet.ln_rtrpools[0], 0);        lnet_rtrpool_init(&the_lnet.ln_rtrpools[1], small_pages);        lnet_rtrpool_init(&the_lnet.ln_rtrpools[2], large_pages);}intlnet_alloc_rtrpools(int im_a_router){        int       rc;                if (!strcmp(forwarding, "")) {                /* not set either way */                if (!im_a_router)                        return 0;        } else if (!strcmp(forwarding, "disabled")) {                /* explicitly disabled */                return 0;        } else if (!strcmp(forwarding, "enabled")) {                /* explicitly enabled */        } else {                LCONSOLE_ERROR_MSG(0x10b, "'forwarding' not set to either "                                   "'enabled' or 'disabled'\n");                return -EINVAL;        }                if (tiny_router_buffers <= 0) {                LCONSOLE_ERROR_MSG(0x10c, "tiny_router_buffers=%d invalid when "                                   "routing enabled\n", tiny_router_buffers);                rc = -EINVAL;                goto failed;        }        rc = lnet_rtrpool_alloc_bufs(&the_lnet.ln_rtrpools[0],                                     tiny_router_buffers);        if (rc != 0)                goto failed;        if (small_router_buffers <= 0) {                LCONSOLE_ERROR_MSG(0x10d, "small_router_buffers=%d invalid when"                                   " routing enabled\n", small_router_buffers);                rc = -EINVAL;                goto failed;        }        rc = lnet_rtrpool_alloc_bufs(&the_lnet.ln_rtrpools[1],                                     small_router_buffers);        if (rc != 0)                goto failed;        if (large_router_buffers <= 0) {                LCONSOLE_ERROR_MSG(0x10e, "large_router_buffers=%d invalid when"                                   " routing enabled\n", large_router_buffers);                rc = -EINVAL;                goto failed;        }        rc = lnet_rtrpool_alloc_bufs(&the_lnet.ln_rtrpools[2],                                     large_router_buffers);        if (rc != 0)                goto failed;        LNET_LOCK();        the_lnet.ln_routing = 1;        LNET_UNLOCK();                return 0; failed:        lnet_free_rtrpools();        return rc;}#elseintlnet_peers_start_down(void){        return 0;}voidlnet_router_checker_stop(void){        return;}intlnet_router_checker_start(void){        return 0;}voidlnet_free_rtrpools (void){}voidlnet_init_rtrpools (void){}intlnet_alloc_rtrpools (int im_a_arouter){        return 0;}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?