On Mon, 2022-05-16 at 18:47 +0200, Janis Schoetterl-Glausch wrote: > On 5/16/22 11:07, Nico Boehr wrote: > > Upon migration, we expect storage keys being set by the guest to be > > preserved, > > so add a test for it. > > "being set" implies that keys are set while the migration is going > on. > That's not the case, is it? Fixed. > > We keep 128 pages and set predictable storage keys. Then, we > > migrate and check > > they can be read back and the respective access restrictions are in > > place when > > ... check that they ... Added that. > > > the access key in the PSW doesn't match. > > The latter half of the sentence doesn't apply anymore, now that you > simplified the test. > So maybe something like: ... and check that they can be read back and > match the value > originally set. Fixed. > > diff --git a/s390x/migration-skey.c b/s390x/migration-skey.c > > new file mode 100644 > > index 000000000000..ee4622eb94ba > > --- /dev/null > > +++ b/s390x/migration-skey.c > > @@ -0,0 +1,78 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Storage Key migration tests > > + * > > + * Copyright IBM Corp. 2022 > > + * > > + * Authors: > > + * Nico Boehr <nrb@xxxxxxxxxxxxx> > > + */ > > + > > +#include <libcflat.h> > > +#include <asm/facility.h> > > +#include <asm/page.h> > > +#include <asm/mem.h> > > +#include <asm/interrupt.h> > > +#include <hardware.h> > > + > > +#define NUM_PAGES 128 > > +static uint8_t pagebuf[NUM_PAGES][PAGE_SIZE] > > __attribute__((aligned(PAGE_SIZE))); > > + > > +static void test_migration(void) > > +{ > > + int i, key_to_set; > > + uint8_t *page; > > + union skey expected_key, actual_key; > > + > > + for (i = 0; i < NUM_PAGES; i++) { > > + /* > > + * Storage keys are 7 bit, lowest bit is always > > returned as zero > > + * by iske > > + */ > > + key_to_set = i * 2; > > + set_storage_key(pagebuf[i], key_to_set, 1); > > + } > > + > > + puts("Please migrate me, then press return\n"); > > + (void)getchar(); > > + > > + for (i = 0; i < NUM_PAGES; i++) { > > + report_prefix_pushf("page %d", i); > > + > > + page = &pagebuf[i][0]; > > + actual_key.val = get_storage_key(page); > > The page variable is kinda useless now, I'd just do > get_storage_key(pagebuf[0]). Removed. > > + expected_key.val = i * 2; > > + > > + /* ignore reference bit */ > > Why? Are there any implicit references I'm missing? Since the PoP specifies (p. 5-122): "The record of references provided by the reference bit is not necessarily accurate. However, in the major- ity of situations, reference recording approximately coincides with the related storage reference." I don't really see a way to test this properly. Maybe I missed something?