VirtualBox

Changeset 24793 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Nov 19, 2009 2:53:59 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
55010
Message:

SSM,PGM: Added the pass number to the LiveVote callback. Improved pgmR3LiveVote a little bit. Started on real write monitored pages (#4325) - still disabled.

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGM.cpp

    r24768 r24793  
    15621562
    15631563    /* Common - misc variables */
    1564     STAM_REL_REG(pVM, &pPGM->cAllPages,                     STAMTYPE_U32,     "/PGM/Page/cAllPages",                STAMUNIT_COUNT,     "The total number of pages.");
    1565     STAM_REL_REG(pVM, &pPGM->cPrivatePages,                 STAMTYPE_U32,     "/PGM/Page/cPrivatePages",            STAMUNIT_COUNT,     "The number of private pages.");
    1566     STAM_REL_REG(pVM, &pPGM->cSharedPages,                  STAMTYPE_U32,     "/PGM/Page/cSharedPages",             STAMUNIT_COUNT,     "The number of shared pages.");
    1567     STAM_REL_REG(pVM, &pPGM->cZeroPages,                    STAMTYPE_U32,     "/PGM/Page/cZeroPages",               STAMUNIT_COUNT,     "The number of zero backed pages.");
    1568     STAM_REL_REG(pVM, &pPGM->cMonitoredPages,               STAMTYPE_U32,     "/PGM/Page/cMonitoredPages",          STAMUNIT_COUNT,     "The number of write monitored pages.");
    1569     STAM_REL_REG(pVM, &pPGM->cWrittenToPages,               STAMTYPE_U32,     "/PGM/Page/cWrittenToPages",          STAMUNIT_COUNT,     "The number of previously write monitored pages that have been written to.");
    1570     STAM_REL_REG(pVM, &pPGM->cWriteLockedPages,             STAMTYPE_U32,     "/PGM/Page/cWriteLockedPages",        STAMUNIT_COUNT,     "The number of write(/read) locked pages.");
    1571     STAM_REL_REG(pVM, &pPGM->cReadLockedPages,              STAMTYPE_U32,     "/PGM/Page/cReadLockedPages",         STAMUNIT_COUNT,     "The number of read (only) locked pages.");
    1572     STAM_REL_REG(pVM, &pPGM->cHandyPages,                   STAMTYPE_U32,     "/PGM/Page/cHandyPages",              STAMUNIT_COUNT,     "The number of handy pages (not included in cAllPages).");
    1573     STAM_REL_REG(pVM, &pPGM->cRelocations,                  STAMTYPE_COUNTER, "/PGM/cRelocations",                  STAMUNIT_OCCURENCES,"Number of hypervisor relocations.");
    1574     STAM_REL_REG(pVM, &pPGM->ChunkR3Map.c,                  STAMTYPE_U32,     "/PGM/ChunkR3Map/c",                  STAMUNIT_COUNT,     "Number of mapped chunks.");
    1575     STAM_REL_REG(pVM, &pPGM->ChunkR3Map.cMax,               STAMTYPE_U32,     "/PGM/ChunkR3Map/cMax",               STAMUNIT_COUNT,     "Maximum number of mapped chunks.");
     1564    STAM_REL_REG(pVM, &pPGM->cAllPages,                          STAMTYPE_U32,     "/PGM/Page/cAllPages",                STAMUNIT_COUNT,     "The total number of pages.");
     1565    STAM_REL_REG(pVM, &pPGM->cPrivatePages,                      STAMTYPE_U32,     "/PGM/Page/cPrivatePages",            STAMUNIT_COUNT,     "The number of private pages.");
     1566    STAM_REL_REG(pVM, &pPGM->cSharedPages,                       STAMTYPE_U32,     "/PGM/Page/cSharedPages",             STAMUNIT_COUNT,     "The number of shared pages.");
     1567    STAM_REL_REG(pVM, &pPGM->cZeroPages,                         STAMTYPE_U32,     "/PGM/Page/cZeroPages",               STAMUNIT_COUNT,     "The number of zero backed pages.");
     1568    STAM_REL_REG(pVM, &pPGM->cMonitoredPages,                    STAMTYPE_U32,     "/PGM/Page/cMonitoredPages",          STAMUNIT_COUNT,     "The number of write monitored pages.");
     1569    STAM_REL_REG(pVM, &pPGM->cWrittenToPages,                    STAMTYPE_U32,     "/PGM/Page/cWrittenToPages",          STAMUNIT_COUNT,     "The number of previously write monitored pages that have been written to.");
     1570    STAM_REL_REG(pVM, &pPGM->cWriteLockedPages,                  STAMTYPE_U32,     "/PGM/Page/cWriteLockedPages",        STAMUNIT_COUNT,     "The number of write(/read) locked pages.");
     1571    STAM_REL_REG(pVM, &pPGM->cReadLockedPages,                   STAMTYPE_U32,     "/PGM/Page/cReadLockedPages",         STAMUNIT_COUNT,     "The number of read (only) locked pages.");
     1572    STAM_REL_REG(pVM, &pPGM->cHandyPages,                        STAMTYPE_U32,     "/PGM/Page/cHandyPages",              STAMUNIT_COUNT,     "The number of handy pages (not included in cAllPages).");
     1573    STAM_REL_REG(pVM, &pPGM->cRelocations,                       STAMTYPE_COUNTER, "/PGM/cRelocations",                  STAMUNIT_OCCURENCES,"Number of hypervisor relocations.");
     1574    STAM_REL_REG(pVM, &pPGM->ChunkR3Map.c,                       STAMTYPE_U32,     "/PGM/ChunkR3Map/c",                  STAMUNIT_COUNT,     "Number of mapped chunks.");
     1575    STAM_REL_REG(pVM, &pPGM->ChunkR3Map.cMax,                    STAMTYPE_U32,     "/PGM/ChunkR3Map/cMax",               STAMUNIT_COUNT,     "Maximum number of mapped chunks.");
    15761576
    15771577    /* Live save */
    1578     STAM_REL_REG(pVM, &pPGM->LiveSave.fActive,              STAMTYPE_U8,      "/PGM/LiveSave/fActive",              STAMUNIT_COUNT,     "Active or not.");
    1579     STAM_REL_REG(pVM, &pPGM->LiveSave.cIgnoredPages,        STAMTYPE_U32,     "/PGM/LiveSave/cIgnoredPages",        STAMUNIT_COUNT,     "The number of ignored pages in the RAM ranges (i.e. MMIO, MMIO2 and ROM).");
    1580     STAM_REL_REG(pVM, &pPGM->LiveSave.Ram.cReadyPages,      STAMTYPE_U32,     "/PGM/LiveSave/Ram/cReadPages",       STAMUNIT_COUNT,     "RAM: Ready pages.");
    1581     STAM_REL_REG(pVM, &pPGM->LiveSave.Ram.cDirtyPages,      STAMTYPE_U32,     "/PGM/LiveSave/Ram/cDirtyPages",      STAMUNIT_COUNT,     "RAM: Dirty pages.");
    1582     STAM_REL_REG(pVM, &pPGM->LiveSave.Ram.cZeroPages,       STAMTYPE_U32,     "/PGM/LiveSave/Ram/cZeroPages",       STAMUNIT_COUNT,     "RAM: Ready zero pages.");
    1583     STAM_REL_REG(pVM, &pPGM->LiveSave.Ram.cMonitoredPages,  STAMTYPE_U32,     "/PGM/LiveSave/Ram/cMonitoredPages",  STAMUNIT_COUNT,     "RAM: Write monitored pages.");
    1584     STAM_REL_REG(pVM, &pPGM->LiveSave.Rom.cReadyPages,      STAMTYPE_U32,     "/PGM/LiveSave/Rom/cReadPages",       STAMUNIT_COUNT,     "ROM: Ready pages.");
    1585     STAM_REL_REG(pVM, &pPGM->LiveSave.Rom.cDirtyPages,      STAMTYPE_U32,     "/PGM/LiveSave/Rom/cDirtyPages",      STAMUNIT_COUNT,     "ROM: Dirty pages.");
    1586     STAM_REL_REG(pVM, &pPGM->LiveSave.Rom.cZeroPages,       STAMTYPE_U32,     "/PGM/LiveSave/Rom/cZeroPages",       STAMUNIT_COUNT,     "ROM: Ready zero pages.");
    1587     STAM_REL_REG(pVM, &pPGM->LiveSave.Rom.cMonitoredPages,  STAMTYPE_U32,     "/PGM/LiveSave/Rom/cMonitoredPages",  STAMUNIT_COUNT,     "ROM: Write monitored pages.");
    1588     STAM_REL_REG(pVM, &pPGM->LiveSave.Mmio2.cReadyPages,    STAMTYPE_U32,     "/PGM/LiveSave/Mmio2/cReadPages",     STAMUNIT_COUNT,     "MMIO2: Ready pages.");
    1589     STAM_REL_REG(pVM, &pPGM->LiveSave.Mmio2.cDirtyPages,    STAMTYPE_U32,     "/PGM/LiveSave/Mmio2/cDirtyPages",    STAMUNIT_COUNT,     "MMIO2: Dirty pages.");
    1590     STAM_REL_REG(pVM, &pPGM->LiveSave.Mmio2.cZeroPages,     STAMTYPE_U32,     "/PGM/LiveSave/Mmio2/cZeroPages",     STAMUNIT_COUNT,     "MMIO2: Ready zero pages.");
    1591     STAM_REL_REG(pVM, &pPGM->LiveSave.Mmio2.cMonitoredPages,STAMTYPE_U32,     "/PGM/LiveSave/Mmio2/cMonitoredPages",STAMUNIT_COUNT,     "MMIO2: Write monitored pages.");
     1578    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.fActive,              STAMTYPE_U8,      "/PGM/LiveSave/fActive",              STAMUNIT_COUNT,     "Active or not.");
     1579    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.cIgnoredPages,        STAMTYPE_U32,     "/PGM/LiveSave/cIgnoredPages",        STAMUNIT_COUNT,     "The number of ignored pages in the RAM ranges (i.e. MMIO, MMIO2 and ROM).");
     1580    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.cDirtyPagesLong,      STAMTYPE_U32,     "/PGM/LiveSave/cDirtyPagesLong",      STAMUNIT_COUNT,     "Longer term dirty page average.");
     1581    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.cDirtyPagesShort,     STAMTYPE_U32,     "/PGM/LiveSave/cDirtyPagesShort",     STAMUNIT_COUNT,     "Short term dirty page average.");
     1582    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Ram.cReadyPages,      STAMTYPE_U32,     "/PGM/LiveSave/Ram/cReadPages",       STAMUNIT_COUNT,     "RAM: Ready pages.");
     1583    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Ram.cDirtyPages,      STAMTYPE_U32,     "/PGM/LiveSave/Ram/cDirtyPages",      STAMUNIT_COUNT,     "RAM: Dirty pages.");
     1584    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Ram.cZeroPages,       STAMTYPE_U32,     "/PGM/LiveSave/Ram/cZeroPages",       STAMUNIT_COUNT,     "RAM: Ready zero pages.");
     1585    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Ram.cMonitoredPages,  STAMTYPE_U32,     "/PGM/LiveSave/Ram/cMonitoredPages",  STAMUNIT_COUNT,     "RAM: Write monitored pages.");
     1586    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Rom.cReadyPages,      STAMTYPE_U32,     "/PGM/LiveSave/Rom/cReadPages",       STAMUNIT_COUNT,     "ROM: Ready pages.");
     1587    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Rom.cDirtyPages,      STAMTYPE_U32,     "/PGM/LiveSave/Rom/cDirtyPages",      STAMUNIT_COUNT,     "ROM: Dirty pages.");
     1588    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Rom.cZeroPages,       STAMTYPE_U32,     "/PGM/LiveSave/Rom/cZeroPages",       STAMUNIT_COUNT,     "ROM: Ready zero pages.");
     1589    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Rom.cMonitoredPages,  STAMTYPE_U32,     "/PGM/LiveSave/Rom/cMonitoredPages",  STAMUNIT_COUNT,     "ROM: Write monitored pages.");
     1590    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Mmio2.cReadyPages,    STAMTYPE_U32,     "/PGM/LiveSave/Mmio2/cReadPages",     STAMUNIT_COUNT,     "MMIO2: Ready pages.");
     1591    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Mmio2.cDirtyPages,    STAMTYPE_U32,     "/PGM/LiveSave/Mmio2/cDirtyPages",    STAMUNIT_COUNT,     "MMIO2: Dirty pages.");
     1592    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Mmio2.cZeroPages,     STAMTYPE_U32,     "/PGM/LiveSave/Mmio2/cZeroPages",     STAMUNIT_COUNT,     "MMIO2: Ready zero pages.");
     1593    STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Mmio2.cMonitoredPages,STAMTYPE_U32,     "/PGM/LiveSave/Mmio2/cMonitoredPages",STAMUNIT_COUNT,     "MMIO2: Write monitored pages.");
    15921594
    15931595#ifdef VBOX_WITH_STATISTICS
  • trunk/src/VBox/VMM/PGMInternal.h

    r24767 r24793  
    162162/** @def VBOX_WITH_NEW_LAZY_PAGE_ALLOC
    163163 * Enables the experimental lazy page allocation code. */
    164 /*# define VBOX_WITH_NEW_LAZY_PAGE_ALLOC */
     164/*#define VBOX_WITH_NEW_LAZY_PAGE_ALLOC */
     165
     166/** @def VBOX_WITH_REAL_WRITE_MONITORED_PAGES
     167 * Enables real write monitoring of pages, i.e. mapping them read-only and
     168 * only making them writable when getting a write access #PF. */
     169/*#define VBOX_WITH_REAL_WRITE_MONITORED_PAGES */
    165170
    166171/** @} */
     
    27412746        bool                        fActive;
    27422747        /** Padding. */
    2743         bool                        afReserved[3];
     2748        bool                        afReserved[2];
     2749        /** The next history index. */
     2750        uint8_t                     iDirtyPagesHistory;
     2751        /** History of the total amount of dirty pages. */
     2752        uint32_t                    acDirtyPagesHistory[64];
     2753        /** Short term dirty page average. */
     2754        uint32_t                    cDirtyPagesShort;
     2755        /** Long term dirty page average. */
     2756        uint32_t                    cDirtyPagesLong;
    27442757    } LiveSave;
    27452758
  • trunk/src/VBox/VMM/PGMSavedState.cpp

    r24769 r24793  
    17591759 * @param   pVM         The VM handle.
    17601760 * @param   pSSM        The SSM handle.
    1761  */
    1762 static DECLCALLBACK(int)  pgmR3LiveVote(PVM pVM, PSSMHANDLE pSSM)
    1763 {
    1764 #if 0
    1765     RTPrintf("# Rom[R/D/Z/M]=%03x/%03x/%03x/%03x  Mmio2=%04x/%04x/%04x/%04x  Ram=%06x/%06x/%06x/%06x Ignored=%03x\n",
    1766              pVM->pgm.s.LiveSave.Rom.cReadyPages,
    1767              pVM->pgm.s.LiveSave.Rom.cDirtyPages,
    1768              pVM->pgm.s.LiveSave.Rom.cZeroPages,
    1769              pVM->pgm.s.LiveSave.Rom.cMonitoredPages,
    1770              pVM->pgm.s.LiveSave.Mmio2.cReadyPages,
    1771              pVM->pgm.s.LiveSave.Mmio2.cDirtyPages,
    1772              pVM->pgm.s.LiveSave.Mmio2.cZeroPages,
    1773              pVM->pgm.s.LiveSave.Mmio2.cMonitoredPages,
    1774              pVM->pgm.s.LiveSave.Ram.cReadyPages,
    1775              pVM->pgm.s.LiveSave.Ram.cDirtyPages,
    1776              pVM->pgm.s.LiveSave.Ram.cZeroPages,
    1777              pVM->pgm.s.LiveSave.Ram.cMonitoredPages,
    1778              pVM->pgm.s.LiveSave.cIgnoredPages
    1779              );
    1780     static int s_iHack = 0;
    1781     if ((++s_iHack % 42) == 0)
    1782         return VINF_SUCCESS;
    1783     RTThreadSleep(1000);
    1784 
    1785 #else
    1786     if (      pVM->pgm.s.LiveSave.Rom.cDirtyPages
    1787            +  pVM->pgm.s.LiveSave.Mmio2.cDirtyPages
    1788            +  pVM->pgm.s.LiveSave.Ram.cDirtyPages
    1789 # if 0
    1790         <  256)                         /* semi random number. */
    1791 # else
    1792         <  4096)                        /* too high number */
    1793 # endif
    1794         return VINF_SUCCESS;
    1795 #endif
     1761 * @param   uPass       The data pass.
     1762 */
     1763static DECLCALLBACK(int)  pgmR3LiveVote(PVM pVM, PSSMHANDLE pSSM, uint32_t uPass)
     1764{
     1765    const uint32_t cHistoryEntries = RT_ELEMENTS(pVM->pgm.s.LiveSave.acDirtyPagesHistory);
     1766
     1767    /* update history. */
     1768    uint32_t i = pVM->pgm.s.LiveSave.iDirtyPagesHistory;
     1769    pVM->pgm.s.LiveSave.acDirtyPagesHistory[i] = pVM->pgm.s.LiveSave.Rom.cDirtyPages
     1770                                               + pVM->pgm.s.LiveSave.Mmio2.cDirtyPages
     1771                                               + pVM->pgm.s.LiveSave.Ram.cDirtyPages;
     1772    pVM->pgm.s.LiveSave.iDirtyPagesHistory = (i + 1) % cHistoryEntries;
     1773
     1774    /* calc shortterm average (4 passes). */
     1775    AssertCompile(RT_ELEMENTS(pVM->pgm.s.LiveSave.acDirtyPagesHistory) >= 4);
     1776    uint64_t cTotal = pVM->pgm.s.LiveSave.acDirtyPagesHistory[i];
     1777    cTotal += pVM->pgm.s.LiveSave.acDirtyPagesHistory[(i + cHistoryEntries - 1) % cHistoryEntries];
     1778    cTotal += pVM->pgm.s.LiveSave.acDirtyPagesHistory[(i + cHistoryEntries - 2) % cHistoryEntries];
     1779    cTotal += pVM->pgm.s.LiveSave.acDirtyPagesHistory[(i + cHistoryEntries - 3) % cHistoryEntries];
     1780    uint32_t const cDirtyPagesShort = cTotal / 4;
     1781    pVM->pgm.s.LiveSave.cDirtyPagesShort = cDirtyPagesShort;
     1782
     1783    /* calc longterm average. */
     1784    cTotal = 0;
     1785    for (i = 0; i < RT_ELEMENTS(pVM->pgm.s.LiveSave.acDirtyPagesHistory); i++)
     1786          cTotal += pVM->pgm.s.LiveSave.acDirtyPagesHistory[i];
     1787    uint32_t const cDirtyPagesLong = cTotal / cHistoryEntries;
     1788    pVM->pgm.s.LiveSave.cDirtyPagesLong = cDirtyPagesLong;
     1789
     1790    /*
     1791     * Try make a decision.
     1792     */
     1793    /** @todo take the count dirtied write-monitored page into account here. */
     1794    if (cDirtyPagesShort <= cDirtyPagesLong)
     1795    {
     1796        if (    cDirtyPagesShort <= 128
     1797            &&  cDirtyPagesLong  <= 1024)
     1798            return VINF_SUCCESS;
     1799
     1800        if (cDirtyPagesLong  <= 256)
     1801            return VINF_SUCCESS;
     1802
     1803        /* !! hack !! */
     1804        if (    cDirtyPagesLong < 4096
     1805            &&  uPass >= 8192)
     1806            return VINF_SUCCESS;
     1807    }
    17961808    return VINF_SSM_VOTE_FOR_ANOTHER_PASS;
    17971809}
     
    18361848    pVM->pgm.s.LiveSave.cIgnoredPages     = 0;
    18371849    pVM->pgm.s.LiveSave.fActive           = true;
     1850    for (unsigned i = 0; i < RT_ELEMENTS(pVM->pgm.s.LiveSave.acDirtyPagesHistory); i++)
     1851        pVM->pgm.s.LiveSave.acDirtyPagesHistory[i] = UINT32_MAX / 2;
     1852    pVM->pgm.s.LiveSave.iDirtyPagesHistory = 0;
    18381853
    18391854    /*
  • trunk/src/VBox/VMM/SSM.cpp

    r24613 r24793  
    47114711            {
    47124712                case SSMUNITTYPE_DEV:
    4713                     rc = pUnit->u.Dev.pfnLiveVote(pUnit->u.Dev.pDevIns, pSSM);
     4713                    rc = pUnit->u.Dev.pfnLiveVote(pUnit->u.Dev.pDevIns, pSSM, uPass);
    47144714                    break;
    47154715                case SSMUNITTYPE_DRV:
    4716                     rc = pUnit->u.Drv.pfnLiveVote(pUnit->u.Drv.pDrvIns, pSSM);
     4716                    rc = pUnit->u.Drv.pfnLiveVote(pUnit->u.Drv.pDrvIns, pSSM, uPass);
    47174717                    break;
    47184718                case SSMUNITTYPE_INTERNAL:
    4719                     rc = pUnit->u.Internal.pfnLiveVote(pVM, pSSM);
     4719                    rc = pUnit->u.Internal.pfnLiveVote(pVM, pSSM, uPass);
    47204720                    break;
    47214721                case SSMUNITTYPE_EXTERNAL:
    4722                     rc = pUnit->u.External.pfnLiveVote(pSSM, pUnit->u.External.pvUser);
     4722                    rc = pUnit->u.External.pfnLiveVote(pSSM, pUnit->u.External.pvUser, uPass);
    47234723                    break;
    47244724                default:
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r24699 r24793  
    15041504            if (    PteSrc.n.u1Write
    15051505                &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
     1506# ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
     1507                &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
     1508# endif
    15061509                &&  PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
    15071510            {
     
    18941897                    if (    PdeSrc.n.u1Write
    18951898                        &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
     1899#  ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
     1900                        &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
     1901#  endif
    18961902                        &&  PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
    18971903                    {
     
    28762882                        if (    PteDstBase.n.u1Write
    28772883                            &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
     2884# ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
     2885                            &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED
     2886# endif
    28782887                            &&  PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
    28792888                        {
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