Re: parisc: flush pages through tmpalias space

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 22 Dec 2010, James Bottomley wrote:

> The kernel has an 8M tmpailas space (originally designed for copying
> and clearing pages but now only used for clearing).  The idea is
> to place zeros into the cache above a physical page rather than into
> the physical page and flush the cache, because often the zeros end up
> being replaced quickly anyway.
> 
> We can also use the tmpalias space for flushing a page.  The difference
> here is that we have to do tmpalias processing in the non access data and
> instruction traps.  The principle is the same: as long as we know the physical
> address and have a virtual address congruent to the real one, the flush will
> be effective.
> 
> In order to use the tmpalias space, the icache miss path has to be enhanced to
> check for the alias region to make the fic instruction effective.

Since I began testing this change, I have started seeing problems with the
console input on gsyprf11 and my rp3440.  If I HUP getty, the console works
for awhile and then stops working again.  Suspect the "INEQIVALENT ALIAS"
messages somehow kill the console.  I get a lot of these doing make check
for GCC from the tests that intentionally generate a segv to test exception
support.

I have also had at least one console related HPMC.  Analysis is attached.
I don't fully understand the actual cause of the HPMC (buffer overrun?).
The kernel was built with GCC 4.5.3.  The faulting instruction appears
to have the base and index interchanged, although this shouldn't affect
linux.  I thought this issue was fixed as a fair bit of work on this was
done in the middle-end.

I have to say that gsyprf11 running a SMP kernel built with 4.5.3 is
more stable with your change than it has been for a long time.

Dave
-- 
J. David Anglin                                  dave.anglin@xxxxxxxxxxxxxx
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)
Timestamp =   Mon Jan  3 08:35:03 GMT 2011    (20:11:01:03:08:35:03)

HPMC Chassis Codes

       Chassis Code        Extension
       ------------        ---------
     0xe800035c00e00000 0x000000004033fde8
     0x57000f7300e00000 0x8040004000000000
     0x5600100b00e00000 0x0000000000000194
     0x5600106400e00000 0xfffffff0f0435110


General Registers 0 - 31
00-03  0000000000000000  0000000040530a90  00000000403439ec  0000000040530b40
04-07  0000000040668a80  000000004061bd60  0000000000000000  0000000040530a60
08-11  0000000000000001  0000000040534080  0000000040530988  0000000000200200
12-15  0000000040677280  0000000040534100  00000000405fe0e0  00000000405fe4e0
16-19  00000000405fe8e0  00000000405fece0  0000000000000001  0000000040530988
20-23  0000000000000000  ffffffffffffffff  00000000405d7110  8000000000000000
24-27  0000000102208072  0000000000000001  000000004061bd60  0000000040668a80
28-31  0000000004082000  0000000040530b10  0000000040530b80  0000000000000000

Control Registers 0 - 31
00-03  0000000000000000  0000000000000000  0000000000000000  0000000000000000
04-07  0000000000000000  0000000000000000  0000000000000000  0000000000000000
08-11  0000000000000b12  0000000000000000  00000000000000c0  000000000000003f
12-15  0000000000000000  0000000000000000  0000000000103000  ffe0000000000000
16-19  00006827228e3750  0000000000000000  000000004033fde8  000000000f3c001c
20-23  00000000a607ffd0  0000000014082001  000000ff0804ff0f  0000000000000000
24-27  00000000005bd000  000000003ce22000  fffdffffffdfffef  0000000040000b80
28-31  0000000040000b80  ffffffffffffff7f  0000000040530000  886904b488140042

Space Registers 0 - 7
00-03  00000000002c4800  0000000000000000  0000000000000000  00000000002c4800
04-07  0000000000000000  0000000000000000  0000000000000000  0000000000000000


IIA Space (back entry)       = 0x0000000000000000
IIA Offset (back entry)      = 0x000000004033fdec
Check Type                   = 0x20000000
Cpu State                    = 0x9e000000
Cache Check                  = 0x00000000
TLB Check                    = 0x00000000
Bus Check                    = 0x00000000
Assists Check                = 0x002c4800
Assist State                 = 0x00000000
Path Info                    = 0x00000000
System Responder Address     = 0x0000000000000000
System Requestor Address     = 0x0000000000000000

