VirtualBox

Ignore:
Timestamp:
Jul 14, 2011 9:50:29 AM (13 years ago)
Author:
vboxsync
Message:

Runtime/r0drv/Solaris/vbi: temporary fix for modified t_preempt offset in newer S11 kernels. Also some cleanup.

File:
1 edited

Legend:

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

    r37281 r37947  
    7878/* Introduced in v9 */
    7979static int use_kflt = 0;
    80 static page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr);
     80static page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr, size_t pgsize);
    8181
    8282
     
    161161/* kthread_t */
    162162static int off_s11_t_preempt    = 42;
     163
     164/* 64-bit Solaris 11 snv_166+ offsets (CR 7037143) */
     165static int off_s11_t_preempt_new = 48;
    163166#else
    164167/* 32-bit Solaris 10 offsets */
     
    280283                off_cpu_kprunrun = off_s11_cpu_kprunrun;
    281284                off_t_preempt = off_s11_t_preempt;
     285
     286#ifdef _LP64
     287                /* Only 64-bit kernels */
     288                long snv_version = 0;
     289                if (!strncmp(utsname.version, "snv_", 4))
     290                {
     291                        ddi_strtol(utsname.version + 4, NULL /* endptr */, 0, &snv_version);
     292                        if (snv_version >= 166)
     293                        {
     294                                off_t_preempt = off_s11_t_preempt_new;
     295                                cmn_err(CE_NOTE,  "here\n");
     296                        }
     297
     298                        cmn_err(CE_NOTE, "Detected S11 version %ld: Preemption offset=%d\n", snv_version, off_t_preempt);
     299                }
     300                else
     301                        cmn_err(CE_NOTE, "WARNING!! Cannot determine version. Assuming pre snv_166. Preemption offset=%ld may be busted!\n", off_t_preempt);
     302#endif
    282303        } else {
    283304                /* Solaris 10 detected... */
     
    13331354                                {
    13341355                                        /* get a page from the freelists */
    1335                                         page_t *ppage = vbi_page_get_fromlist(1 /* freelist */, virtAddr);
     1356                                        page_t *ppage = vbi_page_get_fromlist(1 /* freelist */, virtAddr, PAGESIZE);
    13361357                                        if (!ppage)
    13371358                                        {
    13381359                                                /* try from the cachelists */
    1339                                                 ppage = vbi_page_get_fromlist(2 /* cachelist */, virtAddr);
     1360                                                ppage = vbi_page_get_fromlist(2 /* cachelist */, virtAddr, PAGESIZE);
    13401361                                                if (!ppage)
    13411362                                                {
     
    14341455
    14351456
    1436 
    1437 static page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr)
    1438 {
     1457static page_t *
     1458vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr, size_t pgsize)
     1459{
     1460        /* pgsize only applies when using the freelist */
    14391461        seg_t kernseg;
    14401462        kernseg.s_as = &kas;
     
    14431465        {
    14441466                ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
    1445                                                         PAGESIZE, 0 /* flags */, NULL /* local group */);
    1446                 if (!ppage)
     1467                                                        pgsize, 0 /* flags */, NULL /* local group */);
     1468                if (!ppage && use_kflt)
    14471469                {
    1448                         if (use_kflt)
    1449                         {
    1450                                 ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
    1451                                                         PAGESIZE, 0x0200 /* PG_KFLT */, NULL /* local group */);
    1452                         }
     1470                        ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
     1471                                                pgsize, 0x0200 /* PG_KFLT */, NULL /* local group */);
    14531472                }
    14541473        }
     
    14581477                ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
    14591478                                                        0 /* flags */, NULL /* local group */);
    1460                 if (!ppage)
     1479                if (!ppage && use_kflt)
    14611480                {
    1462                         if (use_kflt)
    1463                         {
    1464                                 ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
    1465                                                         0x0200 /* PG_KFLT */, NULL /* local group */);
    1466                         }
     1481                        ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
     1482                                                0x0200 /* PG_KFLT */, NULL /* local group */);
    14671483                }
    14681484        }
     
    14891505         */
    14901506        rc = page_resv(npages, KM_NOSLEEP);
    1491         if (!rc) {
     1507        if (!rc)
    14921508                return NULL;
    1493         }
     1509
    14941510        rc = page_create_wait(npages, 0 /* flags */);
    14951511        if (!rc) {
     
    15041520        vaddr = NULL;
    15051521        kernseg.s_as = &kas;
    1506         pproot = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg,
    1507                 vaddr, pgsize, 0x0000 /* flags */, NULL /*lgrp*/);
    1508         if (!pproot && use_kflt) {
    1509                 pproot = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg,
    1510                         vaddr, pgsize, 0x0200 /* PG_KFLT */, NULL /*lgrp*/);
    1511                 if (!pproot) {
    1512                         page_create_putback(npages);
    1513                         page_unresv(npages);
    1514                         return NULL;
    1515                 }
     1522        pproot = vbi_page_get_fromlist(1 /* freelist */, vaddr, pgsize);
     1523        if (!pproot)
     1524        {
     1525                page_create_putback(npages);
     1526                page_unresv(npages);
     1527                return NULL;
    15161528        }
    15171529        AssertMsg(!(page_pptonum(pproot) & (npages - 1)), ("%p:%lx npages=%lx\n", pproot, page_pptonum(pproot), npages));
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