xref: /freebsd/lib/libc/tests/sys/mlock_helper.c (revision 710542df20ed68759eb8370402305eef8f68ffe5)
1*710542dfSBryan Drewery /*-
2*710542dfSBryan Drewery  * Copyright (C) 2016 Bryan Drewery <bdrewery@FreeBSD.org>
3*710542dfSBryan Drewery  * All rights reserved.
4*710542dfSBryan Drewery  *
5*710542dfSBryan Drewery  * Redistribution and use in source and binary forms, with or without
6*710542dfSBryan Drewery  * modification, are permitted provided that the following conditions
7*710542dfSBryan Drewery  * are met:
8*710542dfSBryan Drewery  * 1. Redistributions of source code must retain the above copyright
9*710542dfSBryan Drewery  *    notice, this list of conditions and the following disclaimer.
10*710542dfSBryan Drewery  * 2. Redistributions in binary form must reproduce the above copyright
11*710542dfSBryan Drewery  *    notice, this list of conditions and the following disclaimer in the
12*710542dfSBryan Drewery  *    documentation and/or other materials provided with the distribution.
13*710542dfSBryan Drewery  *
14*710542dfSBryan Drewery  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*710542dfSBryan Drewery  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*710542dfSBryan Drewery  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*710542dfSBryan Drewery  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*710542dfSBryan Drewery  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*710542dfSBryan Drewery  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*710542dfSBryan Drewery  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*710542dfSBryan Drewery  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*710542dfSBryan Drewery  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*710542dfSBryan Drewery  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*710542dfSBryan Drewery  * SUCH DAMAGE.
25*710542dfSBryan Drewery  */
26*710542dfSBryan Drewery 
27*710542dfSBryan Drewery /*
28*710542dfSBryan Drewery  * Helper for mlock(3) to avoid EAGAIN errors
29*710542dfSBryan Drewery  */
30*710542dfSBryan Drewery 
31*710542dfSBryan Drewery #include <sys/cdefs.h>
32*710542dfSBryan Drewery __FBSDID("$FreeBSD$");
33*710542dfSBryan Drewery 
34*710542dfSBryan Drewery #include <sys/types.h>
35*710542dfSBryan Drewery #include <sys/sysctl.h>
36*710542dfSBryan Drewery 
37*710542dfSBryan Drewery #include <atf-c.h>
38*710542dfSBryan Drewery #include <errno.h>
39*710542dfSBryan Drewery #include <stdio.h>
40*710542dfSBryan Drewery #include <limits.h>
41*710542dfSBryan Drewery 
42*710542dfSBryan Drewery #define	VM_MAX_WIRED "vm.max_wired"
43*710542dfSBryan Drewery 
44*710542dfSBryan Drewery static void
45*710542dfSBryan Drewery vm_max_wired_sysctl(int *old_value, int *new_value)
46*710542dfSBryan Drewery {
47*710542dfSBryan Drewery 	size_t old_len;
48*710542dfSBryan Drewery 	size_t new_len = (new_value == NULL ? 0 : sizeof(int));
49*710542dfSBryan Drewery 
50*710542dfSBryan Drewery 	if (old_value == NULL)
51*710542dfSBryan Drewery 		printf("Setting the new value to %d\n", *new_value);
52*710542dfSBryan Drewery 	else {
53*710542dfSBryan Drewery 		ATF_REQUIRE_MSG(sysctlbyname(VM_MAX_WIRED, NULL, &old_len,
54*710542dfSBryan Drewery 		    new_value, new_len) == 0,
55*710542dfSBryan Drewery 		    "sysctlbyname(%s) failed: %s", VM_MAX_WIRED, strerror(errno));
56*710542dfSBryan Drewery 	}
57*710542dfSBryan Drewery 
58*710542dfSBryan Drewery 	ATF_REQUIRE_MSG(sysctlbyname(VM_MAX_WIRED, old_value, &old_len,
59*710542dfSBryan Drewery 	    new_value, new_len) == 0,
60*710542dfSBryan Drewery 	    "sysctlbyname(%s) failed: %s", VM_MAX_WIRED, strerror(errno));
61*710542dfSBryan Drewery 
62*710542dfSBryan Drewery 	if (old_value != NULL)
63*710542dfSBryan Drewery 		printf("Saved the old value (%d)\n", *old_value);
64*710542dfSBryan Drewery }
65*710542dfSBryan Drewery 
66*710542dfSBryan Drewery void
67*710542dfSBryan Drewery set_vm_max_wired(int new_value)
68*710542dfSBryan Drewery {
69*710542dfSBryan Drewery 	FILE *fp;
70*710542dfSBryan Drewery 	int old_value;
71*710542dfSBryan Drewery 
72*710542dfSBryan Drewery 	fp = fopen(VM_MAX_WIRED, "w");
73*710542dfSBryan Drewery 	if (fp == NULL) {
74*710542dfSBryan Drewery 		atf_tc_skip("could not open %s for writing: %s",
75*710542dfSBryan Drewery 		    VM_MAX_WIRED, strerror(errno));
76*710542dfSBryan Drewery 		return;
77*710542dfSBryan Drewery 	}
78*710542dfSBryan Drewery 
79*710542dfSBryan Drewery 	vm_max_wired_sysctl(&old_value, NULL);
80*710542dfSBryan Drewery 
81*710542dfSBryan Drewery 	ATF_REQUIRE_MSG(fprintf(fp, "%d", old_value) > 0,
82*710542dfSBryan Drewery 	    "saving %s failed", VM_MAX_WIRED);
83*710542dfSBryan Drewery 
84*710542dfSBryan Drewery 	fclose(fp);
85*710542dfSBryan Drewery 
86*710542dfSBryan Drewery 	vm_max_wired_sysctl(NULL, &new_value);
87*710542dfSBryan Drewery }
88*710542dfSBryan Drewery 
89*710542dfSBryan Drewery void
90*710542dfSBryan Drewery restore_vm_max_wired(void)
91*710542dfSBryan Drewery {
92*710542dfSBryan Drewery 	FILE *fp;
93*710542dfSBryan Drewery 	int saved_max_wired;
94*710542dfSBryan Drewery 
95*710542dfSBryan Drewery 	fp = fopen(VM_MAX_WIRED, "r");
96*710542dfSBryan Drewery 	if (fp == NULL) {
97*710542dfSBryan Drewery 		perror("fopen failed\n");
98*710542dfSBryan Drewery 		return;
99*710542dfSBryan Drewery 	}
100*710542dfSBryan Drewery 
101*710542dfSBryan Drewery 	if (fscanf(fp, "%d", &saved_max_wired) != 1) {
102*710542dfSBryan Drewery 		perror("fscanf failed\n");
103*710542dfSBryan Drewery 		fclose(fp);
104*710542dfSBryan Drewery 		return;
105*710542dfSBryan Drewery 	}
106*710542dfSBryan Drewery 
107*710542dfSBryan Drewery 	fclose(fp);
108*710542dfSBryan Drewery 	printf("old value in %s: %d\n", VM_MAX_WIRED, saved_max_wired);
109*710542dfSBryan Drewery 
110*710542dfSBryan Drewery 	if (saved_max_wired == 0) /* This will cripple the test host */
111*710542dfSBryan Drewery 		return;
112*710542dfSBryan Drewery 
113*710542dfSBryan Drewery 	vm_max_wired_sysctl(NULL, &saved_max_wired);
114*710542dfSBryan Drewery }
115