VirtualBox

Changeset 36565 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Apr 5, 2011 4:08:06 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
71000
Message:

Runtime/r0drv/solaris: Use kernel pages from free and cachelists.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/solaris/vbi/i86pc/os/vbi.c

    r36505 r36565  
    7171
    7272/*
     73 * We have to use dl_lookup to find kflt_init() and thereby use kernel pages from
     74 * the freelists if we no longer get user pages from freelist and cachelists.
     75 */
     76/* Introduced in v9 */
     77static int use_kflt = 0;
     78page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr);
     79
     80
     81/*
    7382 * Workarounds for running on old versions of solaris with different cross call
    7483 * interfaces. If we find xc_init_cpu() in the kernel, then just use the defined
     
    243252                }
    244253        }
     254
     255        /*
     256         * Use kernel page freelist flags to get pages from kernel page freelists
     257         * while allocating physical pages, once the userpages are exhausted.
     258         * snv_161+, see @bugref{5632}.
     259         */
     260        if (kobj_getsymvalue("kflt_init", 1) != NULL)
     261        {
     262                use_kflt = 1;
     263        }
     264
    245265
    246266        /*
     
    13051325                                 * we don't have the 'virtAddr' to which this memory may be mapped.
    13061326                                 */
    1307                                 seg_t kernseg;
    1308                                 kernseg.s_as = &kas;
    13091327                                caddr_t virtAddr = NULL;
    13101328                                for (int64_t i = 0; i < npages; i++, virtAddr += PAGESIZE)
    13111329                                {
    1312                                         /* get a page from the freelist */
    1313                                         page_t *ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
    1314                                                                                 PAGESIZE, 0 /* flags */, NULL /* local group */);
     1330                                        /* get a page from the freelists */
     1331                                        page_t *ppage = vbi_page_get_fromlist(1 /* freelist */, virtAddr);
    13151332                                        if (!ppage)
    13161333                                        {
    1317                                                 /* try from the cachelist */
    1318                                                 ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
    1319                                                                                 0 /* flags */, NULL /* local group */);
     1334                                                /* try from the cachelists */
     1335                                                ppage = vbi_page_get_fromlist(2 /* cachelist */, virtAddr);
    13201336                                                if (!ppage)
    13211337                                                {
     
    14131429}
    14141430
     1431
     1432/*
     1433 * This is revision 9 of the interface.
     1434 */
     1435page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr)
     1436{
     1437        seg_t kernseg;
     1438        kernseg.s_as = &kas;
     1439        page_t *ppage = NULL;
     1440        if (freelist == 1)
     1441        {
     1442                ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
     1443                                                        PAGESIZE, 0 /* flags */, NULL /* local group */);
     1444                if (!ppage)
     1445                {
     1446                        if (use_kflt)
     1447                        {
     1448                                ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
     1449                                                        PAGESIZE, 0x0200 /* PG_KFLT */, NULL /* local group */);
     1450                        }
     1451                }
     1452        }
     1453        else
     1454        {
     1455                /* cachelist */
     1456                ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
     1457                                                        0 /* flags */, NULL /* local group */);
     1458                if (!ppage)
     1459                {
     1460                        if (use_kflt)
     1461                        {
     1462                                ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
     1463                                                        0x0200 /* PG_KFLT */, NULL /* local group */);
     1464                        }
     1465                }
     1466        }
     1467        return ppage;
     1468}
     1469
     1470
    14151471/*
    14161472 * As more functions are added, they should start with a comment indicating
     
    14181474 * be increased. Also change vbi_modlmisc at the top of the file.
    14191475 */
    1420 uint_t vbi_revision_level = 8;
    1421 
     1476uint_t vbi_revision_level = 9;
     1477
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