Hi,

Guy wrote:
Hello

I worked lately on the bug 6745357 (kernel crash during startup at 
page_ctr_add_internal).

I have observed the following :

The bug was introduced from nv_88.

The changeset that breaks the boot is this one :

Issues Resolved:
BUG/RFE:6594519Need support for ACPI System Resource Affinity Table (SRAT)
BUG/RFE:6621201Need support to read ACPI System Locality Information Table 
(SLIT)
BUG/RFE:6688471x86/x64 lgroup platform support code needs cleaning
Files Changed:
update:usr/src/uts/i86pc/os/acpi_fw.h
update:usr/src/uts/i86pc/os/cpuid.c
update:usr/src/uts/i86pc/os/fakebop.c
update:usr/src/uts/i86pc/os/lgrpplat.c
update:usr/src/uts/i86pc/os/mlsetup.c
update:usr/src/uts/intel/sys/x86_archext.h


The discussion in the CR (not complete yet) suggests the root cause
here is:

(begin quote)

the comparison currently used by pfn_2_mtype() is insufficient is that 
mnoderanges
are not necessarily in pfn ascending order, like in this particular
case:

0]> ffffff00074b9000::array mnoderange_t 3 | ::print mnoderange_t
{
    mnr_pfnlo = 0x80000
    mnr_pfnhi = 0xf57f5
    mnr_mnode = 0
    mnr_memrange = 0
    mnr_mt_clpgcnt = 0
    mnr_mt_flpgcnt = [ 0, 0, 0 ]
    mnr_mt_totcnt = 0
}
{
    mnr_pfnlo = 0
    mnr_pfnhi = 0xfff
    mnr_mnode = 0x1
    mnr_memrange = 0x2
    mnr_mt_clpgcnt = 0
    mnr_mt_flpgcnt = [ 0xcf3, 0, 0 ]
    mnr_mt_totcnt = 0xcf3
}
{
    mnr_pfnlo = 0x1000
    mnr_pfnhi = 0x7ffff
    mnr_mnode = 0x1
    mnr_memrange = 0x1
    mnr_mt_clpgcnt = 0xe
    mnr_mt_flpgcnt = [ 0x74c, 0xd7c00, 0 ]
    mnr_mt_totcnt = 0xd835a
}

(end quote)

If that is the case then it sounds like disabling srat eliminates a cause
on your system of this not being in ascending order, but may leave
other systems no better off.  Not sure.

Could you try the fix suggested in the CR:

pfn_2_mtype() should perform proper range checking just like 
plat_pfn_to_mem_node()

/*
 * return the mnoderange containing pfn
 */
/*ARGSUSED*/
int
pfn_2_mtype(pfn_t pfn)
{
#if defined(__xpv)
        return (0);
#else
        int     n;

        for (n = mnoderangecnt - 1; n >= 0; n--) {

-                if (pfn >= mnoderanges[n].mnr_pfnlo) {

+                if (pfn >= mnoderanges[n].mnr_pfnlo && \
+                    pfn <= mnoderanges[n].mnr_pfnhi)
                        break;
                }
        }
        return (n);
#endif
}

Cheers

Gavin
_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to