From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5174738A73A; Mon, 20 Apr 2026 08:49:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776674989; cv=none; b=euHrpRg/GaD1HClHeoq/jkgn1yQAcrX+kJV7bSQ0jsN4XDAUAY2tueXH86FMgeMBW2y6RES5JMTJaINAaq7f3SN8E+SlWqwDI7oSsbaTW+WfiuHLHiPVVnIZFaAnh/wNf8KXrToL/DJg4UCTrJWsg6YeKDJSTRiARI6bEyovKos= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776674989; c=relaxed/simple; bh=bUNXXmMHrjLEmFR+6s7GLbmp27y7b4TXIdBOmW0YSPM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=akxFwWNBUCYMjOhzAKgQ2xruJN8bogu9SoJid/cI7/HInDuv8Qbs16fdbhQ/C+bc4Cnkj+ZBYXnX4Eu5XqxxnRR1td9S9MHzxjThlbxGB4dTy+kowf6A1DUcLGEW9LDn1fj8ehzUiXnmzwzSx8nVIhxENlPghPch9Gpc9f9Wl1k= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=b6FO6P/8; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="b6FO6P/8" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63JMP7pk3529642; Mon, 20 Apr 2026 08:49:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=ZEowiy9tanRsnQR45 yuwuL7/9pzCQzls2jxl+XAeR1o=; b=b6FO6P/8i9hVrRnTpHPJYEFirnVNLKgiy wx/XKzbT+z0h9CdZ8lAJz6hMVpmaXaYqCgUZ9cQ4POtKPB+SHxd61DhSkys3pXHm dKbhDZjZ48UFxBLDdAhA+uIZuzA6iO78iSbpG1OODVFgbJFpOP+PQQmXLwEBVqLV TbA8Ozj7o1Hkoyfc0bulNq4RWkWOBCBZTHvVn99xlw1Ujg6dJ5S2HTCEV572rMLb SSHVFeCL3A81Hn4E96a/keJMvtXSmxb4i+KAp9lRySCsMpd2o9CyyQakl9/iG9z1 7/VGLWleAdAKBGGZuzxRiTkzTztXGnYEv5jRDFIBOg83svNE+eg8Q== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4dm2ney0du-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Apr 2026 08:49:46 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 63K8ZU7p012628; Mon, 20 Apr 2026 08:49:45 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dmmnvm4rf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Apr 2026 08:49:44 +0000 (GMT) Received: from smtpav01.fra02v.mail.ibm.com (smtpav01.fra02v.mail.ibm.com [10.20.54.100]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 63K8nfmp30998862 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Apr 2026 08:49:41 GMT Received: from smtpav01.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 37DD22004D; Mon, 20 Apr 2026 08:49:41 +0000 (GMT) Received: from smtpav01.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1796220043; Mon, 20 Apr 2026 08:49:41 +0000 (GMT) Received: from b46lp25.lnxne.boe (unknown [9.87.84.240]) by smtpav01.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 20 Apr 2026 08:49:41 +0000 (GMT) From: Janosch Frank To: kvm@vger.kernel.org Cc: linux-s390@vger.kernel.org, imbrenda@linux.ibm.com, borntraeger@linux.ibm.com, nrb@linux.ibm.com Subject: [kvm-unit-tests PATCH v2 3/4] lib: s390x: sie: Memory rework Date: Mon, 20 Apr 2026 08:44:24 +0000 Message-ID: <20260420084933.251244-4-frankja@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260420084933.251244-1-frankja@linux.ibm.com> References: <20260420084933.251244-1-frankja@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-s390@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: 5yjX4bL7OLZjn6whjgKfnC2nsyHAgsTJ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDIwMDA4NCBTYWx0ZWRfX7jWb8AiKQVoO 7QohqXXcgaygFfd67ivnXLP1fETOvfMBi4yWSzmw10uVY0NQtfid3GZ2O26Mb8kOgSiTmTU4oOc pORqtTcBQLJ/FVKK/cuKvzNuks77M1lRQDHvUi9QjZ3X188XA2bD0WVFvYCZfphzS8qrm8oW3C/ 4YjVYeyBD2NDfCn0HDwn6J7vdFi10C/JIHAhzs0e9g3s73Stn117iFN6dfP49bCltRayB7l4uYG fqhIButMj2C/gB0sB47YB/fuZ8QYn2TYn6EZSqTnv953EFX7ohZA34xSLP8k0e3s81LFWMLBvmK FdA6gsoKpBkuyIUeIDuiywji7ktG7iXzMZQ63ixTY3u01fGA223ZAdLK3LxyKNaEkA5RSDxcfIF XQeghi+PL/oDJGvHfDcqa9AswAK4t2lr2BHgS8ckwjqDbfb0bxakNFkR/AOK+NuQh0U/DW11coY kqh0qTMLt7jTaHRJwHg== X-Proofpoint-GUID: 5yjX4bL7OLZjn6whjgKfnC2nsyHAgsTJ X-Authority-Analysis: v=2.4 cv=B7iJFutM c=1 sm=1 tr=0 ts=69e5e8aa cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=K9MXuSR0SzlJvogcFBwA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-20_01,2026-04-17_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 spamscore=0 impostorscore=0 adultscore=0 bulkscore=0 phishscore=0 suspectscore=0 lowpriorityscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604070000 definitions=main-2604200084 Make sie_guest_create() directly alloc the guest's memory. Also we never freed the memory that the sie library allocates as the guest ram on destruction of the VM. Most tests reuse the VM or just leak the memory since the standard allocation is one megabyte and tests only use single digit numbers of VMs. It's time to add automatic freeing to the sie library when a VM is destroyed. Signed-off-by: Janosch Frank --- lib/s390x/sie.c | 49 ++++++++++++++++++++++++--------------------- lib/s390x/sie.h | 2 +- lib/s390x/snippet.h | 9 +++++---- s390x/mvpg-sie.c | 2 +- s390x/pv-diags.c | 2 +- s390x/pv-edat1.c | 5 +---- s390x/pv-icptcode.c | 4 ++-- s390x/pv-ipl.c | 2 +- s390x/sie-dat.c | 2 +- s390x/sie.c | 13 ++++-------- s390x/spec_ex-sie.c | 2 ++ s390x/stfle-sie.c | 2 ++ 12 files changed, 47 insertions(+), 47 deletions(-) diff --git a/lib/s390x/sie.c b/lib/s390x/sie.c index b1b0a8a0..f0e1c41b 100644 --- a/lib/s390x/sie.c +++ b/lib/s390x/sie.c @@ -121,29 +121,6 @@ void sie_guest_sca_create(struct vm *vm) vm->sca->cpu[0].sda = (uint64_t)vm->sblk; } -/* Initializes the struct vm members like the SIE control block. */ -void sie_guest_create(struct vm *vm, uint64_t guest_mem, uint64_t guest_mem_len) -{ - vm->sblk = alloc_page(); - memset(vm->sblk, 0, PAGE_SIZE); - vm->sblk->cpuflags = CPUSTAT_ZARCH | CPUSTAT_RUNNING; - vm->sblk->ihcpu = 0xffff; - vm->sblk->prefix = 0; - - /* Guest memory chunks are always 1MB */ - assert(!(guest_mem_len & ~HPAGE_MASK)); - vm->guest_mem = (uint8_t *)guest_mem; - /* For non-PV guests we re-use the host's ASCE for ease of use */ - vm->save_area.guest.asce = stctg(1); - /* Currently MSO/MSL is the easiest option */ - vm->sblk->mso = (uint64_t)guest_mem; - vm->sblk->msl = (uint64_t)guest_mem + ((guest_mem_len - 1) & HPAGE_MASK); - - /* CRYCB needs to be in the first 2GB */ - vm->crycb = alloc_pages_flags(0, AREA_DMA31); - vm->sblk->crycbd = (uint32_t)(uintptr_t)vm->crycb; -} - /** * sie_guest_alloc() - Allocate memory for a guest and map it in virtual address * space such that it is properly aligned. @@ -185,6 +162,31 @@ uint8_t *sie_guest_alloc(uint64_t guest_size) return guest_virt; } +/* Initializes the struct vm members like the SIE control block. */ +void sie_guest_create(struct vm *vm, uint64_t guest_mem_len) +{ + void *guest_mem = sie_guest_alloc(guest_mem_len); + + vm->sblk = alloc_page(); + memset(vm->sblk, 0, PAGE_SIZE); + vm->sblk->cpuflags = CPUSTAT_ZARCH | CPUSTAT_RUNNING; + vm->sblk->ihcpu = 0xffff; + vm->sblk->prefix = 0; + + /* Guest memory chunks are always 1MB */ + assert(!(guest_mem_len & ~HPAGE_MASK)); + vm->guest_mem = (uint8_t *)guest_mem; + /* For non-PV guests we re-use the host's ASCE for ease of use */ + vm->save_area.guest.asce = stctg(1); + /* Currently MSO/MSL is the easiest option */ + vm->sblk->mso = (uint64_t)guest_mem; + vm->sblk->msl = (uint64_t)guest_mem + ((guest_mem_len - 1) & HPAGE_MASK); + + /* CRYCB needs to be in the first 2GB */ + vm->crycb = alloc_pages_flags(0, AREA_DMA31); + vm->sblk->crycbd = (uint32_t)(uintptr_t)vm->crycb; +} + /* Frees the memory that was gathered on initialization */ void sie_guest_destroy(struct vm *vm) { @@ -192,4 +194,5 @@ void sie_guest_destroy(struct vm *vm) free_page(vm->sblk); if (vm->sblk->ecb2 & ECB2_ESCA) free_page(vm->sca); + free_pages((void *)virt_to_pte_phys(get_primary_page_root(), vm->guest_mem)); } diff --git a/lib/s390x/sie.h b/lib/s390x/sie.h index 3ec49ed0..85d691d5 100644 --- a/lib/s390x/sie.h +++ b/lib/s390x/sie.h @@ -59,7 +59,7 @@ static inline bool sie_is_pv(struct vm *vm) } void sie_guest_sca_create(struct vm *vm); -void sie_guest_create(struct vm *vm, uint64_t guest_mem, uint64_t guest_mem_len); +void sie_guest_create(struct vm *vm, uint64_t guest_mem_len); void sie_guest_destroy(struct vm *vm); uint8_t *sie_guest_alloc(uint64_t guest_size); diff --git a/lib/s390x/snippet.h b/lib/s390x/snippet.h index 910849aa..94688f49 100644 --- a/lib/s390x/snippet.h +++ b/lib/s390x/snippet.h @@ -125,11 +125,8 @@ static inline void snippet_pv_init(struct vm *vm, const char *gbin, /* Allocates and sets up a snippet based guest */ static inline void snippet_setup_guest(struct vm *vm, bool is_pv) { - const unsigned long guest_size = SZ_1M; - uint8_t *guest_start = sie_guest_alloc(guest_size); - /* Initialize the vm struct and allocate control blocks */ - sie_guest_create(vm, (uint64_t)guest_start, guest_size); + sie_guest_create(vm, SZ_1M); if (is_pv) { /* FMT4 needs a ESCA */ @@ -144,4 +141,8 @@ static inline void snippet_setup_guest(struct vm *vm, bool is_pv) } } +static inline void snippet_destroy_guest(struct vm *vm) +{ + sie_guest_destroy(vm); +} #endif diff --git a/s390x/mvpg-sie.c b/s390x/mvpg-sie.c index 3050a8bb..21082c53 100644 --- a/s390x/mvpg-sie.c +++ b/s390x/mvpg-sie.c @@ -118,7 +118,7 @@ int main(void) setup_guest(); test_mvpg(); test_mvpg_pei(); - sie_guest_destroy(&vm); + snippet_destroy_guest(&vm); done: report_prefix_pop(); diff --git a/s390x/pv-diags.c b/s390x/pv-diags.c index 09b83d59..b6f08dd2 100644 --- a/s390x/pv-diags.c +++ b/s390x/pv-diags.c @@ -156,7 +156,7 @@ int main(void) test_diag_yield(); test_diag_288(); test_diag_500(); - sie_guest_destroy(&vm); + snippet_destroy_guest(&vm); done: report_prefix_pop(); diff --git a/s390x/pv-edat1.c b/s390x/pv-edat1.c index e423f2fc..ff762c75 100644 --- a/s390x/pv-edat1.c +++ b/s390x/pv-edat1.c @@ -437,15 +437,12 @@ static bool check_facilities(void) static void init(void) { - uint8_t *guest_memory; - setup_vm(); root = get_primary_page_root(); ctl_set_bit(0, CTL0_EDAT); - guest_memory = alloc_pages(GUEST_ORDER - PAGE_SHIFT); - sie_guest_create(&vm, (uint64_t)guest_memory, GUEST_SIZE); + sie_guest_create(&vm, GUEST_SIZE); sie_guest_sca_create(&vm); uv_init(); uv_setup_asces(); diff --git a/s390x/pv-icptcode.c b/s390x/pv-icptcode.c index 5293306b..bdef3a05 100644 --- a/s390x/pv-icptcode.c +++ b/s390x/pv-icptcode.c @@ -164,7 +164,7 @@ static void test_validity_handle_not_in_config(void) /* Destroy the second vm, since we don't need it for further tests */ uv_destroy_guest(&vm2); - sie_guest_destroy(&vm2); + snippet_destroy_guest(&vm2); uv_destroy_guest(&vm); report_prefix_pop(); @@ -368,7 +368,7 @@ int main(void) test_validity_handle_not_in_config(); test_validity_already_running(); test_validity_timing(); - sie_guest_destroy(&vm); + snippet_destroy_guest(&vm); done: report_prefix_pop(); diff --git a/s390x/pv-ipl.c b/s390x/pv-ipl.c index 61a1e0c0..1219573f 100644 --- a/s390x/pv-ipl.c +++ b/s390x/pv-ipl.c @@ -135,7 +135,7 @@ int main(void) snippet_setup_guest(&vm, true); test_diag_308(0); test_diag_308(1); - sie_guest_destroy(&vm); + snippet_destroy_guest(&vm); done: report_prefix_pop(); diff --git a/s390x/sie-dat.c b/s390x/sie-dat.c index e40e348f..a5ff0872 100644 --- a/s390x/sie-dat.c +++ b/s390x/sie-dat.c @@ -101,7 +101,7 @@ int main(void) setup_guest(); test_sie_dat(); - sie_guest_destroy(&vm); + snippet_destroy_guest(&vm); done: report_prefix_pop(); diff --git a/s390x/sie.c b/s390x/sie.c index ce5b6069..f08564b1 100644 --- a/s390x/sie.c +++ b/s390x/sie.c @@ -20,7 +20,6 @@ #include #include -static u8 *guest; static u8 *guest_instr; static struct vm vm; @@ -70,7 +69,7 @@ static void test_epoch_ext(void) return; } - guest[0] = 0x00; + vm.guest_mem[0] = 0x00; memcpy(guest_instr, instr, sizeof(instr)); vm.sblk->gpsw.addr = PAGE_SIZE * 2; @@ -82,19 +81,15 @@ static void test_epoch_ext(void) sie(&vm); /* ... should result in the same epoch extension here: */ - report(guest[0] == 0x47, "epdx: different epoch is visible in the guest"); + report(vm.guest_mem[0] == 0x47, "epdx: different epoch is visible in the guest"); } static void setup_guest(void) { - setup_vm(); - - guest = sie_guest_alloc(SZ_1M); + sie_guest_create(&vm, HPAGE_SIZE); /* The first two pages are the lowcore */ - guest_instr = guest + PAGE_SIZE * 2; - - sie_guest_create(&vm, (uint64_t)guest, HPAGE_SIZE); + guest_instr = vm.guest_mem + PAGE_SIZE * 2; } int main(void) diff --git a/s390x/spec_ex-sie.c b/s390x/spec_ex-sie.c index fe2f23ee..6ab4144c 100644 --- a/s390x/spec_ex-sie.c +++ b/s390x/spec_ex-sie.c @@ -71,6 +71,8 @@ static void test_spec_ex_sie(void) report_info("%s", msg); else report_info("Did not interpret initial exception"); + + snippet_destroy_guest(&vm); report_prefix_pop(); report_prefix_pop(); } diff --git a/s390x/stfle-sie.c b/s390x/stfle-sie.c index 21cf8ff8..8df1185c 100644 --- a/s390x/stfle-sie.c +++ b/s390x/stfle-sie.c @@ -133,6 +133,8 @@ int main(int argc, char **argv) setup_guest(); if (run_format_0) test_stfle_format_0(); + + snippet_destroy_guest(&vm); out: return report_summary(); } -- 2.51.0