fs/proc/page.c

Source file repositories/reference/linux-study-clean/fs/proc/page.c

File Facts

System
Linux kernel
Corpus path
fs/proc/page.c
Extension
.c
Size
7344 bytes
Lines
300
Domain
Core OS
Bucket
VFS And Filesystem Core
Inferred role
Core OS: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

if (page) {
			switch (op) {
			case KPAGE_FLAGS:
				info = stable_page_flags(page);
				break;
			case KPAGE_COUNT:
				info = get_kpage_count(page);
				break;
			case KPAGE_CGROUP:
				info = page_cgroup_ino(page);
				break;
			default:
				info = 0;
				break;
			}
		} else
			info = 0;

		if (put_user(info, out)) {
			ret = -EFAULT;
			break;
		}

		pfn++;
		out++;
		count -= KPMSIZE;

		cond_resched();
	}

	*ppos += (char __user *)out - buf;
	if (!ret)
		ret = (char __user *)out - buf;
	return ret;
}

/* /proc/kpagecount - an array exposing page mapcounts
 *
 * Each entry is a u64 representing the corresponding
 * physical page mapcount.
 */
static ssize_t kpagecount_read(struct file *file, char __user *buf,
		size_t count, loff_t *ppos)
{
	return kpage_read(file, buf, count, ppos, KPAGE_COUNT);
}

static const struct proc_ops kpagecount_proc_ops = {
	.proc_flags	= PROC_ENTRY_PERMANENT,
	.proc_lseek	= mem_lseek,
	.proc_read	= kpagecount_read,
};


static inline u64 kpf_copy_bit(u64 kflags, int ubit, int kbit)
{
	return ((kflags >> kbit) & 1) << ubit;
}

u64 stable_page_flags(const struct page *page)
{
	const struct folio *folio;
	struct page_snapshot ps;
	unsigned long k;
	unsigned long mapping;
	bool is_anon;
	u64 u = 0;

	/*
	 * pseudo flag: KPF_NOPAGE
	 * it differentiates a memory hole from a page with no flags
	 */
	if (!page)
		return 1 << KPF_NOPAGE;

	snapshot_page(&ps, page);
	folio = &ps.folio_snapshot;

	k = folio->flags.f;
	mapping = (unsigned long)folio->mapping;
	is_anon = mapping & FOLIO_MAPPING_ANON;

	/*
	 * pseudo flags for the well known (anonymous) memory mapped pages
	 */
	if (folio_mapped(folio))
		u |= 1 << KPF_MMAP;
	if (is_anon) {
		u |= 1 << KPF_ANON;
		if (mapping & FOLIO_MAPPING_KSM)

Annotation

Implementation Notes