VirtualBox

Changeset 77628 in vbox


Ignore:
Timestamp:
Mar 9, 2019 6:12:49 PM (6 years ago)
Author:
vboxsync
Message:

linux/vboxsf: Slash the right page0 offset in vbsf_iter_lock_pages(). Corrected IOVEC detection in vbsf_iter_max_span_of_pages(). More logging. bugref:9172 ticketref:17360

Location:
trunk/src/VBox/Additions/linux/sharedfolders
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/linux/sharedfolders/regops.c

    r77626 r77628  
    11311131    int    rc       = 0;
    11321132
    1133     Assert(iov_iter_count(iter) > 0);
     1133    Assert(iov_iter_count(iter) + pStash->cb > 0);
    11341134    if (!(iter->type & ITER_KVEC)) {
    11351135        /*
     
    11491149                *pcbChunk  = cbChunk;
    11501150                *pcPages   = cPages;
     1151                SFLOGFLOW(("vbsf_iter_lock_pages: returns %d - cPages=%#zx offPage0=%#zx cbChunk=%zx (stashed)\n",
     1152                           rc, cPages, offPage0, cbChunk));
    11511153                return 0;
    11521154            }
    11531155            cMaxPages -= 1;
     1156            SFLOG3(("vbsf_iter_lock_pages: Picked up stashed page: %#zx LB %#zx\n", offPage0, cbChunk));
    11541157        } else {
    11551158# if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
     
    11781181                    cPages     = RT_ALIGN_Z(offPage0 + cbSegRet, PAGE_SIZE) >> PAGE_SHIFT;
    11791182                    cMaxPages -= cPages;
     1183                    SFLOG3(("vbsf_iter_lock_pages: iov_iter_get_pages -> %#zx @ %#zx; %#zx pages [first]\n", cbSegRet, offPage0, cPages));
    11801184                    if (   cMaxPages == 0
    11811185                        || ((offPage0 + (size_t)cbSegRet) & PAGE_OFFSET_MASK))
     
    12001204                if (cbSegRet > 0) {
    12011205                    iov_iter_advance(iter, cbSegRet); /** @todo maybe not do this if we stash the page? */
    1202                     Assert(cbSegRet <= PAGE_SIZE);
     1206                    Assert(offPgProbe + cbSegRet <= PAGE_SIZE);
    12031207                    if (offPgProbe == 0) {
    12041208                        cbChunk   += cbSegRet;
    12051209                        cPages    += 1;
    12061210                        cMaxPages -= 1;
     1211                        SFLOG3(("vbsf_iter_lock_pages: iov_iter_get_pages(1) -> %#zx @ %#zx\n", cbSegRet, offPgProbe));
    12071212                        if (   cMaxPages == 0
    12081213                            || cbSegRet != PAGE_SIZE)
     
    12161221                            cbSegRet = iov_iter_get_pages(iter, &papPages[cPages], iov_iter_count(iter), cMaxPages, &offPgProbe);
    12171222                            if (cbSegRet > 0) {
    1218                                 size_t const cSegsRet = RT_ALIGN_Z((size_t)cbSegRet, PAGE_SIZE) >> PAGE_SHIFT;
     1223                                size_t const cPgRet = RT_ALIGN_Z((size_t)cbSegRet, PAGE_SIZE) >> PAGE_SHIFT;
    12191224                                Assert(offPgProbe == 0);
    12201225                                iov_iter_advance(iter, cbSegRet);
    1221                                 cPages    += cSegsRet;
    1222                                 cMaxPages -= cSegsRet;
     1226                                SFLOG3(("vbsf_iter_lock_pages: iov_iter_get_pages() -> %#zx; %#zx pages\n", cbSegRet, cPgRet));
     1227                                cPages    += cPgRet;
     1228                                cMaxPages -= cPgRet;
    12231229                                cbChunk   += cbSegRet;
    12241230                                if (   cMaxPages == 0
     
    12341240                        /* The segment didn't start at a page boundrary, so stash it for
    12351241                           the next round: */
     1242                        SFLOGFLOW(("vbsf_iter_lock_pages: iov_iter_get_pages(1) -> %#zx @ %#zx; stashed\n", cbSegRet, offPgProbe));
    12361243                        Assert(papPages[cPages]);
    12371244                        pStash->pPage = papPages[cPages];
    1238                         pStash->off   = offPage0;
     1245                        pStash->off   = offPgProbe;
    12391246                        pStash->cb    = cbSegRet;
    12401247                        break;
     
    13161323    *pcbChunk  = cbChunk;
    13171324    *pcPages   = cPages;
     1325    SFLOGFLOW(("vbsf_iter_lock_pages: returns %d - cPages=%#zx offPage0=%#zx cbChunk=%zx\n", rc, cPages, offPage0, cbChunk));
    13181326    return rc;
    13191327}
     
    13661374{
    13671375    size_t cPages;
    1368     if (iter->type & (ITER_IOVEC | ITER_KVEC)) {
     1376    if (iter_is_iovec(iter) || (iter->type & ITER_KVEC)) {
    13691377        const struct iovec *pCurIov    = iter->iov;
    13701378        size_t              cLeft      = iter->nr_segs;
    13711379        size_t              cPagesSpan = 0;
    13721380
     1381        /* iovect and kvec are identical, except for the __user tagging of iov_base. */
    13731382        AssertCompileMembersSameSizeAndOffset(struct iovec, iov_base, struct kvec, iov_base);
    13741383        AssertCompileMembersSameSizeAndOffset(struct iovec, iov_len,  struct kvec, iov_len);
     
    13871396                    cPagesSpan = 0;
    13881397            }
     1398            SFLOGFLOW(("vbsf_iter: seg[0]= %p LB %#zx\n", pCurIov->iov_base, pCurIov->iov_len));
    13891399            pCurIov++;
    13901400            cLeft--;
     
    14171427                }
    14181428            }
     1429            SFLOGFLOW(("vbsf_iter: seg[%u]= %p LB %#zx\n", iter->nr_segs - cLeft, pCurIov->iov_base, pCurIov->iov_len));
    14191430            pCurIov++;
    14201431        }
     
    14271438        cPages = (iov_iter_count(iter) + (PAGE_SIZE * 2 - 2) * cSegs) >> PAGE_SHIFT;
    14281439    }
     1440    SFLOGFLOW(("vbsf_iter_max_span_of_pages: returns %#zx\n", cPages));
    14291441    return cPages;
    14301442}
  • trunk/src/VBox/Additions/linux/sharedfolders/vfsmod.h

    r77561 r77628  
    396396# define TRACE()          LogFunc(("tracepoint\n"))
    397397# define SFLOGFLOW(aArgs) Log(aArgs)
     398# define SFLOG2(aArgs)    Log2(aArgs)
     399# define SFLOG3(aArgs)    Log3(aArgs)
    398400# ifdef LOG_ENABLED
    399401#  define SFLOG_ENABLED   1
     
    402404# define TRACE()          RTLogBackdoorPrintf("%s: tracepoint\n", __FUNCTION__)
    403405# define SFLOGFLOW(aArgs) RTLogBackdoorPrintf aArgs
     406# define SFLOG2(aArgs)    RTLogBackdoorPrintf aArgs
     407# define SFLOG3(aArgs)    RTLogBackdoorPrintf aArgs
    404408# define SFLOG_ENABLED    1
    405409#endif
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette