xref: /freebsd/sys/compat/linuxkpi/common/include/linux/shrinker.h (revision 05dfaadde4ae0f5d823836d5d849e3ba5ebdbf17)
12c95fb75SEmmanuel Vadot /*-
22c95fb75SEmmanuel Vadot  * Copyright (c) 2020 Emmanuel Vadot <manu@FreeBSD.org>
32c95fb75SEmmanuel Vadot  *
42c95fb75SEmmanuel Vadot  * Redistribution and use in source and binary forms, with or without
52c95fb75SEmmanuel Vadot  * modification, are permitted provided that the following conditions
62c95fb75SEmmanuel Vadot  * are met:
72c95fb75SEmmanuel Vadot  * 1. Redistributions of source code must retain the above copyright
82c95fb75SEmmanuel Vadot  *    notice, this list of conditions and the following disclaimer.
92c95fb75SEmmanuel Vadot  * 2. Redistributions in binary form must reproduce the above copyright
102c95fb75SEmmanuel Vadot  *    notice, this list of conditions and the following disclaimer in the
112c95fb75SEmmanuel Vadot  *    documentation and/or other materials provided with the distribution.
122c95fb75SEmmanuel Vadot  *
132c95fb75SEmmanuel Vadot  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
142c95fb75SEmmanuel Vadot  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
152c95fb75SEmmanuel Vadot  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
162c95fb75SEmmanuel Vadot  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
172c95fb75SEmmanuel Vadot  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
182c95fb75SEmmanuel Vadot  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
192c95fb75SEmmanuel Vadot  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
202c95fb75SEmmanuel Vadot  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
212c95fb75SEmmanuel Vadot  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
222c95fb75SEmmanuel Vadot  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
232c95fb75SEmmanuel Vadot  * SUCH DAMAGE.
242c95fb75SEmmanuel Vadot  */
252c95fb75SEmmanuel Vadot 
26307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_SHRINKER_H_
27307f78f3SVladimir Kondratyev #define	_LINUXKPI_LINUX_SHRINKER_H_
282c95fb75SEmmanuel Vadot 
292c95fb75SEmmanuel Vadot #include <sys/queue.h>
30*05dfaaddSJean-Sébastien Pédron 
31*05dfaaddSJean-Sébastien Pédron #include <linux/bitops.h>
323aa335d0SJean-Sébastien Pédron #include <linux/gfp.h>
332c95fb75SEmmanuel Vadot 
342c95fb75SEmmanuel Vadot struct shrink_control {
353aa335d0SJean-Sébastien Pédron 	gfp_t		gfp_mask;
362c95fb75SEmmanuel Vadot 	unsigned long	nr_to_scan;
372c95fb75SEmmanuel Vadot 	unsigned long	nr_scanned;
382c95fb75SEmmanuel Vadot };
392c95fb75SEmmanuel Vadot 
402c95fb75SEmmanuel Vadot struct shrinker {
412c95fb75SEmmanuel Vadot 	unsigned long		(*count_objects)(struct shrinker *, struct shrink_control *);
422c95fb75SEmmanuel Vadot 	unsigned long		(*scan_objects)(struct shrinker *, struct shrink_control *);
432c95fb75SEmmanuel Vadot 	int			seeks;
44*05dfaaddSJean-Sébastien Pédron 	unsigned int		flags;
45f4ffe677SJean-Sébastien Pédron 	void *			private_data;
462c95fb75SEmmanuel Vadot 	long			batch;
472c95fb75SEmmanuel Vadot 	TAILQ_ENTRY(shrinker)	next;
482c95fb75SEmmanuel Vadot };
492c95fb75SEmmanuel Vadot 
502c95fb75SEmmanuel Vadot #define	SHRINK_STOP	(~0UL)
512c95fb75SEmmanuel Vadot 
522c95fb75SEmmanuel Vadot #define	DEFAULT_SEEKS	2
532c95fb75SEmmanuel Vadot 
54*05dfaaddSJean-Sébastien Pédron #define SHRINKER_REGISTERED	BIT(0)
55*05dfaaddSJean-Sébastien Pédron #define SHRINKER_ALLOCATED	BIT(1)
56*05dfaaddSJean-Sébastien Pédron 
57*05dfaaddSJean-Sébastien Pédron struct shrinker *linuxkpi_shrinker_alloc(
58*05dfaaddSJean-Sébastien Pédron     unsigned int flags, const char *fmt, ...);
592c95fb75SEmmanuel Vadot int	linuxkpi_register_shrinker(struct shrinker *s);
602c95fb75SEmmanuel Vadot void	linuxkpi_unregister_shrinker(struct shrinker *s);
61*05dfaaddSJean-Sébastien Pédron void	linuxkpi_shrinker_free(struct shrinker *shrinker);
6283636727SJean-Sébastien Pédron void	linuxkpi_synchronize_shrinkers(void);
632c95fb75SEmmanuel Vadot 
64*05dfaaddSJean-Sébastien Pédron #define	shrinker_alloc(flags, fmt, ...) \
65*05dfaaddSJean-Sébastien Pédron     linuxkpi_shrinker_alloc(flags, fmt __VA_OPT__(,) __VA_ARGS__)
66*05dfaaddSJean-Sébastien Pédron #define	shrinker_register(shrinker) \
67*05dfaaddSJean-Sébastien Pédron     linuxkpi_register_shrinker(shrinker)
68*05dfaaddSJean-Sébastien Pédron #define	shrinker_free(shrinker) \
69*05dfaaddSJean-Sébastien Pédron     linuxkpi_shrinker_free(shrinker)
70*05dfaaddSJean-Sébastien Pédron 
71a39ed121SVladimir Kondratyev #if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 60000
72a39ed121SVladimir Kondratyev #define	register_shrinker(s, ...)	linuxkpi_register_shrinker(s)
73a39ed121SVladimir Kondratyev #else
742c95fb75SEmmanuel Vadot #define	register_shrinker(s)	linuxkpi_register_shrinker(s)
75a39ed121SVladimir Kondratyev #endif
762c95fb75SEmmanuel Vadot #define	unregister_shrinker(s)	linuxkpi_unregister_shrinker(s)
7783636727SJean-Sébastien Pédron #define	synchronize_shrinkers()	linuxkpi_synchronize_shrinkers()
782c95fb75SEmmanuel Vadot 
79307f78f3SVladimir Kondratyev #endif	/* _LINUXKPI_LINUX_SHRINKER_H_ */
80