Skip to content

Commit 8fcf9df

Browse files
Add new case VIRT-299024 for memory balloon freepagereporting
Signed-off-by: liang-cong-red-hat <[email protected]>
1 parent 0bdddca commit 8fcf9df

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
- memory.balloon.freepagereporting:
2+
type = memory_balloon_freepagereporting
3+
start_vm = no
4+
current_mem = 4194304
5+
mem_value = 4194304
6+
set_memroy = 3145728
7+
mem_consume_cmd = "timeout 20s memhog -r80 %sk"
8+
variants:
9+
- virtio:
10+
model = "virtio"
11+
- virtio-non-transitional:
12+
no s390-virtio
13+
model = "virtio-non-transitional"
14+
variants:
15+
- undefined:
16+
freepage_reporting_config = ""
17+
max_memory_difference = 51200
18+
- off:
19+
freepagereporting = off
20+
freepage_reporting_config = ", 'freepage_reporting':'${freepagereporting}'"
21+
max_memory_difference = 51200
22+
- on:
23+
freepagereporting = on
24+
freepage_reporting_config = ", 'freepage_reporting':'${freepagereporting}'"
25+
min_memory_difference = 819200
26+
memballoon_dict ={'model':'${model}' ${freepage_reporting_config}}
27+
mem_attrs = {'memory_unit':'KiB','memory':${mem_value},'current_mem':${current_mem},'current_mem_unit':'KiB'}
28+
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2+
#
3+
# Copyright Red Hat
4+
#
5+
# SPDX-License-Identifier: GPL-2.0
6+
#
7+
# Author: Liang Cong <[email protected]>
8+
#
9+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10+
import time
11+
import re
12+
13+
from virttest import utils_misc
14+
from virttest import virsh
15+
from virttest.libvirt_xml import vm_xml
16+
from virttest.libvirt_xml.devices import memballoon
17+
from virttest.staging import utils_memory
18+
from virttest.utils_test import libvirt
19+
20+
21+
def run(test, params, env):
22+
"""
23+
Verify the freepagereporting takes effect with various memory balloon models
24+
"""
25+
def get_rss_mem_list(timeout=30):
26+
""""
27+
Get rss memory list from virsh dommemstat cmd per second
28+
29+
:param timeout: timeout of getting rss memory list from virsh dommemstat cmd
30+
:return: rss memory list
31+
"""
32+
current = 0
33+
rss_mem_list = []
34+
while current < timeout:
35+
time.sleep(1)
36+
rss_mem_list.append(get_rss_mem())
37+
current += 1
38+
return rss_mem_list
39+
40+
def get_rss_mem():
41+
""""
42+
Get rss memory from virsh dommemstat cmd
43+
"""
44+
output = virsh.dommemstat(vm_name, **virsh_dargs).stdout_text
45+
match = re.search(r"rss\s+(\d+)", output)
46+
return int(match.group(1))
47+
48+
def run_test():
49+
"""
50+
Test steps
51+
"""
52+
test.log.info("TEST_STEP1: Define guest")
53+
vmxml.del_device('memballoon', by_tag=True)
54+
mem_balloon = memballoon.Memballoon()
55+
mem_balloon.setup_attrs(**memballoon_dict)
56+
vmxml.devices = vmxml.devices.append(mem_balloon)
57+
vmxml.setup_attrs(**mem_attrs)
58+
vmxml.sync()
59+
60+
test.log.info("TEST_STEP2: Start the domain.")
61+
vm.start()
62+
63+
test.log.info("TEST_STEP3: Check the memory usage of the guest on host.")
64+
session = vm.wait_for_login()
65+
init_rss = get_rss_mem()
66+
67+
test.log.info(
68+
"TEST_STEP4: Login the guest and consume the guest memory.")
69+
rss_mem_thread = utils_misc.InterruptedThread(get_rss_mem_list)
70+
rss_mem_thread.start()
71+
free_mem = utils_memory.freememtotal(session)
72+
session.cmd_status("swapoff -a")
73+
session.cmd_status(mem_consume_cmd % (free_mem - 204800))
74+
session.close()
75+
rss_mem_list = rss_mem_thread.join()
76+
test.log.debug(
77+
"The rss memory list is %s during guest consumption." % rss_mem_list)
78+
79+
test.log.info(
80+
"TEST_STEP5: Verify the memory usage is increased after consuming more memory on host.")
81+
second_rss_mem = max(rss_mem_list)
82+
if second_rss_mem < init_rss:
83+
test.fail("Expected rss memory after consuming %s is larger than %s" % (
84+
second_rss_mem, init_rss))
85+
86+
test.log.info("TEST_STEP6: Check the memory after memory consumption.")
87+
third_rss_mem = rss_mem_list[-1]
88+
rss_mem_changed = second_rss_mem - third_rss_mem
89+
if max_memory_difference and abs(rss_mem_changed) > max_memory_difference:
90+
test.fail("Expected rss memory changed lower than %s, but got %s" % (
91+
max_memory_difference, abs(rss_mem_changed)))
92+
if min_memory_difference and rss_mem_changed < min_memory_difference:
93+
test.fail("Expected rss memory changed larger than %s, but got %s" % (
94+
min_memory_difference, rss_mem_changed))
95+
96+
test.log.info(
97+
"TEST_STEP7: Change the current memory allocation of the guest.")
98+
result = virsh.setmem(domain=vm_name, size=set_memory, **virsh_dargs)
99+
libvirt.check_exit_status(result)
100+
101+
test.log.info(
102+
"TEST_STEP8: Check the memory allocation config by virsh dominfo.")
103+
if not utils_misc.wait_for(lambda: vm.get_used_mem() == int(set_memory), timeout=10):
104+
test.fail("Expect used memory of dominfo is %s, but got %s" % (
105+
set_memory, vm.get_used_mem()))
106+
max_mem = vm.get_max_mem()
107+
if max_mem != int(mem_value):
108+
test.fail("Expected max memory of dominfo is %s, but got %s" %
109+
(mem_value, max_mem))
110+
111+
def teardown_test():
112+
"""
113+
Clean test environment.
114+
"""
115+
test.log.info("TEST_TEARDOWN: Clean up environment.")
116+
bkxml.sync()
117+
118+
vm_name = params.get("main_vm")
119+
vm = env.get_vm(vm_name)
120+
vmxml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
121+
bkxml = vmxml.copy()
122+
memballoon_dict = eval(params.get('memballoon_dict', '{}'))
123+
mem_attrs = eval(params.get('mem_attrs', '{}'))
124+
virsh_dargs = {"debug": True, "ignore_status": True}
125+
max_memory_difference = int(params.get('max_memory_difference', '0'))
126+
min_memory_difference = int(params.get('min_memory_difference', '0'))
127+
set_memory = params.get('set_memroy')
128+
mem_value = params.get('mem_value')
129+
mem_consume_cmd = params.get('mem_consume_cmd')
130+
131+
try:
132+
run_test()
133+
134+
finally:
135+
teardown_test()

0 commit comments

Comments
 (0)