xref: /freebsd/lib/libc/tests/sys/mlock_helper.c (revision 13876dc982e40121c2bbe629a3123dba1a6ab8cf)
1710542dfSBryan Drewery /*-
2710542dfSBryan Drewery  * Copyright (C) 2016 Bryan Drewery <bdrewery@FreeBSD.org>
3710542dfSBryan Drewery  * All rights reserved.
4710542dfSBryan Drewery  *
5710542dfSBryan Drewery  * Redistribution and use in source and binary forms, with or without
6710542dfSBryan Drewery  * modification, are permitted provided that the following conditions
7710542dfSBryan Drewery  * are met:
8710542dfSBryan Drewery  * 1. Redistributions of source code must retain the above copyright
9710542dfSBryan Drewery  *    notice, this list of conditions and the following disclaimer.
10710542dfSBryan Drewery  * 2. Redistributions in binary form must reproduce the above copyright
11710542dfSBryan Drewery  *    notice, this list of conditions and the following disclaimer in the
12710542dfSBryan Drewery  *    documentation and/or other materials provided with the distribution.
13710542dfSBryan Drewery  *
14710542dfSBryan Drewery  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15710542dfSBryan Drewery  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16710542dfSBryan Drewery  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17710542dfSBryan Drewery  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18710542dfSBryan Drewery  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19710542dfSBryan Drewery  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20710542dfSBryan Drewery  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21710542dfSBryan Drewery  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22710542dfSBryan Drewery  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23710542dfSBryan Drewery  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24710542dfSBryan Drewery  * SUCH DAMAGE.
25710542dfSBryan Drewery  */
26710542dfSBryan Drewery 
27710542dfSBryan Drewery /*
28710542dfSBryan Drewery  * Helper for mlock(3) to avoid EAGAIN errors
29710542dfSBryan Drewery  */
30710542dfSBryan Drewery 
31710542dfSBryan Drewery #include <sys/cdefs.h>
32710542dfSBryan Drewery __FBSDID("$FreeBSD$");
33710542dfSBryan Drewery 
34710542dfSBryan Drewery #include <sys/types.h>
35710542dfSBryan Drewery #include <sys/sysctl.h>
36710542dfSBryan Drewery 
37710542dfSBryan Drewery #include <atf-c.h>
38710542dfSBryan Drewery #include <errno.h>
39710542dfSBryan Drewery #include <limits.h>
40*13876dc9SEnji Cooper #include <stdio.h>
41710542dfSBryan Drewery 
42710542dfSBryan Drewery #define	VM_MAX_WIRED "vm.max_wired"
43710542dfSBryan Drewery 
44710542dfSBryan Drewery static void
45710542dfSBryan Drewery vm_max_wired_sysctl(int *old_value, int *new_value)
46710542dfSBryan Drewery {
47710542dfSBryan Drewery 	size_t old_len;
48710542dfSBryan Drewery 	size_t new_len = (new_value == NULL ? 0 : sizeof(int));
49710542dfSBryan Drewery 
50710542dfSBryan Drewery 	if (old_value == NULL)
51710542dfSBryan Drewery 		printf("Setting the new value to %d\n", *new_value);
52710542dfSBryan Drewery 	else {
53710542dfSBryan Drewery 		ATF_REQUIRE_MSG(sysctlbyname(VM_MAX_WIRED, NULL, &old_len,
54710542dfSBryan Drewery 		    new_value, new_len) == 0,
55710542dfSBryan Drewery 		    "sysctlbyname(%s) failed: %s", VM_MAX_WIRED, strerror(errno));
56710542dfSBryan Drewery 	}
57710542dfSBryan Drewery 
58710542dfSBryan Drewery 	ATF_REQUIRE_MSG(sysctlbyname(VM_MAX_WIRED, old_value, &old_len,
59710542dfSBryan Drewery 	    new_value, new_len) == 0,
60710542dfSBryan Drewery 	    "sysctlbyname(%s) failed: %s", VM_MAX_WIRED, strerror(errno));
61710542dfSBryan Drewery 
62710542dfSBryan Drewery 	if (old_value != NULL)
63710542dfSBryan Drewery 		printf("Saved the old value (%d)\n", *old_value);
64710542dfSBryan Drewery }
65710542dfSBryan Drewery 
66710542dfSBryan Drewery void
67710542dfSBryan Drewery set_vm_max_wired(int new_value)
68710542dfSBryan Drewery {
69710542dfSBryan Drewery 	FILE *fp;
70710542dfSBryan Drewery 	int old_value;
71710542dfSBryan Drewery 
72710542dfSBryan Drewery 	fp = fopen(VM_MAX_WIRED, "w");
73710542dfSBryan Drewery 	if (fp == NULL) {
74710542dfSBryan Drewery 		atf_tc_skip("could not open %s for writing: %s",
75710542dfSBryan Drewery 		    VM_MAX_WIRED, strerror(errno));
76710542dfSBryan Drewery 		return;
77710542dfSBryan Drewery 	}
78710542dfSBryan Drewery 
79710542dfSBryan Drewery 	vm_max_wired_sysctl(&old_value, NULL);
80710542dfSBryan Drewery 
81710542dfSBryan Drewery 	ATF_REQUIRE_MSG(fprintf(fp, "%d", old_value) > 0,
82710542dfSBryan Drewery 	    "saving %s failed", VM_MAX_WIRED);
83710542dfSBryan Drewery 
84710542dfSBryan Drewery 	fclose(fp);
85710542dfSBryan Drewery 
86710542dfSBryan Drewery 	vm_max_wired_sysctl(NULL, &new_value);
87710542dfSBryan Drewery }
88710542dfSBryan Drewery 
89710542dfSBryan Drewery void
90710542dfSBryan Drewery restore_vm_max_wired(void)
91710542dfSBryan Drewery {
92710542dfSBryan Drewery 	FILE *fp;
93710542dfSBryan Drewery 	int saved_max_wired;
94710542dfSBryan Drewery 
95710542dfSBryan Drewery 	fp = fopen(VM_MAX_WIRED, "r");
96710542dfSBryan Drewery 	if (fp == NULL) {
97710542dfSBryan Drewery 		perror("fopen failed\n");
98710542dfSBryan Drewery 		return;
99710542dfSBryan Drewery 	}
100710542dfSBryan Drewery 
101710542dfSBryan Drewery 	if (fscanf(fp, "%d", &saved_max_wired) != 1) {
102710542dfSBryan Drewery 		perror("fscanf failed\n");
103710542dfSBryan Drewery 		fclose(fp);
104710542dfSBryan Drewery 		return;
105710542dfSBryan Drewery 	}
106710542dfSBryan Drewery 
107710542dfSBryan Drewery 	fclose(fp);
108710542dfSBryan Drewery 	printf("old value in %s: %d\n", VM_MAX_WIRED, saved_max_wired);
109710542dfSBryan Drewery 
110710542dfSBryan Drewery 	if (saved_max_wired == 0) /* This will cripple the test host */
111710542dfSBryan Drewery 		return;
112710542dfSBryan Drewery 
113710542dfSBryan Drewery 	vm_max_wired_sysctl(NULL, &saved_max_wired);
114710542dfSBryan Drewery }
115