Source
x
* kmap_flush_unused - flush all unused kmap mappings in order to remove stray mappings
// SPDX-License-Identifier: GPL-2.0
/*
* High memory handling common code and variables.
*
* (C) 1999 Andrea Arcangeli, SuSE GmbH, andrea@suse.de
* Gerhard Wichert, Siemens AG, Gerhard.Wichert@pdb.siemens.de
*
*
* Redesigned the x86 32-bit VM architecture to deal with
* 64-bit physical space. With current x86 CPUs this
* means up to 64 Gigabytes physical RAM.
*
* Rewrote high memory support to move the page cache into
* high memory. Implemented permanent (schedulable) kmaps
* based on Linus' idea.
*
* Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
*/
DEFINE_PER_CPU(int, __kmap_atomic_idx);
/*
* Virtual_count is not a pure "count".
* 0 means that it is not mapped, and has not been mapped
* since a TLB flush - it is usable.
* 1 means that there are no users, but it has been mapped
* since the last TLB flush - so we can't use it.
* n means that there are (n-1) current users of it.
*/
/*
* Architecture with aliasing data cache may define the following family of
* helper functions in its asm/highmem.h to control cache color of virtual
* addresses where physical memory pages are mapped by kmap.
*/
/*
* Determine color of virtual address where the page should be mapped.
*/
static inline unsigned int get_pkmap_color(struct page *page)
{
return 0;
}
/*
* Get next index for mapping inside PKMAP region for page with given color.
*/
static inline unsigned int get_next_pkmap_nr(unsigned int color)
{
static unsigned int last_pkmap_nr;
last_pkmap_nr = (last_pkmap_nr + 1) & LAST_PKMAP_MASK;
return last_pkmap_nr;
}
/*
* Determine if page index inside PKMAP region (pkmap_nr) of given color
* has wrapped around PKMAP region end. When this happens an attempt to
* flush all unused PKMAP slots is made.
*/
static inline int no_more_pkmaps(unsigned int pkmap_nr, unsigned int color)
{
return pkmap_nr == 0;
}
/*
* Get the number of PKMAP entries of the given color. If no free slot is
* found after checking that many entries, kmap will sleep waiting for
* someone to call kunmap and free PKMAP slot.
*/
static inline int get_pkmap_entries_count(unsigned int color)
{
return LAST_PKMAP;