Skip to content

Commit

Permalink
s390/mm: speedup storage key initialization
Browse files Browse the repository at this point in the history
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: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Heiko Carstens authored and Martin Schwidefsky committed Apr 17, 2013
1 parent 1bca09f commit f7f8d7e
Showing 1 changed file with 9 additions and 15 deletions.
24 changes: 9 additions & 15 deletions arch/s390/mm/pageattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,25 @@
#include <asm/pgtable.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)
{
unsigned long boundary, function, size;
unsigned long boundary, size;

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) {
/* set storage keys for a 1MB frame */
function = 0x21000 | PAGE_DEFAULT_KEY;
size = 1UL << 20;
boundary = (start + size) & ~(size - 1);
if (boundary <= end) {
do {
start = pfmf(function, start);
start = sske_frame(start, PAGE_DEFAULT_KEY);
} while (start < boundary);
continue;
}
Expand Down

0 comments on commit f7f8d7e

Please sign in to comment.