summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2016-05-02 12:10:17 +0200
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-06-20 09:55:07 +0200
commit717c05554afa69a36398a57dac64b95972f138d5 (patch)
treef713b8b2a0d8e43c3903e062e1e6c4a5fa8c32e5
parent3218f7094b6b583f4f01bffcf84572c6beacdcc2 (diff)
downloadop-kernel-dev-717c05554afa69a36398a57dac64b95972f138d5.zip
op-kernel-dev-717c05554afa69a36398a57dac64b95972f138d5.tar.gz
s390/mm: limit number of real-space gmap shadows
We have no known user of real-space designation and only support it to be architecture compliant. Gmap shadows with real-space designation are never unshadowed automatically, as there is nothing to protect for the top level table. So let's simply limit the number of such shadows to one by removing existing ones on creation of another one. Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
-rw-r--r--arch/s390/mm/gmap.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
index c07d64f..4a1434b 100644
--- a/arch/s390/mm/gmap.c
+++ b/arch/s390/mm/gmap.c
@@ -1455,6 +1455,19 @@ struct gmap *gmap_shadow(struct gmap *parent, unsigned long asce,
gmap_free(new);
return sg;
}
+ if (asce & _ASCE_REAL_SPACE) {
+ /* only allow one real-space gmap shadow */
+ list_for_each_entry(sg, &parent->children, list) {
+ if (sg->orig_asce & _ASCE_REAL_SPACE) {
+ spin_lock(&sg->guest_table_lock);
+ gmap_unshadow(sg);
+ spin_unlock(&sg->guest_table_lock);
+ list_del(&sg->list);
+ gmap_put(sg);
+ break;
+ }
+ }
+ }
atomic_set(&new->ref_count, 2);
list_add(&new->list, &parent->children);
if (asce & _ASCE_REAL_SPACE) {
OpenPOWER on IntegriCloud