Thread (27 messages) 27 messages, 3 authors, 2015-08-18

Re: [RFC PATCH V1 0/8] KASAN ppc64 support

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2015-08-17 11:21:39

On Mon, 2015-08-17 at 16:20 +0530, Aneesh Kumar K.V wrote:
Benjamin Herrenschmidt [off-list ref] writes:
quoted
On Mon, 2015-08-17 at 15:20 +0530, Aneesh Kumar K.V wrote:
quoted
For kernel linear mapping, our address space looks like
0xc000000000000000 - 0xc0003fffffffffff  (64TB)

We can't have virtual address(effective address) above that range
in 0xc region. Hence in-order to shadow the linear mapping, I am 
using region 0xe. ie, the shadow mapping now looks liwe

0xc000000000000000 -> 0xe000000000000000 
Why ? IE. Why can't you put the shadow at address +64T and have it 
work
for everything ?
.../...
Above +64TB ? How will that work ? We have check in different parts 
of
code like below, where we check each region's top address is within 
64TB range. 

PGTABLE_RANGE and (ESID_BITS + SID_SHIFT) and all dependendent on 
64TB
range. (46 bits).
For the VSID we could just mask the address with 64T-1. Depends if it's
some place we want to actually bound check or not. In general though,
we can safely assume that a region will never be bigger than
PGTABLE_RANGE so having another PGTABLE_RANGE zone making the kasan bit
somewhat makes sense. Or if you want KSAN to actually use page tables
make it PGTABLE_RANGE/2 and use the upper half. I don't understand
enough of what ksan does ...

static inline unsigned long get_vsid(unsigned long context, unsigned 
long ea,
				     int ssize)
{
	/*
	 * Bad address. We return VSID 0 for that
	 */
	if ((ea & ~REGION_MASK) >= PGTABLE_RANGE)
		return 0;

	if (ssize == MMU_SEGSIZE_256M)
		return vsid_scramble((context << ESID_BITS)
				     | (ea >> SID_SHIFT), 256M);
	return vsid_scramble((context << ESID_BITS_1T)
			     | (ea >> SID_SHIFT_1T), 1T);
}


quoted
quoted
Another reason why inline instrumentation is difficult is that 
for
inline instrumentation to work, we need to create a mapping for 
_possible_
virtual address space before kasan is fully initialized. ie, we 
need
to create page table entries for the shadow of the entire 64TB 
range,
with zero page, even though we have lesser ram. We definitely 
can't 
bolt those entries. I am yet to get the shadow for kernel linear 
mapping to work without bolting. Also we will have to get the 
page 
table allocated for that, because we can't share page table 
entries. 
Our fault path use pte entries for storing hash slot index.
Hrm, that means we might want to start considering a page table to
cover the linear mapping...
But that would require us to get a large zero page ? Are you 
suggesting
to use 16G page ? 

quoted
quoted
If we are ok to steal part of that 64TB range, for kasan mapping 
, ie
we make shadow of each region part of the same region, may be we 
can
get inline instrumentation to work. But that still doesn't solve 
the
page table allocation overhead issue mentioned above.
-aneesh
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help