提交 f7f8d7e5 编写于 作者: H Heiko Carstens 提交者: Martin Schwidefsky

s390/mm: speedup storage key initialization

Use sske with multiple block control to initialize storage keys within
a 1 MB frame at once.
It turned out that the sske with mb=1 is an order of magnitude faster
than pfmf. This is only an issue for very large systems (several 100GB)
where storage key initialization could last more than a minute.
Signed-off-by: NHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
上级 1bca09f7
...@@ -9,31 +9,25 @@ ...@@ -9,31 +9,25 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/page.h> #include <asm/page.h>
static inline unsigned long sske_frame(unsigned long addr, unsigned char skey)
{
asm volatile(".insn rrf,0xb22b0000,%[skey],%[addr],9,0"
: [addr] "+a" (addr) : [skey] "d" (skey));
return addr;
}
void storage_key_init_range(unsigned long start, unsigned long end) void storage_key_init_range(unsigned long start, unsigned long end)
{ {
unsigned long boundary, function, size; unsigned long boundary, size;
while (start < end) { while (start < end) {
if (MACHINE_HAS_EDAT2) {
/* set storage keys for a 2GB frame */
function = 0x22000 | PAGE_DEFAULT_KEY;
size = 1UL << 31;
boundary = (start + size) & ~(size - 1);
if (boundary <= end) {
do {
start = pfmf(function, start);
} while (start < boundary);
continue;
}
}
if (MACHINE_HAS_EDAT1) { if (MACHINE_HAS_EDAT1) {
/* set storage keys for a 1MB frame */ /* set storage keys for a 1MB frame */
function = 0x21000 | PAGE_DEFAULT_KEY;
size = 1UL << 20; size = 1UL << 20;
boundary = (start + size) & ~(size - 1); boundary = (start + size) & ~(size - 1);
if (boundary <= end) { if (boundary <= end) {
do { do {
start = pfmf(function, start); start = sske_frame(start, PAGE_DEFAULT_KEY);
} while (start < boundary); } while (start < boundary);
continue; continue;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册