1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef DEFERRED_FREE_HELPER_H 4*4882a593Smuzhiyun #define DEFERRED_FREE_HELPER_H 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun /** 7*4882a593Smuzhiyun * df_reason - enum for reason why item was freed 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This provides a reason for why the free function was called 10*4882a593Smuzhiyun * on the item. This is useful when deferred_free is used in 11*4882a593Smuzhiyun * combination with a pagepool, so under pressure the page can 12*4882a593Smuzhiyun * be immediately freed. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * DF_NORMAL: Normal deferred free 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * DF_UNDER_PRESSURE: Free was called because the system 17*4882a593Smuzhiyun * is under memory pressure. Usually 18*4882a593Smuzhiyun * from a shrinker. Avoid allocating 19*4882a593Smuzhiyun * memory in the free call, as it may 20*4882a593Smuzhiyun * fail. 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun enum df_reason { 23*4882a593Smuzhiyun DF_NORMAL, 24*4882a593Smuzhiyun DF_UNDER_PRESSURE, 25*4882a593Smuzhiyun }; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /** 28*4882a593Smuzhiyun * deferred_freelist_item - item structure for deferred freelist 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun * This is to be added to the structure for whatever you want to 31*4882a593Smuzhiyun * defer freeing on. 32*4882a593Smuzhiyun * 33*4882a593Smuzhiyun * @nr_pages: number of pages used by item to be freed 34*4882a593Smuzhiyun * @free: function pointer to be called when freeing the item 35*4882a593Smuzhiyun * @list: list entry for the deferred list 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun struct deferred_freelist_item { 38*4882a593Smuzhiyun size_t nr_pages; 39*4882a593Smuzhiyun void (*free)(struct deferred_freelist_item *i, 40*4882a593Smuzhiyun enum df_reason reason); 41*4882a593Smuzhiyun struct list_head list; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /** 45*4882a593Smuzhiyun * deferred_free - call to add item to the deferred free list 46*4882a593Smuzhiyun * 47*4882a593Smuzhiyun * @item: Pointer to deferred_freelist_item field of a structure 48*4882a593Smuzhiyun * @free: Function pointer to the free call 49*4882a593Smuzhiyun * @nr_pages: number of pages to be freed 50*4882a593Smuzhiyun */ 51*4882a593Smuzhiyun void deferred_free(struct deferred_freelist_item *item, 52*4882a593Smuzhiyun void (*free)(struct deferred_freelist_item *i, 53*4882a593Smuzhiyun enum df_reason reason), 54*4882a593Smuzhiyun size_t nr_pages); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun unsigned long get_freelist_nr_pages(void); 57*4882a593Smuzhiyun #endif 58