/* SPDX-License-Identifier: GPL-2.0 */ #ifndef DEFERRED_FREE_HELPER_H #define DEFERRED_FREE_HELPER_H /** * df_reason - enum for reason why item was freed * * This provides a reason for why the free function was called * on the item. This is useful when deferred_free is used in * combination with a pagepool, so under pressure the page can * be immediately freed. * * DF_NORMAL: Normal deferred free * * DF_UNDER_PRESSURE: Free was called because the system * is under memory pressure. Usually * from a shrinker. Avoid allocating * memory in the free call, as it may * fail. */ enum df_reason { DF_NORMAL, DF_UNDER_PRESSURE, }; /** * deferred_freelist_item - item structure for deferred freelist * * This is to be added to the structure for whatever you want to * defer freeing on. * * @nr_pages: number of pages used by item to be freed * @free: function pointer to be called when freeing the item * @list: list entry for the deferred list */ struct deferred_freelist_item { size_t nr_pages; void (*free)(struct deferred_freelist_item *i, enum df_reason reason); struct list_head list; }; /** * deferred_free - call to add item to the deferred free list * * @item: Pointer to deferred_freelist_item field of a structure * @free: Function pointer to the free call * @nr_pages: number of pages to be freed */ void deferred_free(struct deferred_freelist_item *item, void (*free)(struct deferred_freelist_item *i, enum df_reason reason), size_t nr_pages); unsigned long get_freelist_nr_pages(void); #endif