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> 303aa335d0SJean-Sébastien Pédron #include <linux/gfp.h> 312c95fb75SEmmanuel Vadot 322c95fb75SEmmanuel Vadot struct shrink_control { 333aa335d0SJean-Sébastien Pédron gfp_t gfp_mask; 342c95fb75SEmmanuel Vadot unsigned long nr_to_scan; 352c95fb75SEmmanuel Vadot unsigned long nr_scanned; 362c95fb75SEmmanuel Vadot }; 372c95fb75SEmmanuel Vadot 382c95fb75SEmmanuel Vadot struct shrinker { 392c95fb75SEmmanuel Vadot unsigned long (*count_objects)(struct shrinker *, struct shrink_control *); 402c95fb75SEmmanuel Vadot unsigned long (*scan_objects)(struct shrinker *, struct shrink_control *); 412c95fb75SEmmanuel Vadot int seeks; 422c95fb75SEmmanuel Vadot long batch; 432c95fb75SEmmanuel Vadot TAILQ_ENTRY(shrinker) next; 442c95fb75SEmmanuel Vadot }; 452c95fb75SEmmanuel Vadot 462c95fb75SEmmanuel Vadot #define SHRINK_STOP (~0UL) 472c95fb75SEmmanuel Vadot 482c95fb75SEmmanuel Vadot #define DEFAULT_SEEKS 2 492c95fb75SEmmanuel Vadot 502c95fb75SEmmanuel Vadot int linuxkpi_register_shrinker(struct shrinker *s); 512c95fb75SEmmanuel Vadot void linuxkpi_unregister_shrinker(struct shrinker *s); 5283636727SJean-Sébastien Pédron void linuxkpi_synchronize_shrinkers(void); 532c95fb75SEmmanuel Vadot 54*a39ed121SVladimir Kondratyev #if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 60000 55*a39ed121SVladimir Kondratyev #define register_shrinker(s, ...) linuxkpi_register_shrinker(s) 56*a39ed121SVladimir Kondratyev #else 572c95fb75SEmmanuel Vadot #define register_shrinker(s) linuxkpi_register_shrinker(s) 58*a39ed121SVladimir Kondratyev #endif 592c95fb75SEmmanuel Vadot #define unregister_shrinker(s) linuxkpi_unregister_shrinker(s) 6083636727SJean-Sébastien Pédron #define synchronize_shrinkers() linuxkpi_synchronize_shrinkers() 612c95fb75SEmmanuel Vadot 62307f78f3SVladimir Kondratyev #endif /* _LINUXKPI_LINUX_SHRINKER_H_ */ 63