/* * Ideally we would want to use the trace_<tracepoint>_enabled() helper * functions. But due to include header file issues, that is not * feasible. Instead we have to open code the static key functions. * * See trace_##name##_enabled(void) in include/linux/tracepoint.h
*/ #define page_ref_tracepoint_active(t) tracepoint_enabled(t)
externvoid __page_ref_set(struct page *page, int v); externvoid __page_ref_mod(struct page *page, int v); externvoid __page_ref_mod_and_test(struct page *page, int v, int ret); externvoid __page_ref_mod_and_return(struct page *page, int v, int ret); externvoid __page_ref_mod_unless(struct page *page, int v, int u); externvoid __page_ref_freeze(struct page *page, int v, int ret); externvoid __page_ref_unfreeze(struct page *page, int v);
#else
#define page_ref_tracepoint_active(t) false
staticinlinevoid __page_ref_set(struct page *page, int v)
{
} staticinlinevoid __page_ref_mod(struct page *page, int v)
{
} staticinlinevoid __page_ref_mod_and_test(struct page *page, int v, int ret)
{
} staticinlinevoid __page_ref_mod_and_return(struct page *page, int v, int ret)
{
} staticinlinevoid __page_ref_mod_unless(struct page *page, int v, int u)
{
} staticinlinevoid __page_ref_freeze(struct page *page, int v, int ret)
{
} staticinlinevoid __page_ref_unfreeze(struct page *page, int v)
{
}
/** * folio_ref_count - The reference count on this folio. * @folio: The folio. * * The refcount is usually incremented by calls to folio_get() and * decremented by calls to folio_put(). Some typical users of the * folio refcount: * * - Each reference from a page table * - The page cache * - Filesystem private data * - The LRU list * - Pipes * - Direct IO which references this page in the process address space * * Return: The number of references to this folio.
*/ staticinlineint folio_ref_count(conststruct folio *folio)
{ return page_ref_count(&folio->page);
}
staticinlinevoid set_page_count(struct page *page, int v)
{
atomic_set(&page->_refcount, v); if (page_ref_tracepoint_active(page_ref_set))
__page_ref_set(page, v);
}
staticinlinevoid folio_set_count(struct folio *folio, int v)
{
set_page_count(&folio->page, v);
}
/* * Setup the page count before being freed into the page allocator for * the first time (boot or memory hotplug)
*/ staticinlinevoid init_page_count(struct page *page)
{
set_page_count(page, 1);
}
staticinlinevoid page_ref_add(struct page *page, int nr)
{
atomic_add(nr, &page->_refcount); if (page_ref_tracepoint_active(page_ref_mod))
__page_ref_mod(page, nr);
}
staticinlinevoid folio_ref_add(struct folio *folio, int nr)
{
page_ref_add(&folio->page, nr);
}
staticinlinevoid page_ref_sub(struct page *page, int nr)
{
atomic_sub(nr, &page->_refcount); if (page_ref_tracepoint_active(page_ref_mod))
__page_ref_mod(page, -nr);
}
staticinlinevoid folio_ref_sub(struct folio *folio, int nr)
{
page_ref_sub(&folio->page, nr);
}
staticinlineint folio_ref_sub_return(struct folio *folio, int nr)
{ int ret = atomic_sub_return(nr, &folio->_refcount);
if (page_ref_tracepoint_active(page_ref_mod_and_return))
__page_ref_mod_and_return(&folio->page, -nr, ret); return ret;
}
staticinlinebool page_ref_add_unless(struct page *page, int nr, int u)
{ bool ret = false;
rcu_read_lock(); /* avoid writing to the vmemmap area being remapped */ if (page_count_writable(page, u))
ret = atomic_add_unless(&page->_refcount, nr, u);
rcu_read_unlock();
if (page_ref_tracepoint_active(page_ref_mod_unless))
__page_ref_mod_unless(page, nr, ret); return ret;
}
staticinlinebool folio_ref_add_unless(struct folio *folio, int nr, int u)
{ return page_ref_add_unless(&folio->page, nr, u);
}
/** * folio_try_get - Attempt to increase the refcount on a folio. * @folio: The folio. * * If you do not already have a reference to a folio, you can attempt to * get one using this function. It may fail if, for example, the folio * has been freed since you found a pointer to it, or it is frozen for * the purposes of splitting or migration. * * Return: True if the reference count was successfully incremented.
*/ staticinlinebool folio_try_get(struct folio *folio)
{ return folio_ref_add_unless(folio, 1, 0);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.