xref: /freebsd-src/sys/contrib/openzfs/lib/libzpool/arc_os.c (revision 7a7741af18d6c8a804cc643cb7ecda9d730c6aa6)
1*7a7741afSMartin Matuska /*
2*7a7741afSMartin Matuska  * CDDL HEADER START
3*7a7741afSMartin Matuska  *
4*7a7741afSMartin Matuska  * The contents of this file are subject to the terms of the
5*7a7741afSMartin Matuska  * Common Development and Distribution License (the "License").
6*7a7741afSMartin Matuska  * You may not use this file except in compliance with the License.
7*7a7741afSMartin Matuska  *
8*7a7741afSMartin Matuska  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*7a7741afSMartin Matuska  * or https://opensource.org/licenses/CDDL-1.0.
10*7a7741afSMartin Matuska  * See the License for the specific language governing permissions
11*7a7741afSMartin Matuska  * and limitations under the License.
12*7a7741afSMartin Matuska  *
13*7a7741afSMartin Matuska  * When distributing Covered Code, include this CDDL HEADER in each
14*7a7741afSMartin Matuska  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*7a7741afSMartin Matuska  * If applicable, add the following below this CDDL HEADER, with the
16*7a7741afSMartin Matuska  * fields enclosed by brackets "[]" replaced with your own identifying
17*7a7741afSMartin Matuska  * information: Portions Copyright [yyyy] [name of copyright owner]
18*7a7741afSMartin Matuska  *
19*7a7741afSMartin Matuska  * CDDL HEADER END
20*7a7741afSMartin Matuska  */
21*7a7741afSMartin Matuska /*
22*7a7741afSMartin Matuska  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23*7a7741afSMartin Matuska  * Copyright (c) 2018, Joyent, Inc.
24*7a7741afSMartin Matuska  * Copyright (c) 2011, 2019 by Delphix. All rights reserved.
25*7a7741afSMartin Matuska  * Copyright (c) 2014 by Saso Kiselkov. All rights reserved.
26*7a7741afSMartin Matuska  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
27*7a7741afSMartin Matuska  */
28*7a7741afSMartin Matuska 
29*7a7741afSMartin Matuska #include <sys/zfs_context.h>
30*7a7741afSMartin Matuska #include <sys/arc_impl.h>
31*7a7741afSMartin Matuska 
32*7a7741afSMartin Matuska /*
33*7a7741afSMartin Matuska  * Return a default max arc size based on the amount of physical memory.
34*7a7741afSMartin Matuska  * This may be overridden by tuning the zfs_arc_max module parameter.
35*7a7741afSMartin Matuska  */
36*7a7741afSMartin Matuska uint64_t
37*7a7741afSMartin Matuska arc_default_max(uint64_t min, uint64_t allmem)
38*7a7741afSMartin Matuska {
39*7a7741afSMartin Matuska 	uint64_t size;
40*7a7741afSMartin Matuska 
41*7a7741afSMartin Matuska 	if (allmem >= 1 << 30)
42*7a7741afSMartin Matuska 		size = allmem - (1 << 30);
43*7a7741afSMartin Matuska 	else
44*7a7741afSMartin Matuska 		size = min;
45*7a7741afSMartin Matuska 	return (MAX(allmem * 5 / 8, size));
46*7a7741afSMartin Matuska }
47*7a7741afSMartin Matuska 
48*7a7741afSMartin Matuska int64_t
49*7a7741afSMartin Matuska arc_available_memory(void)
50*7a7741afSMartin Matuska {
51*7a7741afSMartin Matuska 	int64_t lowest = INT64_MAX;
52*7a7741afSMartin Matuska 
53*7a7741afSMartin Matuska 	/* Every 100 calls, free a small amount */
54*7a7741afSMartin Matuska 	if (random_in_range(100) == 0)
55*7a7741afSMartin Matuska 		lowest = -1024;
56*7a7741afSMartin Matuska 
57*7a7741afSMartin Matuska 	return (lowest);
58*7a7741afSMartin Matuska }
59*7a7741afSMartin Matuska 
60*7a7741afSMartin Matuska int
61*7a7741afSMartin Matuska arc_memory_throttle(spa_t *spa, uint64_t reserve, uint64_t txg)
62*7a7741afSMartin Matuska {
63*7a7741afSMartin Matuska 	(void) spa, (void) reserve, (void) txg;
64*7a7741afSMartin Matuska 	return (0);
65*7a7741afSMartin Matuska }
66*7a7741afSMartin Matuska 
67*7a7741afSMartin Matuska uint64_t
68*7a7741afSMartin Matuska arc_all_memory(void)
69*7a7741afSMartin Matuska {
70*7a7741afSMartin Matuska 	return (ptob(physmem) / 2);
71*7a7741afSMartin Matuska }
72*7a7741afSMartin Matuska 
73*7a7741afSMartin Matuska uint64_t
74*7a7741afSMartin Matuska arc_free_memory(void)
75*7a7741afSMartin Matuska {
76*7a7741afSMartin Matuska 	return (random_in_range(arc_all_memory() * 20 / 100));
77*7a7741afSMartin Matuska }
78*7a7741afSMartin Matuska 
79*7a7741afSMartin Matuska void
80*7a7741afSMartin Matuska arc_register_hotplug(void)
81*7a7741afSMartin Matuska {
82*7a7741afSMartin Matuska }
83*7a7741afSMartin Matuska 
84*7a7741afSMartin Matuska void
85*7a7741afSMartin Matuska arc_unregister_hotplug(void)
86*7a7741afSMartin Matuska {
87*7a7741afSMartin Matuska }
88