Floating Point Registers 0 - 31
00-03  0000000000000000  0000000000000000  0000000000000000  0000000000000000
04-07  000f000000000000  0000000000000001  00000000406bd000  0000000040688000
08-11  00000000406bd000  0000000040668a80  0000000000000000  0000000040668a80
12-15  0000000000000000  0000000000000000  0000000000000000  0000000000000000
16-19  0000000000000000  0000000000000000  0000000000000000  0000000000000000
20-23  0000000000000000  0000000000000000  0000000000000000  000000000000000f
24-27  0000000000000000  0000000000000000  0000000000000000  ffffffffc0000000
28-31  000000000000002f  00000000405651cc  0000000000000001  0000000000000001

PIM Revision                 = 0x0000000000000001                
CPU ID                       = 0x0000000000000014
CPU Revision                 = 0x0000000000000031
Cpu Serial Number            = 0x46100b89e43f0503
Check Summary                = 0x8040004000000000
SAL Timestamp                = 0x000000004d218a37
System Firmware Rev.         = 0x00000ba20000121a
PDC Relocation Address       = 0xfffffff0f0c00000
Available Memory             = 0x000000027fe00000
CPU Diagnose Register 2      = 0x3112022000002008
MIB_STAT                     = 0x0040000000200000
MIB_LOG1                     = 0x0000000000555500
MIB_LOG2                     = 0x0000800000000000
MIB_ECC_DATA                 = 0x808800007fffbfd8
ICache Info                  = 0x0000000000000000
DCache Info                  = 0x0000000000000000
Sharedcache Info1            = 0x0000000000000000
Sharedcache Info2            = 0x00000000000000c0
MIB_RSLOG1                   = 0x0000000000000004
MIB_RSLOG2                   = 0x0000010000000000
MIB_RQLOG                    = 0x02921405fffe1510
MIB_REQLOGa                  = 0x8000000000000200
MIB_REQLOGb                  = 0x01000aa400000000
Reserved                     = 0x0000000000000000
Cache Repair Detail          = 0x0000000000000000

PIM Detail Text:

000000004033fdc8 <mem_serial_in>:
    4033fdc8:   08 03 02 41     copy r3,r1
    4033fdcc:   08 1e 02 43     copy sp,r3
    4033fdd0:   73 c1 00 88     std,ma r1,40(sp)
    4033fdd4:   43 5f 00 92     ldb 49(r26),r31
    4033fdd8:   53 5c 00 20     ldd 10(r26),ret0
    4033fddc:   01 7f 18 c0     mtsarcm r31
    4033fde0:   d7 39 00 00     depw,z r25,sar,32,r25
    4033fde4:   db 39 0f e0     extrd,s r25,63,32,r25
==> 4033fde8:   0f 3c 00 1c     ldb ret0(r25),ret0
    4033fdec:   34 7e 00 80     ldo 40(r3),sp
    4033fdf0:   e8 40 d0 00     bve (rp)
    4033fdf4:   53 c3 3f 8d     ldd,mb -40(sp),r3

r25 = 0000000000000001
r31 = 0000000000000000
ret0= 0000000004082000
rp  = 00000000403439ec

drivers/serial/8250.c:

static unsigned int mem_serial_in(struct uart_port *p, int offset)
{
        offset = map_8250_in_reg(p, offset) << p->regshift;
	return readb(p->membase + offset);
}

It appears the base and offset are interchanged in ldb.

0000000040343818 <serial8250_backup_timeout>:
    40343818:   08 03 02 41     copy r3,r1
    4034381c:   0f c2 12 c1     std rp,-10(sp)
    ...
    403439d0:   08 1b 02 44     copy dp,r4
    403439d4:   34 19 00 02     ldi 1,r25
    403439d8:   53 5c 00 30     ldd 18(r26),ret0
    403439dc:   37 dd 3f a1     ldo -30(sp),ret1
    403439e0:   53 82 00 20     ldd 10(ret0),rp
    403439e4:   e8 40 f0 00     bve,l (rp),rp
    403439e8:   53 9b 00 30     ldd 18(ret0),dp
==> 403439ec:   08 04 02 5b     copy r4,dp
    403439f0:   08 1c 02 46     copy ret0,r6


[Index of Archives]     [Linux SoC]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux