lib-move.c

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

C
1,970
字号
        for (;;) {                LASSERT (src_niov > 0);                LASSERT (niov <= dst_niov);                frag_len = src->iov_len - offset;                dst->iov_base = ((char *)src->iov_base) + offset;                if (len <= frag_len) {                        dst->iov_len = len;                        return (niov);                }                dst->iov_len = frag_len;                len -= frag_len;                dst++;                src++;                niov++;                src_niov--;                offset = 0;        }}#ifndef __KERNEL__unsigned intlnet_kiov_nob (unsigned int niov, lnet_kiov_t *kiov){        LASSERT (0);        return (0);}voidlnet_copy_kiov2kiov (unsigned int ndkiov, lnet_kiov_t *dkiov, unsigned int doffset,                     unsigned int nskiov, lnet_kiov_t *skiov, unsigned int soffset,                     unsigned int nob){        LASSERT (0);}voidlnet_copy_kiov2iov (unsigned int niov, struct iovec *iov, unsigned int iovoffset,                    unsigned int nkiov, lnet_kiov_t *kiov, unsigned int kiovoffset,                    unsigned int nob){        LASSERT (0);}voidlnet_copy_iov2kiov (unsigned int nkiov, lnet_kiov_t *kiov, unsigned int kiovoffset,                    unsigned int niov, struct iovec *iov, unsigned int iovoffset,                    unsigned int nob){        LASSERT (0);}intlnet_extract_kiov (int dst_niov, lnet_kiov_t *dst,                   int src_niov, lnet_kiov_t *src,                   unsigned int offset, unsigned int len){        LASSERT (0);}#else /* __KERNEL__ */unsigned intlnet_kiov_nob (unsigned int niov, lnet_kiov_t *kiov){        unsigned int  nob = 0;        while (niov-- > 0)                nob += (kiov++)->kiov_len;        return (nob);}voidlnet_copy_kiov2kiov (unsigned int ndiov, lnet_kiov_t *diov, unsigned int doffset,                     unsigned int nsiov, lnet_kiov_t *siov, unsigned int soffset,                     unsigned int nob){        /* NB diov, siov are READ-ONLY */        unsigned int    this_nob;        char           *daddr = NULL;        char           *saddr = NULL;        if (nob == 0)                return;        LASSERT (!in_interrupt ());        LASSERT (ndiov > 0);        while (doffset >= diov->kiov_len) {                doffset -= diov->kiov_len;                diov++;                ndiov--;                LASSERT (ndiov > 0);        }        LASSERT (nsiov > 0);        while (soffset >= siov->kiov_len) {                soffset -= siov->kiov_len;                siov++;                nsiov--;                LASSERT (nsiov > 0);        }        do {                LASSERT (ndiov > 0);                LASSERT (nsiov > 0);                this_nob = MIN(diov->kiov_len - doffset,                               siov->kiov_len - soffset);                this_nob = MIN(this_nob, nob);                if (daddr == NULL)                        daddr = ((char *)cfs_kmap(diov->kiov_page)) +                                 diov->kiov_offset + doffset;                if (saddr == NULL)                        saddr = ((char *)cfs_kmap(siov->kiov_page)) +                                 siov->kiov_offset + soffset;                /* Vanishing risk of kmap deadlock when mapping 2 pages.                 * However in practice at least one of the kiovs will be mapped                 * kernel pages and the map/unmap will be NOOPs */                memcpy (daddr, saddr, this_nob);                nob -= this_nob;                if (diov->kiov_len > doffset + this_nob) {                        daddr += this_nob;                        doffset += this_nob;                } else {                        cfs_kunmap(diov->kiov_page);                        daddr = NULL;                        diov++;                        ndiov--;                        doffset = 0;                }                if (siov->kiov_len > soffset + this_nob) {                        saddr += this_nob;                        soffset += this_nob;                } else {                        cfs_kunmap(siov->kiov_page);                        saddr = NULL;                        siov++;                        nsiov--;                        soffset = 0;                }        } while (nob > 0);        if (daddr != NULL)                cfs_kunmap(diov->kiov_page);        if (saddr != NULL)                cfs_kunmap(siov->kiov_page);}voidlnet_copy_kiov2iov (unsigned int niov, struct iovec *iov, unsigned int iovoffset,                    unsigned int nkiov, lnet_kiov_t *kiov, unsigned int kiovoffset,                    unsigned int nob){        /* NB iov, kiov are READ-ONLY */        unsigned int    this_nob;        char           *addr = NULL;        if (nob == 0)                return;        LASSERT (!in_interrupt ());        LASSERT (niov > 0);        while (iovoffset >= iov->iov_len) {                iovoffset -= iov->iov_len;                iov++;                niov--;                LASSERT (niov > 0);        }        LASSERT (nkiov > 0);        while (kiovoffset >= kiov->kiov_len) {                kiovoffset -= kiov->kiov_len;                kiov++;                nkiov--;                LASSERT (nkiov > 0);        }        do {                LASSERT (niov > 0);                LASSERT (nkiov > 0);                this_nob = MIN(iov->iov_len - iovoffset,                               kiov->kiov_len - kiovoffset);                this_nob = MIN(this_nob, nob);                if (addr == NULL)                        addr = ((char *)cfs_kmap(kiov->kiov_page)) +                                 kiov->kiov_offset + kiovoffset;                memcpy ((char *)iov->iov_base + iovoffset, addr, this_nob);                nob -= this_nob;                if (iov->iov_len > iovoffset + this_nob) {                        iovoffset += this_nob;                } else {                        iov++;                        niov--;                        iovoffset = 0;                }                if (kiov->kiov_len > kiovoffset + this_nob) {                        addr += this_nob;                        kiovoffset += this_nob;                } else {                        cfs_kunmap(kiov->kiov_page);                        addr = NULL;                        kiov++;                        nkiov--;                        kiovoffset = 0;                }        } while (nob > 0);        if (addr != NULL)                cfs_kunmap(kiov->kiov_page);}voidlnet_copy_iov2kiov (unsigned int nkiov, lnet_kiov_t *kiov, unsigned int kiovoffset,                    unsigned int niov, struct iovec *iov, unsigned int iovoffset,                    unsigned int nob){        /* NB kiov, iov are READ-ONLY */        unsigned int    this_nob;        char           *addr = NULL;        if (nob == 0)                return;        LASSERT (!in_interrupt ());        LASSERT (nkiov > 0);        while (kiovoffset >= kiov->kiov_len) {                kiovoffset -= kiov->kiov_len;                kiov++;                nkiov--;                LASSERT (nkiov > 0);        }        LASSERT (niov > 0);        while (iovoffset >= iov->iov_len) {                iovoffset -= iov->iov_len;                iov++;                niov--;                LASSERT (niov > 0);        }        do {                LASSERT (nkiov > 0);                LASSERT (niov > 0);                this_nob = MIN(kiov->kiov_len - kiovoffset,                               iov->iov_len - iovoffset);                this_nob = MIN(this_nob, nob);                if (addr == NULL)                        addr = ((char *)cfs_kmap(kiov->kiov_page)) +                                 kiov->kiov_offset + kiovoffset;                memcpy (addr, (char *)iov->iov_base + iovoffset, this_nob);                nob -= this_nob;                if (kiov->kiov_len > kiovoffset + this_nob) {                        addr += this_nob;                        kiovoffset += this_nob;                } else {                        cfs_kunmap(kiov->kiov_page);                        addr = NULL;                        kiov++;                        nkiov--;                        kiovoffset = 0;                }                if (iov->iov_len > iovoffset + this_nob) {                        iovoffset += this_nob;                } else {                        iov++;                        niov--;                        iovoffset = 0;                }        } while (nob > 0);        if (addr != NULL)                cfs_kunmap(kiov->kiov_page);}intlnet_extract_kiov (int dst_niov, lnet_kiov_t *dst,                   int src_niov, lnet_kiov_t *src,                   unsigned int offset, unsigned int len){        /* Initialise 'dst' to the subset of 'src' starting at 'offset',         * for exactly 'len' bytes, and return the number of entries.         * NB not destructive to 'src' */        unsigned int    frag_len;        unsigned int    niov;        if (len == 0)                           /* no data => */                return (0);                     /* no frags */        LASSERT (src_niov > 0);        while (offset >= src->kiov_len) {      /* skip initial frags */                offset -= src->kiov_len;                src_niov--;                src++;                LASSERT (src_niov > 0);        }        niov = 1;        for (;;) {                LASSERT (src_niov > 0);                LASSERT (niov <= dst_niov);                frag_len = src->kiov_len - offset;                dst->kiov_page = src->kiov_page;                dst->kiov_offset = src->kiov_offset + offset;                if (len <= frag_len) {                        dst->kiov_len = len;                        LASSERT (dst->kiov_offset + dst->kiov_len <= CFS_PAGE_SIZE);                        return (niov);                }                dst->kiov_len = frag_len;                LASSERT (dst->kiov_offset + dst->kiov_len <= CFS_PAGE_SIZE);                len -= frag_len;                dst++;                src++;                niov++;                src_niov--;                offset = 0;        }}#endifvoidlnet_ni_recv(lnet_ni_t *ni, void *private, lnet_msg_t *msg, int delayed,             unsigned int offset, unsigned int mlen, unsigned int rlen){        unsigned int  niov = 0;        struct iovec *iov = NULL;        lnet_kiov_t  *kiov = NULL;        int           rc;        LASSERT (!in_interrupt ());        LASSERT (mlen == 0 || msg != NULL);                if (msg != NULL) {                LASSERT(msg->msg_receiving);                LASSERT(!msg->msg_sending);                LASSERT(rlen == msg->msg_len);                LASSERT(mlen <= msg->msg_len);                msg->msg_wanted = mlen;                msg->msg_offset = offset;                msg->msg_receiving = 0;                if (mlen != 0) {                        niov = msg->msg_niov;                        iov  = msg->msg_iov;                        kiov = msg->msg_kiov;                                        LASSERT (niov > 0);                        LASSERT ((iov == NULL) != (kiov == NULL));                }        }                rc = (ni->ni_lnd->lnd_recv)(ni, private, msg, delayed,                                    niov, iov, kiov, offset, mlen, rlen);        if (rc < 0)                lnet_finalize(ni, msg, rc);}intlnet_compare_routers(lnet_peer_t *p1, lnet_peer_t *p2){        if (p1->lp_txqnob < p2->lp_txqnob)                return 1;                if (p1->lp_txqnob > p2->lp_txqnob)                return -1;                if (p1->lp_txcredits > p2->lp_txcredits)                return 1;        

⌨️ 快捷键说明

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