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