57 lines
1.6 KiB
C
Executable file
57 lines
1.6 KiB
C
Executable file
/* 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
|