mm/list_lru.c

Source file repositories/reference/linux-study-clean/mm/list_lru.c

File Facts

System
Linux kernel
Corpus path
mm/list_lru.c
Extension
.c
Size
16619 bytes
Lines
709
Domain
Core OS
Bucket
Memory Management
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 (likely(READ_ONCE(l->nr_items) != LONG_MIN)) {
			rcu_read_unlock();
			return l;
		}
		unlock_list_lru(l, irq, irq_flags);
	}
	/*
	 * Caller may simply bail out if raced with reparenting or
	 * may iterate through the list_lru and expect empty slots.
	 */
	if (skip_empty) {
		rcu_read_unlock();
		return NULL;
	}
	VM_WARN_ON(!css_is_dying(&(*memcg)->css));
	*memcg = parent_mem_cgroup(*memcg);
	goto again;
}
#else
static void list_lru_register(struct list_lru *lru)
{
}

static void list_lru_unregister(struct list_lru *lru)
{
}

static int lru_shrinker_id(struct list_lru *lru)
{
	return -1;
}

static inline bool list_lru_memcg_aware(struct list_lru *lru)
{
	return false;
}

static inline struct list_lru_one *
list_lru_from_memcg_idx(struct list_lru *lru, int nid, int idx)
{
	return &lru->node[nid].lru;
}

static inline struct list_lru_one *
lock_list_lru_of_memcg(struct list_lru *lru, int nid,
		       struct mem_cgroup **memcg, bool irq,
		       unsigned long *irq_flags, bool skip_empty)
{
	struct list_lru_one *l = &lru->node[nid].lru;

	lock_list_lru(l, irq, irq_flags);

	return l;
}
#endif /* CONFIG_MEMCG */

struct list_lru_one *list_lru_lock(struct list_lru *lru, int nid,
				   struct mem_cgroup **memcg)
{
	return lock_list_lru_of_memcg(lru, nid, memcg, /*irq=*/false,
				      /*irq_flags=*/NULL, /*skip_empty=*/false);
}

void list_lru_unlock(struct list_lru_one *l)
{
	unlock_list_lru(l, /*irq_off=*/false, /*irq_flags=*/NULL);
}

struct list_lru_one *list_lru_lock_irq(struct list_lru *lru, int nid,
				       struct mem_cgroup **memcg)
{
	return lock_list_lru_of_memcg(lru, nid, memcg, /*irq=*/true,
				      /*irq_flags=*/NULL, /*skip_empty=*/false);
}

void list_lru_unlock_irq(struct list_lru_one *l)
{
	unlock_list_lru(l, /*irq_off=*/true, /*irq_flags=*/NULL);
}

struct list_lru_one *list_lru_lock_irqsave(struct list_lru *lru, int nid,
					   struct mem_cgroup **memcg,
					   unsigned long *flags)
{
	return lock_list_lru_of_memcg(lru, nid, memcg, /*irq=*/true,
				      /*irq_flags=*/flags, /*skip_empty=*/false);
}

void list_lru_unlock_irqrestore(struct list_lru_one *l, unsigned long *flags)
{

Annotation

Implementation Notes