Bug
        
                          [В начало]
Ошибка # 174
Показать/спрятать трассу ошибок|            Error trace     
         {    20     typedef unsigned char __u8;    23     typedef unsigned short __u16;    26     typedef unsigned int __u32;    30     typedef unsigned long long __u64;    15     typedef signed char s8;    16     typedef unsigned char u8;    18     typedef short s16;    19     typedef unsigned short u16;    21     typedef int s32;    22     typedef unsigned int u32;    25     typedef unsigned long long u64;    14     typedef long __kernel_long_t;    15     typedef unsigned long __kernel_ulong_t;    71     typedef __kernel_ulong_t __kernel_size_t;    72     typedef __kernel_long_t __kernel_ssize_t;    87     typedef long long __kernel_loff_t;   291     struct kernel_symbol {   unsigned long value;   const char *name; } ;    34     struct module ;    18     typedef unsigned short umode_t;    29     typedef _Bool bool;    45     typedef __kernel_loff_t loff_t;    54     typedef __kernel_size_t size_t;    59     typedef __kernel_ssize_t ssize_t;   157     typedef unsigned int gfp_t;   176     struct __anonstruct_atomic_t_6 {   int counter; } ;   176     typedef struct __anonstruct_atomic_t_6 atomic_t;   181     struct __anonstruct_atomic64_t_7 {   long counter; } ;   181     typedef struct __anonstruct_atomic64_t_7 atomic64_t;   182     struct list_head {   struct list_head *next;   struct list_head *prev; } ;   187     struct hlist_node ;   191     struct hlist_node {   struct hlist_node *next;   struct hlist_node **pprev; } ;   202     struct callback_head {   struct callback_head *next;   void (*func)(struct callback_head *); } ;   115     typedef void (*ctor_fn_t)();   486     struct completion ;    27     union __anonunion___u_9 {   struct list_head *__val;   char __c[1U]; } ;    65     union __anonunion___u_11 {   struct list_head *__val;   char __c[1U]; } ;   105     union __anonunion___u_13 {   struct list_head *__val;   char __c[1U]; } ;   202     union __anonunion___u_15 {   struct list_head *__val;   char __c[1U]; } ;   546     struct bug_entry {   int bug_addr_disp;   int file_disp;   unsigned short line;   unsigned short flags; } ;    50     struct task_struct ;    39     struct page ;    26     struct mm_struct ;    13     typedef unsigned long pteval_t;    14     typedef unsigned long pmdval_t;    15     typedef unsigned long pudval_t;    16     typedef unsigned long pgdval_t;    17     typedef unsigned long pgprotval_t;    19     struct __anonstruct_pte_t_34 {   pteval_t pte; } ;    19     typedef struct __anonstruct_pte_t_34 pte_t;    21     struct pgprot {   pgprotval_t pgprot; } ;   256     typedef struct pgprot pgprot_t;   258     struct __anonstruct_pgd_t_35 {   pgdval_t pgd; } ;   258     typedef struct __anonstruct_pgd_t_35 pgd_t;   276     struct __anonstruct_pud_t_36 {   pudval_t pud; } ;   276     typedef struct __anonstruct_pud_t_36 pud_t;   297     struct __anonstruct_pmd_t_37 {   pmdval_t pmd; } ;   297     typedef struct __anonstruct_pmd_t_37 pmd_t;   423     typedef struct page *pgtable_t;   434     struct file ;   445     struct seq_file ;   483     struct cpumask ;    20     struct qspinlock {   atomic_t val; } ;    33     typedef struct qspinlock arch_spinlock_t;    83     struct static_key {   atomic_t enabled; } ;    38     union __anonunion___u_44 {   int __val;   char __c[1U]; } ;    21     union __anonunion___u_46 {   long __val;   char __c[1U]; } ;    33     union __anonunion___u_48 {   long __val;   char __c[1U]; } ;    23     typedef atomic64_t atomic_long_t;   359     struct cpumask {   unsigned long bits[128U]; } ;   657     typedef struct cpumask *cpumask_var_t;    22     struct tracepoint_func {   void *func;   void *data;   int prio; } ;    28     struct tracepoint {   const char *name;   struct static_key key;   int (*regfunc)();   void (*unregfunc)();   struct tracepoint_func *funcs; } ;    33     struct lockdep_map ;    55     struct stack_trace {   unsigned int nr_entries;   unsigned int max_entries;   unsigned long *entries;   int skip; } ;    28     struct lockdep_subclass_key {   char __one_byte; } ;    53     struct lock_class_key {   struct lockdep_subclass_key subkeys[8U]; } ;    59     struct lock_class {   struct hlist_node hash_entry;   struct list_head lock_entry;   struct lockdep_subclass_key *key;   unsigned int subclass;   unsigned int dep_gen_id;   unsigned long usage_mask;   struct stack_trace usage_traces[13U];   struct list_head locks_after;   struct list_head locks_before;   unsigned int version;   unsigned long ops;   const char *name;   int name_version;   unsigned long contention_point[4U];   unsigned long contending_point[4U]; } ;   144     struct lockdep_map {   struct lock_class_key *key;   struct lock_class *class_cache[2U];   const char *name;   int cpu;   unsigned long ip; } ;   593     struct raw_spinlock {   arch_spinlock_t raw_lock;   unsigned int magic;   unsigned int owner_cpu;   void *owner;   struct lockdep_map dep_map; } ;    32     typedef struct raw_spinlock raw_spinlock_t;    33     struct __anonstruct____missing_field_name_77 {   u8 __padding[24U];   struct lockdep_map dep_map; } ;    33     union __anonunion____missing_field_name_76 {   struct raw_spinlock rlock;   struct __anonstruct____missing_field_name_77 __annonCompField19; } ;    33     struct spinlock {   union __anonunion____missing_field_name_76 __annonCompField20; } ;    76     typedef struct spinlock spinlock_t;    70     struct vm_area_struct ;    39     struct __wait_queue_head {   spinlock_t lock;   struct list_head task_list; } ;    44     typedef struct __wait_queue_head wait_queue_head_t;    13     struct optimistic_spin_queue {   atomic_t tail; } ;    40     struct mutex {   atomic_long_t owner;   spinlock_t wait_lock;   struct optimistic_spin_queue osq;   struct list_head wait_list;   void *magic;   struct lockdep_map dep_map; } ;   229     struct rw_semaphore ;   230     struct rw_semaphore {   atomic_long_t count;   struct list_head wait_list;   raw_spinlock_t wait_lock;   struct optimistic_spin_queue osq;   struct task_struct *owner;   struct lockdep_map dep_map; } ;  1109     struct timer_list {   struct hlist_node entry;   unsigned long expires;   void (*function)(unsigned long);   unsigned long data;   u32 flags;   struct lockdep_map lockdep_map; } ;   235     struct workqueue_struct ;   236     struct work_struct ;    54     struct work_struct {   atomic_long_t data;   struct list_head entry;   void (*func)(struct work_struct *);   struct lockdep_map lockdep_map; } ;   107     struct delayed_work {   struct work_struct work;   struct timer_list timer;   struct workqueue_struct *wq;   int cpu; } ;    38     struct ldt_struct ;    38     struct vdso_image ;    38     struct __anonstruct_mm_context_t_159 {   struct ldt_struct *ldt;   unsigned short ia32_compat;   struct mutex lock;   void *vdso;   const struct vdso_image *vdso_image;   atomic_t perf_rdpmc_allowed;   u16 pkey_allocation_map;   s16 execute_only_pkey;   void *bd_addr; } ;    38     typedef struct __anonstruct_mm_context_t_159 mm_context_t;   551     struct rb_node {   unsigned long __rb_parent_color;   struct rb_node *rb_right;   struct rb_node *rb_left; } ;    41     struct rb_root {   struct rb_node *rb_node; } ;    49     struct mm_rss_stat {   atomic_long_t count[4U]; } ;    85     struct completion {   unsigned int done;   wait_queue_head_t wait; } ;   111     struct xol_area ;   112     struct uprobes_state {   struct xol_area *xol_area; } ;   151     struct address_space ;   152     struct mem_cgroup ;   153     union __anonunion____missing_field_name_212 {   struct address_space *mapping;   void *s_mem;   atomic_t compound_mapcount; } ;   153     union __anonunion____missing_field_name_213 {   unsigned long index;   void *freelist; } ;   153     struct __anonstruct____missing_field_name_217 {   unsigned short inuse;   unsigned short objects;   unsigned char frozen; } ;   153     union __anonunion____missing_field_name_216 {   atomic_t _mapcount;   unsigned int active;   struct __anonstruct____missing_field_name_217 __annonCompField38;   int units; } ;   153     struct __anonstruct____missing_field_name_215 {   union __anonunion____missing_field_name_216 __annonCompField39;   atomic_t _refcount; } ;   153     union __anonunion____missing_field_name_214 {   unsigned long counters;   struct __anonstruct____missing_field_name_215 __annonCompField40; } ;   153     struct dev_pagemap ;   153     struct __anonstruct____missing_field_name_219 {   struct page *next;   int pages;   int pobjects; } ;   153     struct __anonstruct____missing_field_name_220 {   unsigned long compound_head;   unsigned int compound_dtor;   unsigned int compound_order; } ;   153     struct __anonstruct____missing_field_name_221 {   unsigned long __pad;   pgtable_t pmd_huge_pte; } ;   153     union __anonunion____missing_field_name_218 {   struct list_head lru;   struct dev_pagemap *pgmap;   struct __anonstruct____missing_field_name_219 __annonCompField42;   struct callback_head callback_head;   struct __anonstruct____missing_field_name_220 __annonCompField43;   struct __anonstruct____missing_field_name_221 __annonCompField44; } ;   153     struct kmem_cache ;   153     union __anonunion____missing_field_name_222 {   unsigned long private;   spinlock_t *ptl;   struct kmem_cache *slab_cache; } ;   153     struct page {   unsigned long flags;   union __anonunion____missing_field_name_212 __annonCompField36;   union __anonunion____missing_field_name_213 __annonCompField37;   union __anonunion____missing_field_name_214 __annonCompField41;   union __anonunion____missing_field_name_218 __annonCompField45;   union __anonunion____missing_field_name_222 __annonCompField46;   struct mem_cgroup *mem_cgroup; } ;   266     struct userfaultfd_ctx ;   266     struct vm_userfaultfd_ctx {   struct userfaultfd_ctx *ctx; } ;   273     struct __anonstruct_shared_223 {   struct rb_node rb;   unsigned long rb_subtree_last; } ;   273     struct anon_vma ;   273     struct vm_operations_struct ;   273     struct mempolicy ;   273     struct vm_area_struct {   unsigned long vm_start;   unsigned long vm_end;   struct vm_area_struct *vm_next;   struct vm_area_struct *vm_prev;   struct rb_node vm_rb;   unsigned long rb_subtree_gap;   struct mm_struct *vm_mm;   pgprot_t vm_page_prot;   unsigned long vm_flags;   struct __anonstruct_shared_223 shared;   struct list_head anon_vma_chain;   struct anon_vma *anon_vma;   const struct vm_operations_struct *vm_ops;   unsigned long vm_pgoff;   struct file *vm_file;   void *vm_private_data;   struct mempolicy *vm_policy;   struct vm_userfaultfd_ctx vm_userfaultfd_ctx; } ;   346     struct core_thread {   struct task_struct *task;   struct core_thread *next; } ;   351     struct core_state {   atomic_t nr_threads;   struct core_thread dumper;   struct completion startup; } ;   357     struct kioctx_table ;   358     struct linux_binfmt ;   358     struct user_namespace ;   358     struct mmu_notifier_mm ;   358     struct mm_struct {   struct vm_area_struct *mmap;   struct rb_root mm_rb;   u32 vmacache_seqnum;   unsigned long int (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);   unsigned long mmap_base;   unsigned long mmap_legacy_base;   unsigned long task_size;   unsigned long highest_vm_end;   pgd_t *pgd;   atomic_t mm_users;   atomic_t mm_count;   atomic_long_t nr_ptes;   atomic_long_t nr_pmds;   int map_count;   spinlock_t page_table_lock;   struct rw_semaphore mmap_sem;   struct list_head mmlist;   unsigned long hiwater_rss;   unsigned long hiwater_vm;   unsigned long total_vm;   unsigned long locked_vm;   unsigned long pinned_vm;   unsigned long data_vm;   unsigned long exec_vm;   unsigned long stack_vm;   unsigned long def_flags;   unsigned long start_code;   unsigned long end_code;   unsigned long start_data;   unsigned long end_data;   unsigned long start_brk;   unsigned long brk;   unsigned long start_stack;   unsigned long arg_start;   unsigned long arg_end;   unsigned long env_start;   unsigned long env_end;   unsigned long saved_auxv[46U];   struct mm_rss_stat rss_stat;   struct linux_binfmt *binfmt;   cpumask_var_t cpu_vm_mask_var;   mm_context_t context;   unsigned long flags;   struct core_state *core_state;   spinlock_t ioctx_lock;   struct kioctx_table *ioctx_table;   struct task_struct *owner;   struct user_namespace *user_ns;   struct file *exe_file;   struct mmu_notifier_mm *mmu_notifier_mm;   struct cpumask cpumask_allocation;   unsigned long numa_next_scan;   unsigned long numa_scan_offset;   int numa_scan_seq;   bool tlb_flush_pending;   struct uprobes_state uprobes_state;   atomic_long_t hugetlb_usage;   struct work_struct async_put_work; } ;   544     struct vm_fault ;   277     struct vm_fault {   struct vm_area_struct *vma;   unsigned int flags;   gfp_t gfp_mask;   unsigned long pgoff;   unsigned long address;   pmd_t *pmd;   pud_t *pud;   pte_t orig_pte;   struct page *cow_page;   struct mem_cgroup *memcg;   struct page *page;   pte_t *pte;   spinlock_t *ptl;   pgtable_t prealloc_pte; } ;   340     enum page_entry_size {   PE_SIZE_PTE = 0,   PE_SIZE_PMD = 1,   PE_SIZE_PUD = 2 } ;   346     struct vm_operations_struct {   void (*open)(struct vm_area_struct *);   void (*close)(struct vm_area_struct *);   int (*mremap)(struct vm_area_struct *);   int (*fault)(struct vm_fault *);   int (*huge_fault)(struct vm_fault *, enum page_entry_size );   void (*map_pages)(struct vm_fault *, unsigned long, unsigned long);   int (*page_mkwrite)(struct vm_fault *);   int (*pfn_mkwrite)(struct vm_fault *);   int (*access)(struct vm_area_struct *, unsigned long, void *, int, int);   const char * (*name)(struct vm_area_struct *);   int (*set_policy)(struct vm_area_struct *, struct mempolicy *);   struct mempolicy * (*get_policy)(struct vm_area_struct *, unsigned long);   struct page * (*find_special_page)(struct vm_area_struct *, unsigned long); } ;    59     struct kobject ;    19     struct vdso_image {   void *data;   unsigned long size;   unsigned long alt;   unsigned long alt_len;   long sym_vvar_start;   long sym_vvar_page;   long sym_hpet_page;   long sym_pvclock_page;   long sym_VDSO32_NOTE_MASK;   long sym___kernel_sigreturn;   long sym___kernel_rt_sigreturn;   long sym___kernel_vsyscall;   long sym_int80_landing_pad; } ;    15     typedef __u64 Elf64_Addr;    16     typedef __u16 Elf64_Half;    18     typedef __u64 Elf64_Off;    20     typedef __u32 Elf64_Word;    21     typedef __u64 Elf64_Xword;   190     struct elf64_sym {   Elf64_Word st_name;   unsigned char st_info;   unsigned char st_other;   Elf64_Half st_shndx;   Elf64_Addr st_value;   Elf64_Xword st_size; } ;   198     typedef struct elf64_sym Elf64_Sym;   219     struct elf64_hdr {   unsigned char e_ident[16U];   Elf64_Half e_type;   Elf64_Half e_machine;   Elf64_Word e_version;   Elf64_Addr e_entry;   Elf64_Off e_phoff;   Elf64_Off e_shoff;   Elf64_Word e_flags;   Elf64_Half e_ehsize;   Elf64_Half e_phentsize;   Elf64_Half e_phnum;   Elf64_Half e_shentsize;   Elf64_Half e_shnum;   Elf64_Half e_shstrndx; } ;   235     typedef struct elf64_hdr Elf64_Ehdr;   314     struct elf64_shdr {   Elf64_Word sh_name;   Elf64_Word sh_type;   Elf64_Xword sh_flags;   Elf64_Addr sh_addr;   Elf64_Off sh_offset;   Elf64_Xword sh_size;   Elf64_Word sh_link;   Elf64_Word sh_info;   Elf64_Xword sh_addralign;   Elf64_Xword sh_entsize; } ;   326     typedef struct elf64_shdr Elf64_Shdr;    65     struct radix_tree_root ;    65     union __anonunion____missing_field_name_251 {   struct list_head private_list;   struct callback_head callback_head; } ;    65     struct radix_tree_node {   unsigned char shift;   unsigned char offset;   unsigned char count;   unsigned char exceptional;   struct radix_tree_node *parent;   struct radix_tree_root *root;   union __anonunion____missing_field_name_251 __annonCompField49;   void *slots[64U];   unsigned long tags[3U][1U]; } ;   107     struct radix_tree_root {   gfp_t gfp_mask;   struct radix_tree_node *rnode; } ;   176     struct ida {   struct radix_tree_root ida_rt; } ;   220     struct kernfs_open_node ;   221     struct kernfs_iattrs ;   245     struct kernfs_root ;   245     struct kernfs_elem_dir {   unsigned long subdirs;   struct rb_root children;   struct kernfs_root *root; } ;    86     struct kernfs_node ;    86     struct kernfs_elem_symlink {   struct kernfs_node *target_kn; } ;    90     struct kernfs_ops ;    90     struct kernfs_elem_attr {   const struct kernfs_ops *ops;   struct kernfs_open_node *open;   loff_t size;   struct kernfs_node *notify_next; } ;    97     union __anonunion____missing_field_name_260 {   struct kernfs_elem_dir dir;   struct kernfs_elem_symlink symlink;   struct kernfs_elem_attr attr; } ;    97     struct kernfs_node {   atomic_t count;   atomic_t active;   struct lockdep_map dep_map;   struct kernfs_node *parent;   const char *name;   struct rb_node rb;   const void *ns;   unsigned int hash;   union __anonunion____missing_field_name_260 __annonCompField50;   void *priv;   unsigned short flags;   umode_t mode;   unsigned int ino;   struct kernfs_iattrs *iattr; } ;   139     struct kernfs_syscall_ops {   int (*remount_fs)(struct kernfs_root *, int *, char *);   int (*show_options)(struct seq_file *, struct kernfs_root *);   int (*mkdir)(struct kernfs_node *, const char *, umode_t );   int (*rmdir)(struct kernfs_node *);   int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *);   int (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *); } ;   158     struct kernfs_root {   struct kernfs_node *kn;   unsigned int flags;   struct ida ino_ida;   struct kernfs_syscall_ops *syscall_ops;   struct list_head supers;   wait_queue_head_t deactivate_waitq; } ;   174     struct kernfs_open_file {   struct kernfs_node *kn;   struct file *file;   struct seq_file *seq_file;   void *priv;   struct mutex mutex;   struct mutex prealloc_mutex;   int event;   struct list_head list;   char *prealloc_buf;   size_t atomic_write_len;   bool mmapped;   bool released;   const struct vm_operations_struct *vm_ops; } ;   194     struct kernfs_ops {   int (*open)(struct kernfs_open_file *);   void (*release)(struct kernfs_open_file *);   int (*seq_show)(struct seq_file *, void *);   void * (*seq_start)(struct seq_file *, loff_t *);   void * (*seq_next)(struct seq_file *, void *, loff_t *);   void (*seq_stop)(struct seq_file *, void *);   ssize_t  (*read)(struct kernfs_open_file *, char *, size_t , loff_t );   size_t atomic_write_len;   bool prealloc;   ssize_t  (*write)(struct kernfs_open_file *, char *, size_t , loff_t );   int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *);   struct lock_class_key lockdep_key; } ;   521     struct sock ;   522     enum kobj_ns_type {   KOBJ_NS_TYPE_NONE = 0,   KOBJ_NS_TYPE_NET = 1,   KOBJ_NS_TYPES = 2 } ;   528     struct kobj_ns_type_operations {   enum kobj_ns_type type;   bool  (*current_may_mount)();   void * (*grab_current_ns)();   const void * (*netlink_ns)(struct sock *);   const void * (*initial_ns)();   void (*drop_ns)(void *); } ;    60     struct attribute {   const char *name;   umode_t mode;   bool ignore_lockdep;   struct lock_class_key *key;   struct lock_class_key skey; } ;   165     struct sysfs_ops {   ssize_t  (*show)(struct kobject *, struct attribute *, char *);   ssize_t  (*store)(struct kobject *, struct attribute *, const char *, size_t ); } ;   530     struct refcount_struct {   atomic_t refs; } ;    11     typedef struct refcount_struct refcount_t;    41     struct kref {   refcount_t refcount; } ;    52     struct kset ;    52     struct kobj_type ;    52     struct kobject {   const char *name;   struct list_head entry;   struct kobject *parent;   struct kset *kset;   struct kobj_type *ktype;   struct kernfs_node *sd;   struct kref kref;   struct delayed_work release;   unsigned char state_initialized;   unsigned char state_in_sysfs;   unsigned char state_add_uevent_sent;   unsigned char state_remove_uevent_sent;   unsigned char uevent_suppress; } ;   115     struct kobj_type {   void (*release)(struct kobject *);   const struct sysfs_ops *sysfs_ops;   struct attribute **default_attrs;   const struct kobj_ns_type_operations * (*child_ns_type)(struct kobject *);   const void * (*namespace)(struct kobject *); } ;   123     struct kobj_uevent_env {   char *argv[3U];   char *envp[32U];   int envp_idx;   char buf[2048U];   int buflen; } ;   131     struct kset_uevent_ops {   const int (*filter)(struct kset *, struct kobject *);   const const char * (*name)(struct kset *, struct kobject *);   const int (*uevent)(struct kset *, struct kobject *, struct kobj_uevent_env *); } ;   148     struct kset {   struct list_head list;   spinlock_t list_lock;   struct kobject kobj;   const struct kset_uevent_ops *uevent_ops; } ;   223     struct kernel_param ;   228     struct kernel_param_ops {   unsigned int flags;   int (*set)(const char *, const struct kernel_param *);   int (*get)(char *, const struct kernel_param *);   void (*free)(void *); } ;    62     struct kparam_string ;    62     struct kparam_array ;    62     union __anonunion____missing_field_name_263 {   void *arg;   const struct kparam_string *str;   const struct kparam_array *arr; } ;    62     struct kernel_param {   const char *name;   struct module *mod;   const struct kernel_param_ops *ops;   const u16 perm;   s8 level;   u8 flags;   union __anonunion____missing_field_name_263 __annonCompField51; } ;    83     struct kparam_string {   unsigned int maxlen;   char *string; } ;    89     struct kparam_array {   unsigned int max;   unsigned int elemsize;   unsigned int *num;   const struct kernel_param_ops *ops;   void *elem; } ;   470     struct latch_tree_node {   struct rb_node node[2U]; } ;   211     struct mod_arch_specific { } ;    38     struct exception_table_entry ;    39     struct module_param_attrs ;    39     struct module_kobject {   struct kobject kobj;   struct module *mod;   struct kobject *drivers_dir;   struct module_param_attrs *mp;   struct completion *kobj_completion; } ;    49     struct module_attribute {   struct attribute attr;   ssize_t  (*show)(struct module_attribute *, struct module_kobject *, char *);   ssize_t  (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t );   void (*setup)(struct module *, const char *);   int (*test)(struct module *);   void (*free)(struct module *); } ;   276     enum module_state {   MODULE_STATE_LIVE = 0,   MODULE_STATE_COMING = 1,   MODULE_STATE_GOING = 2,   MODULE_STATE_UNFORMED = 3 } ;   283     struct mod_tree_node {   struct module *mod;   struct latch_tree_node node; } ;   288     struct module_layout {   void *base;   unsigned int size;   unsigned int text_size;   unsigned int ro_size;   unsigned int ro_after_init_size;   struct mod_tree_node mtn; } ;   304     struct mod_kallsyms {   Elf64_Sym *symtab;   unsigned int num_symtab;   char *strtab; } ;   318     struct klp_modinfo {   Elf64_Ehdr hdr;   Elf64_Shdr *sechdrs;   char *secstrings;   unsigned int symndx; } ;   326     struct module_sect_attrs ;   326     struct module_notes_attrs ;   326     struct trace_event_call ;   326     struct trace_enum_map ;   326     struct module {   enum module_state state;   struct list_head list;   char name[56U];   struct module_kobject mkobj;   struct module_attribute *modinfo_attrs;   const char *version;   const char *srcversion;   struct kobject *holders_dir;   const struct kernel_symbol *syms;   const s32 *crcs;   unsigned int num_syms;   struct mutex param_lock;   struct kernel_param *kp;   unsigned int num_kp;   unsigned int num_gpl_syms;   const struct kernel_symbol *gpl_syms;   const s32 *gpl_crcs;   const struct kernel_symbol *unused_syms;   const s32 *unused_crcs;   unsigned int num_unused_syms;   unsigned int num_unused_gpl_syms;   const struct kernel_symbol *unused_gpl_syms;   const s32 *unused_gpl_crcs;   bool sig_ok;   bool async_probe_requested;   const struct kernel_symbol *gpl_future_syms;   const s32 *gpl_future_crcs;   unsigned int num_gpl_future_syms;   unsigned int num_exentries;   struct exception_table_entry *extable;   int (*init)();   struct module_layout core_layout;   struct module_layout init_layout;   struct mod_arch_specific arch;   unsigned long taints;   unsigned int num_bugs;   struct list_head bug_list;   struct bug_entry *bug_table;   struct mod_kallsyms *kallsyms;   struct mod_kallsyms core_kallsyms;   struct module_sect_attrs *sect_attrs;   struct module_notes_attrs *notes_attrs;   char *args;   void *percpu;   unsigned int percpu_size;   unsigned int num_tracepoints;   const struct tracepoint **tracepoints_ptrs;   unsigned int num_trace_bprintk_fmt;   const char **trace_bprintk_fmt_start;   struct trace_event_call **trace_events;   unsigned int num_trace_events;   struct trace_enum_map **trace_enums;   unsigned int num_trace_enums;   bool klp;   bool klp_alive;   struct klp_modinfo *klp_info;   struct list_head source_list;   struct list_head target_list;   void (*exit)();   atomic_t refcnt;   ctor_fn_t  (**ctors)();   unsigned int num_ctors; } ;   679     struct zpool ;   680     struct zpool_ops {   int (*evict)(struct zpool *, unsigned long); } ;    19     enum zpool_mapmode {   ZPOOL_MM_RW = 0,   ZPOOL_MM_RO = 1,   ZPOOL_MM_WO = 2,   ZPOOL_MM_DEFAULT = 0 } ;    62     struct zpool_driver {   char *type;   struct module *owner;   atomic_t refcount;   struct list_head list;   void * (*create)(const char *, gfp_t , const struct zpool_ops *, struct zpool *);   void (*destroy)(void *);   int (*malloc)(void *, size_t , gfp_t , unsigned long *);   void (*free)(void *, unsigned long);   int (*shrink)(void *, unsigned int, unsigned int *);   void * (*map)(void *, unsigned long, enum zpool_mapmode );   void (*unmap)(void *, unsigned long);   u64  (*total_size)(void *); } ;   109     struct z3fold_pool ;   110     struct z3fold_ops {   int (*evict)(struct z3fold_pool *, unsigned long); } ;    42     enum buddy {   HEADLESS = 0,   FIRST = 1,   MIDDLE = 2,   LAST = 3,   BUDDIES_MAX = 4 } ;    50     struct z3fold_header {   struct list_head buddy;   spinlock_t page_lock;   struct kref refcount;   unsigned short first_chunks;   unsigned short middle_chunks;   unsigned short last_chunks;   unsigned short start_middle;   unsigned char first_num; } ;    72     struct z3fold_pool {   spinlock_t lock;   struct list_head unbuddied[62U];   struct list_head lru;   atomic64_t pages_nr;   const struct z3fold_ops *ops;   struct zpool *zpool;   const struct zpool_ops *zpool_ops; } ;   387     union __anonunion___u_275 {   struct list_head *__val;   char __c[1U]; } ;     1     void * __builtin_memcpy(void *, const void *, unsigned long);     1     long int __builtin_expect(long, long);   252     void __read_once_size(const volatile void *p, void *res, int size);   277     void __write_once_size(volatile void *p, void *res, int size);    34     extern struct module __this_module;    72     void set_bit(long nr, volatile unsigned long *addr);   110     void clear_bit(long nr, volatile unsigned long *addr);   321     bool  constant_test_bit(long nr, const volatile unsigned long *addr);   172     int printk(const char *, ...);    25     void INIT_LIST_HEAD(struct list_head *list);    32     bool  __list_add_valid(struct list_head *, struct list_head *, struct list_head *);    35     bool  __list_del_entry_valid(struct list_head *);    55     void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next);    76     void list_add(struct list_head *new, struct list_head *head);   102     void __list_del(struct list_head *prev, struct list_head *next);   114     void __list_del_entry(struct list_head *entry);   122     void list_del(struct list_head *entry);   156     void list_del_init(struct list_head *entry);   200     int list_empty(const struct list_head *head);    71     void warn_slowpath_null(const char *, const int);     7     extern unsigned long page_offset_base;     9     extern unsigned long vmemmap_base;    23     unsigned long int __phys_addr(unsigned long);    36     void atomic_set(atomic_t *v, int i);    19     long int atomic64_read(const atomic64_t *v);    31     void atomic64_set(atomic64_t *v, long i);    84     void atomic64_inc(atomic64_t *v);    97     void atomic64_dec(atomic64_t *v);    61     void * __memmove(void *, const void *, size_t );    93     void __raw_spin_lock_init(raw_spinlock_t *, const char *, struct lock_class_key *);    22     void _raw_spin_lock(raw_spinlock_t *);    39     void _raw_spin_unlock(raw_spinlock_t *);   286     raw_spinlock_t * spinlock_check(spinlock_t *lock);   297     void spin_lock(spinlock_t *lock);   321     void ldv_spin_lock_25(spinlock_t *lock);   325     void ldv_spin_lock_27(spinlock_t *lock);   345     void spin_unlock(spinlock_t *lock);   361     void ldv_spin_unlock_26(spinlock_t *lock);   365     void ldv_spin_unlock_28(spinlock_t *lock);    11     void __ldv_spin_lock(spinlock_t *);    14     void ldv___ldv_spin_lock_11(spinlock_t *ldv_func_arg1);    18     void ldv___ldv_spin_lock_19(spinlock_t *ldv_func_arg1);    22     void ldv___ldv_spin_lock_21(spinlock_t *ldv_func_arg1);    30     void ldv_spin_lock_lock_of_NOT_ARG_SIGN();    38     void ldv_spin_lock_lock_of_z3fold_pool();    39     void ldv_spin_unlock_lock_of_z3fold_pool();    46     void ldv_spin_lock_node_size_lock_of_pglist_data();    54     void ldv_spin_lock_page_lock_of_z3fold_header();    55     void ldv_spin_unlock_page_lock_of_z3fold_header();   457     struct page * alloc_pages_current(gfp_t , unsigned int);   460     struct page * alloc_pages(gfp_t gfp_mask, unsigned int order);   496     void __free_pages(struct page *, unsigned int);  1020     void * lowmem_page_address(const struct page *page);    15     void refcount_set(refcount_t *r, unsigned int n);    29     void refcount_inc(refcount_t *);    34     bool  refcount_dec_and_test(refcount_t *);    31     void kref_init(struct kref *kref);    45     void kref_get(struct kref *kref);    67     int kref_put(struct kref *kref, void (*release)(struct kref *));   154     void kfree(const void *);   330     void * __kmalloc(size_t , gfp_t );   478     void * kmalloc(size_t size, gfp_t flags);   661     void * kzalloc(size_t size, gfp_t flags);   106     void zpool_register_driver(struct zpool_driver *);   108     int zpool_unregister_driver(struct zpool_driver *);   134     int size_to_chunks(size_t size);   143     struct z3fold_header * init_z3fold_page(struct page *page);   163     void free_z3fold_page(struct page *page);   168     void release_z3fold_page(struct kref *ref);   184     void z3fold_page_lock(struct z3fold_header *zhdr);   190     void z3fold_page_unlock(struct z3fold_header *zhdr);   199     unsigned long int encode_handle(struct z3fold_header *zhdr, enum buddy bud);   210     struct z3fold_header * handle_to_z3fold_header(unsigned long handle);   220     enum buddy  handle_to_buddy(unsigned long handle);   230     int num_free_chunks(struct z3fold_header *zhdr);   261     struct z3fold_pool * z3fold_create_pool(gfp_t gfp, const struct z3fold_ops *ops);   285     void z3fold_destroy_pool(struct z3fold_pool *pool);   290     void * mchunk_memmove(struct z3fold_header *zhdr, unsigned short dst_chunk);   301     int z3fold_compact_page(struct z3fold_header *zhdr);   364     int z3fold_alloc(struct z3fold_pool *pool, size_t size, gfp_t gfp, unsigned long *handle);   483     void z3fold_free(struct z3fold_pool *pool, unsigned long handle);   582     int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries);   697     void * z3fold_map(struct z3fold_pool *pool, unsigned long handle);   741     void z3fold_unmap(struct z3fold_pool *pool, unsigned long handle);   766     u64  z3fold_get_pool_size(struct z3fold_pool *pool);   775     int z3fold_zpool_evict(struct z3fold_pool *pool, unsigned long handle);   783     const struct z3fold_ops z3fold_zpool_ops = { &z3fold_zpool_evict };   787     void * z3fold_zpool_create(const char *name, gfp_t gfp, const struct zpool_ops *zpool_ops, struct zpool *zpool);   801     void z3fold_zpool_destroy(void *pool);   806     int z3fold_zpool_malloc(void *pool, size_t size, gfp_t gfp, unsigned long *handle);   811     void z3fold_zpool_free(void *pool, unsigned long handle);   816     int z3fold_zpool_shrink(void *pool, unsigned int pages, unsigned int *reclaimed);   835     void * z3fold_zpool_map(void *pool, unsigned long handle, enum zpool_mapmode mm);   840     void z3fold_zpool_unmap(void *pool, unsigned long handle);   845     u64  z3fold_zpool_total_size(void *pool);   850     struct zpool_driver z3fold_zpool_driver = { (char *)"z3fold", &__this_module, { 0 }, { 0, 0 }, &z3fold_zpool_create, &z3fold_zpool_destroy, &z3fold_zpool_malloc, &z3fold_zpool_free, &z3fold_zpool_shrink, &z3fold_zpool_map, &z3fold_zpool_unmap, &z3fold_zpool_total_size };   865     int init_z3fold();   874     void exit_z3fold();   902     void ldv_check_final_state();   911     void ldv_initialize();   914     void ldv_handler_precall();   917     int nondet_int();   920     int LDV_IN_INTERRUPT = 0;   923     void ldv_main0_sequence_infinite_withcheck_stateful();    10     void ldv_error();    25     int ldv_undef_int();     7     bool  ldv_is_err(const void *ptr);    14     void * ldv_err_ptr(long error);    21     long int ldv_ptr_err(const void *ptr);    28     bool  ldv_is_err_or_null(const void *ptr);     9     int ldv_spin_lock_of_NOT_ARG_SIGN = 1;    21     void ldv_spin_unlock_lock_of_NOT_ARG_SIGN();    30     int ldv_spin_trylock_lock_of_NOT_ARG_SIGN();    56     void ldv_spin_unlock_wait_lock_of_NOT_ARG_SIGN();    63     int ldv_spin_is_locked_lock_of_NOT_ARG_SIGN();    84     int ldv_spin_can_lock_lock_of_NOT_ARG_SIGN();    91     int ldv_spin_is_contended_lock_of_NOT_ARG_SIGN();   112     int ldv_atomic_dec_and_lock_lock_of_NOT_ARG_SIGN();   134     int ldv_spin_lock_of_z3fold_pool = 1;   155     int ldv_spin_trylock_lock_of_z3fold_pool();   181     void ldv_spin_unlock_wait_lock_of_z3fold_pool();   188     int ldv_spin_is_locked_lock_of_z3fold_pool();   209     int ldv_spin_can_lock_lock_of_z3fold_pool();   216     int ldv_spin_is_contended_lock_of_z3fold_pool();   237     int ldv_atomic_dec_and_lock_lock_of_z3fold_pool();   259     int ldv_spin_node_size_lock_of_pglist_data = 1;   271     void ldv_spin_unlock_node_size_lock_of_pglist_data();   280     int ldv_spin_trylock_node_size_lock_of_pglist_data();   306     void ldv_spin_unlock_wait_node_size_lock_of_pglist_data();   313     int ldv_spin_is_locked_node_size_lock_of_pglist_data();   334     int ldv_spin_can_lock_node_size_lock_of_pglist_data();   341     int ldv_spin_is_contended_node_size_lock_of_pglist_data();   362     int ldv_atomic_dec_and_lock_node_size_lock_of_pglist_data();   384     int ldv_spin_page_lock_of_z3fold_header = 1;   405     int ldv_spin_trylock_page_lock_of_z3fold_header();   431     void ldv_spin_unlock_wait_page_lock_of_z3fold_header();   438     int ldv_spin_is_locked_page_lock_of_z3fold_header();   459     int ldv_spin_can_lock_page_lock_of_z3fold_header();   466     int ldv_spin_is_contended_page_lock_of_z3fold_header();   487     int ldv_atomic_dec_and_lock_page_lock_of_z3fold_header();   509     int ldv_spin_ptl = 1;   512     void ldv_spin_lock_ptl();   521     void ldv_spin_unlock_ptl();   530     int ldv_spin_trylock_ptl();   556     void ldv_spin_unlock_wait_ptl();   563     int ldv_spin_is_locked_ptl();   584     int ldv_spin_can_lock_ptl();   591     int ldv_spin_is_contended_ptl();   612     int ldv_atomic_dec_and_lock_ptl();           return ;         }        {       925     struct z3fold_pool *var_group1;   926     unsigned long var_z3fold_zpool_evict_20_p1;   927     const char *var_z3fold_zpool_create_21_p0;   928     unsigned int var_z3fold_zpool_create_21_p1;   929     const struct zpool_ops *var_z3fold_zpool_create_21_p2;   930     struct zpool *var_z3fold_zpool_create_21_p3;   931     void *var_z3fold_zpool_destroy_22_p0;   932     void *var_z3fold_zpool_malloc_23_p0;   933     unsigned long var_z3fold_zpool_malloc_23_p1;   934     unsigned int var_z3fold_zpool_malloc_23_p2;   935     unsigned long *var_z3fold_zpool_malloc_23_p3;   936     void *var_z3fold_zpool_free_24_p0;   937     unsigned long var_z3fold_zpool_free_24_p1;   938     void *var_z3fold_zpool_shrink_25_p0;   939     unsigned int var_z3fold_zpool_shrink_25_p1;   940     unsigned int *var_z3fold_zpool_shrink_25_p2;   941     void *var_z3fold_zpool_map_26_p0;   942     unsigned long var_z3fold_zpool_map_26_p1;   943     enum zpool_mapmode var_z3fold_zpool_map_26_p2;   944     void *var_z3fold_zpool_unmap_27_p0;   945     unsigned long var_z3fold_zpool_unmap_27_p1;   946     void *var_z3fold_zpool_total_size_28_p0;   947     int tmp;   948     int tmp___0;   949     int tmp___1;  1118     LDV_IN_INTERRUPT = 1;  1127     ldv_initialize() { /* Function call is skipped due to function is undefined */}  1146     ldv_handler_precall() { /* Function call is skipped due to function is undefined */}           {   869       zpool_register_driver(&z3fold_zpool_driver) { /* Function call is skipped due to function is undefined */}           } 1154     goto ldv_22220;  1154     tmp___1 = nondet_int() { /* Function call is skipped due to function is undefined */}  1156     goto ldv_22219;  1155     ldv_22219:;  1157     tmp___0 = nondet_int() { /* Function call is skipped due to function is undefined */}  1157     switch (tmp___0);  1330     ldv_handler_precall() { /* Function call is skipped due to function is undefined */}  1331     -z3fold_zpool_shrink(var_z3fold_zpool_shrink_25_p0, var_z3fold_zpool_shrink_25_p1, var_z3fold_zpool_shrink_25_p2)           {         }  818       unsigned int total;   819       int ret;   819       total = 0U;   820       ret = -22;   822       goto ldv_22135;   824       goto ldv_22134;   823       ldv_22134:;             {   584         int i;   585         int ret;   586         int freechunks;   587         struct z3fold_header *zhdr;   588         struct page *page;   589         unsigned long first_handle;   590         unsigned long middle_handle;   591         unsigned long last_handle;   592         int tmp;   593         const struct list_head *__mptr;   594         void *tmp___0;   595         int tmp___1;   596         _Bool tmp___2;   597         int tmp___3;   598         int tmp___4;   599         _Bool tmp___5;   584         ret = 0;   587         first_handle = 0UL;   587         middle_handle = 0UL;   587         last_handle = 0UL;               {                 {               }  299             _raw_spin_lock(&(lock->__annonCompField20.rlock)) { /* Function call is skipped due to function is undefined */}   300             return ;;                 }  590         unsigned long __CPAchecker_TMP_0 = (unsigned long)(pool->ops);   590         unsigned long __CPAchecker_TMP_1 = (unsigned long)(pool->ops->evict);   590         assume(!(__CPAchecker_TMP_1 == ((unsigned long)((int (*)(struct z3fold_pool *, unsigned long))0))));   594         i = 0;   594         goto ldv_22073;   596         goto ldv_22072;   595         ldv_22072:;               {   202           union __anonunion___u_15 __u;                 {   254             switch (size);   255             assume(!(size == 1));   255             assume(!(size == 2));   255             assume(!(size == 4));   255             assume(size == 8);   254             *((__u64 *)res) = *((volatile __u64 *)p);   254             goto ldv_883;   256             return ;;                 }  202           return ((unsigned long)((const struct list_head *)(__u.__val))) == ((unsigned long)head);;               }  599         __mptr = (const struct list_head *)(pool->lru.prev);   599         page = ((struct page *)__mptr) + 18446744073709551584UL;               {                 {   116             _Bool tmp;   117             int tmp___0;   116             tmp = __list_del_entry_valid(entry) { /* Function call is skipped due to function is undefined */}   116             assume(tmp == 0);   116             tmp___0 = 1;   116             assume(!(tmp___0 == 0));   117             return ;;                 }                {    27             union __anonunion___u_9 __u;    27             __u.__val = list;                   {   279               switch (size);   280               assume(!(size == 1));   281               assume(!(size == 2));   282               assume(!(size == 4));   283               assume(size == 8);   283               *((volatile __u64 *)p) = *((__u64 *)res);   283               goto ldv_905;   290               return ;;                   }   28             list->prev = list;    29             return ;;                 }  160           return ;;               }              {  1022           return (void *)(((unsigned long)(((unsigned long long)((((long)page) - ((long)vmemmap_base)) / 64L)) << 12)) + page_offset_base);;               }  602         zhdr = (struct z3fold_header *)tmp___0;               {   323           return (((int)(((unsigned long)(*(addr + ((unsigned long)(nr >> 6))))) >> (((int)nr) & 63))) & 1) != 0;;               }  603         tmp___3 = 1;               {   202           union __anonunion___u_15 __u;                 {   254             switch (size);   255             assume(!(size == 1));   255             assume(!(size == 2));   255             assume(!(size == 4));   255             assume(size == 8);   254             *((__u64 *)res) = *((volatile __u64 *)p);   254             goto ldv_883;   256             return ;;                 }  202           return ((unsigned long)((const struct list_head *)(__u.__val))) == ((unsigned long)head);;               }              {    47           refcount_inc(&(kref->refcount)) { /* Function call is skipped due to function is undefined */}    48           return ;;               }              {                 {               }  347             _raw_spin_unlock(&(lock->__annonCompField20.rlock)) { /* Function call is skipped due to function is undefined */}   348             return ;;                 }              {                 {               }                  {                 }  299               _raw_spin_lock(&(lock->__annonCompField20.rlock)) { /* Function call is skipped due to function is undefined */}   300               return ;;                   }  614         first_handle = 0UL;   615         last_handle = 0UL;   616         middle_handle = 0UL;   617         unsigned int __CPAchecker_TMP_2 = (unsigned int)(zhdr->first_chunks);   619         unsigned int __CPAchecker_TMP_3 = (unsigned int)(zhdr->middle_chunks);   621         unsigned int __CPAchecker_TMP_4 = (unsigned int)(zhdr->last_chunks);               {                 {               }                  {                 }  347               _raw_spin_unlock(&(lock->__annonCompField20.rlock)) { /* Function call is skipped due to function is undefined */}   348               return ;;                   }  651         next:;               {   323           return (((int)(((unsigned long)(*(addr + ((unsigned long)(nr >> 6))))) >> (((int)nr) & 63))) & 1) != 0;;               }              {                 {               }                  {                 }  299               _raw_spin_lock(&(lock->__annonCompField20.rlock)) { /* Function call is skipped due to function is undefined */}   300               return ;;                   }  656         unsigned int __CPAchecker_TMP_5 = (unsigned int)(zhdr->first_chunks);   656         unsigned int __CPAchecker_TMP_6 = (unsigned int)(zhdr->last_chunks);   656         unsigned int __CPAchecker_TMP_7 = (unsigned int)(zhdr->middle_chunks);               {                 {               }                  {                 }  347               _raw_spin_unlock(&(lock->__annonCompField20.rlock)) { /* Function call is skipped due to function is undefined */}   348               return ;;                   }              {                 {               }  299             _raw_spin_lock(&(lock->__annonCompField20.rlock)) { /* Function call is skipped due to function is undefined */}   300             return ;;                 }              {    69           int __ret_warn_on;    70           long tmp;    71           _Bool tmp___0;    69           __ret_warn_on = ((unsigned long)release) == ((unsigned long)((void (*)(struct kref *))0));    69           tmp = __builtin_expect(__ret_warn_on != 0, 0L) { /* Function call is skipped due to function is undefined */}    69           assume(tmp != 0L);    69           warn_slowpath_null("./include/linux/kref.h", 69) { /* Function call is skipped due to function is undefined */}    69           __builtin_expect(__ret_warn_on != 0, 0L) { /* Function call is skipped due to function is undefined */}    71           tmp___0 = refcount_dec_and_test(&(kref->refcount)) { /* Function call is skipped due to function is undefined */}    71           assume(!(((int)tmp___0) == 0));    72           assume(!(release == (&z3fold_zpool_destroy)));    72           assume(release == (&release_z3fold_page));                 {    72           skip  170             struct z3fold_header *zhdr;   171             struct page *page;   172             const struct kref *__mptr;   173             unsigned long tmp;   174             int tmp___0;   175             int tmp___1;   173             __mptr = (const struct kref *)ref;   173             zhdr = ((struct z3fold_header *)__mptr) + 18446744073709551528UL;   174             tmp = __phys_addr((unsigned long)zhdr) { /* Function call is skipped due to function is undefined */}   174             page = (struct page *)((tmp >> 12) + vmemmap_base);                   {   202               union __anonunion___u_15 __u;                     {   254                 switch (size);   255                 assume(!(size == 1));   255                 assume(!(size == 2));   255                 assume(!(size == 4));   255                 assume(size == 8);   254                 *((__u64 *)res) = *((volatile __u64 *)p);   254                 goto ldv_883;   256                 return ;;                     }  202               return ((unsigned long)((const struct list_head *)(__u.__val))) == ((unsigned long)head);;                   }                  {                 }  202               union __anonunion___u_15 __u;                     {   254                 switch (size);   255                 assume(!(size == 1));   255                 assume(!(size == 2));   255                 assume(!(size == 4));   255                 assume(size == 8);   254                 *((__u64 *)res) = *((volatile __u64 *)p);   254                 goto ldv_883;   256                 return ;;                     }  202               return ((unsigned long)((const struct list_head *)(__u.__val))) == ((unsigned long)head);;                   }   73           return 1;;               }              {             }99 Ignored inline assembler code   102           return ;;               }  826       total = total + 1U;   827       ldv_22135:;   824       goto ldv_22134;   823       ldv_22134:;             {           }  584         int i;   585         int ret;   586         int freechunks;   587         struct z3fold_header *zhdr;   588         struct page *page;   589         unsigned long first_handle;   590         unsigned long middle_handle;   591         unsigned long last_handle;   592         int tmp;   593         const struct list_head *__mptr;   594         void *tmp___0;   595         int tmp___1;   596         _Bool tmp___2;   597         int tmp___3;   598         int tmp___4;   599         _Bool tmp___5;   584         ret = 0;   587         first_handle = 0UL;   587         middle_handle = 0UL;   587         last_handle = 0UL;               {             }}  |              Source code         
     1 #ifndef _ASM_X86_ATOMIC64_64_H
    2 #define _ASM_X86_ATOMIC64_64_H
    3 
    4 #include <linux/types.h>
    5 #include <asm/alternative.h>
    6 #include <asm/cmpxchg.h>
    7 
    8 /* The 64-bit atomic type */
    9 
   10 #define ATOMIC64_INIT(i)	{ (i) }
   11 
   12 /**
   13  * atomic64_read - read atomic64 variable
   14  * @v: pointer of type atomic64_t
   15  *
   16  * Atomically reads the value of @v.
   17  * Doesn't imply a read memory barrier.
   18  */
   19 static inline long atomic64_read(const atomic64_t *v)
   20 {
   21 	return READ_ONCE((v)->counter);
   22 }
   23 
   24 /**
   25  * atomic64_set - set atomic64 variable
   26  * @v: pointer to type atomic64_t
   27  * @i: required value
   28  *
   29  * Atomically sets the value of @v to @i.
   30  */
   31 static inline void atomic64_set(atomic64_t *v, long i)
   32 {
   33 	WRITE_ONCE(v->counter, i);
   34 }
   35 
   36 /**
   37  * atomic64_add - add integer to atomic64 variable
   38  * @i: integer value to add
   39  * @v: pointer to type atomic64_t
   40  *
   41  * Atomically adds @i to @v.
   42  */
   43 static __always_inline void atomic64_add(long i, atomic64_t *v)
   44 {
   45 	asm volatile(LOCK_PREFIX "addq %1,%0"
   46 		     : "=m" (v->counter)
   47 		     : "er" (i), "m" (v->counter));
   48 }
   49 
   50 /**
   51  * atomic64_sub - subtract the atomic64 variable
   52  * @i: integer value to subtract
   53  * @v: pointer to type atomic64_t
   54  *
   55  * Atomically subtracts @i from @v.
   56  */
   57 static inline void atomic64_sub(long i, atomic64_t *v)
   58 {
   59 	asm volatile(LOCK_PREFIX "subq %1,%0"
   60 		     : "=m" (v->counter)
   61 		     : "er" (i), "m" (v->counter));
   62 }
   63 
   64 /**
   65  * atomic64_sub_and_test - subtract value from variable and test result
   66  * @i: integer value to subtract
   67  * @v: pointer to type atomic64_t
   68  *
   69  * Atomically subtracts @i from @v and returns
   70  * true if the result is zero, or false for all
   71  * other cases.
   72  */
   73 static inline bool atomic64_sub_and_test(long i, atomic64_t *v)
   74 {
   75 	GEN_BINARY_RMWcc(LOCK_PREFIX "subq", v->counter, "er", i, "%0", e);
   76 }
   77 
   78 /**
   79  * atomic64_inc - increment atomic64 variable
   80  * @v: pointer to type atomic64_t
   81  *
   82  * Atomically increments @v by 1.
   83  */
   84 static __always_inline void atomic64_inc(atomic64_t *v)
   85 {
   86 	asm volatile(LOCK_PREFIX "incq %0"
   87 		     : "=m" (v->counter)
   88 		     : "m" (v->counter));
   89 }
   90 
   91 /**
   92  * atomic64_dec - decrement atomic64 variable
   93  * @v: pointer to type atomic64_t
   94  *
   95  * Atomically decrements @v by 1.
   96  */
   97 static __always_inline void atomic64_dec(atomic64_t *v)
   98 {
   99 	asm volatile(LOCK_PREFIX "decq %0"
  100 		     : "=m" (v->counter)
  101 		     : "m" (v->counter));
  102 }
  103 
  104 /**
  105  * atomic64_dec_and_test - decrement and test
  106  * @v: pointer to type atomic64_t
  107  *
  108  * Atomically decrements @v by 1 and
  109  * returns true if the result is 0, or false for all other
  110  * cases.
  111  */
  112 static inline bool atomic64_dec_and_test(atomic64_t *v)
  113 {
  114 	GEN_UNARY_RMWcc(LOCK_PREFIX "decq", v->counter, "%0", e);
  115 }
  116 
  117 /**
  118  * atomic64_inc_and_test - increment and test
  119  * @v: pointer to type atomic64_t
  120  *
  121  * Atomically increments @v by 1
  122  * and returns true if the result is zero, or false for all
  123  * other cases.
  124  */
  125 static inline bool atomic64_inc_and_test(atomic64_t *v)
  126 {
  127 	GEN_UNARY_RMWcc(LOCK_PREFIX "incq", v->counter, "%0", e);
  128 }
  129 
  130 /**
  131  * atomic64_add_negative - add and test if negative
  132  * @i: integer value to add
  133  * @v: pointer to type atomic64_t
  134  *
  135  * Atomically adds @i to @v and returns true
  136  * if the result is negative, or false when
  137  * result is greater than or equal to zero.
  138  */
  139 static inline bool atomic64_add_negative(long i, atomic64_t *v)
  140 {
  141 	GEN_BINARY_RMWcc(LOCK_PREFIX "addq", v->counter, "er", i, "%0", s);
  142 }
  143 
  144 /**
  145  * atomic64_add_return - add and return
  146  * @i: integer value to add
  147  * @v: pointer to type atomic64_t
  148  *
  149  * Atomically adds @i to @v and returns @i + @v
  150  */
  151 static __always_inline long atomic64_add_return(long i, atomic64_t *v)
  152 {
  153 	return i + xadd(&v->counter, i);
  154 }
  155 
  156 static inline long atomic64_sub_return(long i, atomic64_t *v)
  157 {
  158 	return atomic64_add_return(-i, v);
  159 }
  160 
  161 static inline long atomic64_fetch_add(long i, atomic64_t *v)
  162 {
  163 	return xadd(&v->counter, i);
  164 }
  165 
  166 static inline long atomic64_fetch_sub(long i, atomic64_t *v)
  167 {
  168 	return xadd(&v->counter, -i);
  169 }
  170 
  171 #define atomic64_inc_return(v)  (atomic64_add_return(1, (v)))
  172 #define atomic64_dec_return(v)  (atomic64_sub_return(1, (v)))
  173 
  174 static inline long atomic64_cmpxchg(atomic64_t *v, long old, long new)
  175 {
  176 	return cmpxchg(&v->counter, old, new);
  177 }
  178 
  179 static inline long atomic64_xchg(atomic64_t *v, long new)
  180 {
  181 	return xchg(&v->counter, new);
  182 }
  183 
  184 /**
  185  * atomic64_add_unless - add unless the number is a given value
  186  * @v: pointer of type atomic64_t
  187  * @a: the amount to add to v...
  188  * @u: ...unless v is equal to u.
  189  *
  190  * Atomically adds @a to @v, so long as it was not @u.
  191  * Returns the old value of @v.
  192  */
  193 static inline bool atomic64_add_unless(atomic64_t *v, long a, long u)
  194 {
  195 	long c, old;
  196 	c = atomic64_read(v);
  197 	for (;;) {
  198 		if (unlikely(c == (u)))
  199 			break;
  200 		old = atomic64_cmpxchg((v), c, c + (a));
  201 		if (likely(old == c))
  202 			break;
  203 		c = old;
  204 	}
  205 	return c != (u);
  206 }
  207 
  208 #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
  209 
  210 /*
  211  * atomic64_dec_if_positive - decrement by 1 if old value positive
  212  * @v: pointer of type atomic_t
  213  *
  214  * The function returns the old value of *v minus 1, even if
  215  * the atomic variable, v, was not decremented.
  216  */
  217 static inline long atomic64_dec_if_positive(atomic64_t *v)
  218 {
  219 	long c, old, dec;
  220 	c = atomic64_read(v);
  221 	for (;;) {
  222 		dec = c - 1;
  223 		if (unlikely(dec < 0))
  224 			break;
  225 		old = atomic64_cmpxchg((v), c, dec);
  226 		if (likely(old == c))
  227 			break;
  228 		c = old;
  229 	}
  230 	return dec;
  231 }
  232 
  233 #define ATOMIC64_OP(op)							\
  234 static inline void atomic64_##op(long i, atomic64_t *v)			\
  235 {									\
  236 	asm volatile(LOCK_PREFIX #op"q %1,%0"				\
  237 			: "+m" (v->counter)				\
  238 			: "er" (i)					\
  239 			: "memory");					\
  240 }
  241 
  242 #define ATOMIC64_FETCH_OP(op, c_op)					\
  243 static inline long atomic64_fetch_##op(long i, atomic64_t *v)		\
  244 {									\
  245 	long old, val = atomic64_read(v);				\
  246 	for (;;) {							\
  247 		old = atomic64_cmpxchg(v, val, val c_op i);		\
  248 		if (old == val)						\
  249 			break;						\
  250 		val = old;						\
  251 	}								\
  252 	return old;							\
  253 }
  254 
  255 #define ATOMIC64_OPS(op, c_op)						\
  256 	ATOMIC64_OP(op)							\
  257 	ATOMIC64_FETCH_OP(op, c_op)
  258 
  259 ATOMIC64_OPS(and, &)
  260 ATOMIC64_OPS(or, |)
  261 ATOMIC64_OPS(xor, ^)
  262 
  263 #undef ATOMIC64_OPS
  264 #undef ATOMIC64_FETCH_OP
  265 #undef ATOMIC64_OP
  266 
  267 #endif /* _ASM_X86_ATOMIC64_64_H */                 1 #ifndef _ASM_X86_BITOPS_H
    2 #define _ASM_X86_BITOPS_H
    3 
    4 /*
    5  * Copyright 1992, Linus Torvalds.
    6  *
    7  * Note: inlines with more than a single statement should be marked
    8  * __always_inline to avoid problems with older gcc's inlining heuristics.
    9  */
   10 
   11 #ifndef _LINUX_BITOPS_H
   12 #error only <linux/bitops.h> can be included directly
   13 #endif
   14 
   15 #include <linux/compiler.h>
   16 #include <asm/alternative.h>
   17 #include <asm/rmwcc.h>
   18 #include <asm/barrier.h>
   19 
   20 #if BITS_PER_LONG == 32
   21 # define _BITOPS_LONG_SHIFT 5
   22 #elif BITS_PER_LONG == 64
   23 # define _BITOPS_LONG_SHIFT 6
   24 #else
   25 # error "Unexpected BITS_PER_LONG"
   26 #endif
   27 
   28 #define BIT_64(n)			(U64_C(1) << (n))
   29 
   30 /*
   31  * These have to be done with inline assembly: that way the bit-setting
   32  * is guaranteed to be atomic. All bit operations return 0 if the bit
   33  * was cleared before the operation and != 0 if it was not.
   34  *
   35  * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
   36  */
   37 
   38 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
   39 /* Technically wrong, but this avoids compilation errors on some gcc
   40    versions. */
   41 #define BITOP_ADDR(x) "=m" (*(volatile long *) (x))
   42 #else
   43 #define BITOP_ADDR(x) "+m" (*(volatile long *) (x))
   44 #endif
   45 
   46 #define ADDR				BITOP_ADDR(addr)
   47 
   48 /*
   49  * We do the locked ops that don't return the old value as
   50  * a mask operation on a byte.
   51  */
   52 #define IS_IMMEDIATE(nr)		(__builtin_constant_p(nr))
   53 #define CONST_MASK_ADDR(nr, addr)	BITOP_ADDR((void *)(addr) + ((nr)>>3))
   54 #define CONST_MASK(nr)			(1 << ((nr) & 7))
   55 
   56 /**
   57  * set_bit - Atomically set a bit in memory
   58  * @nr: the bit to set
   59  * @addr: the address to start counting from
   60  *
   61  * This function is atomic and may not be reordered.  See __set_bit()
   62  * if you do not require the atomic guarantees.
   63  *
   64  * Note: there are no guarantees that this function will not be reordered
   65  * on non x86 architectures, so if you are writing portable code,
   66  * make sure not to rely on its reordering guarantees.
   67  *
   68  * Note that @nr may be almost arbitrarily large; this function is not
   69  * restricted to acting on a single-word quantity.
   70  */
   71 static __always_inline void
   72 set_bit(long nr, volatile unsigned long *addr)
   73 {
   74 	if (IS_IMMEDIATE(nr)) {
   75 		asm volatile(LOCK_PREFIX "orb %1,%0"
   76 			: CONST_MASK_ADDR(nr, addr)
   77 			: "iq" ((u8)CONST_MASK(nr))
   78 			: "memory");
   79 	} else {
   80 		asm volatile(LOCK_PREFIX "bts %1,%0"
   81 			: BITOP_ADDR(addr) : "Ir" (nr) : "memory");
   82 	}
   83 }
   84 
   85 /**
   86  * __set_bit - Set a bit in memory
   87  * @nr: the bit to set
   88  * @addr: the address to start counting from
   89  *
   90  * Unlike set_bit(), this function is non-atomic and may be reordered.
   91  * If it's called on the same region of memory simultaneously, the effect
   92  * may be that only one operation succeeds.
   93  */
   94 static __always_inline void __set_bit(long nr, volatile unsigned long *addr)
   95 {
   96 	asm volatile("bts %1,%0" : ADDR : "Ir" (nr) : "memory");
   97 }
   98 
   99 /**
  100  * clear_bit - Clears a bit in memory
  101  * @nr: Bit to clear
  102  * @addr: Address to start counting from
  103  *
  104  * clear_bit() is atomic and may not be reordered.  However, it does
  105  * not contain a memory barrier, so if it is used for locking purposes,
  106  * you should call smp_mb__before_atomic() and/or smp_mb__after_atomic()
  107  * in order to ensure changes are visible on other processors.
  108  */
  109 static __always_inline void
  110 clear_bit(long nr, volatile unsigned long *addr)
  111 {
  112 	if (IS_IMMEDIATE(nr)) {
  113 		asm volatile(LOCK_PREFIX "andb %1,%0"
  114 			: CONST_MASK_ADDR(nr, addr)
  115 			: "iq" ((u8)~CONST_MASK(nr)));
  116 	} else {
  117 		asm volatile(LOCK_PREFIX "btr %1,%0"
  118 			: BITOP_ADDR(addr)
  119 			: "Ir" (nr));
  120 	}
  121 }
  122 
  123 /*
  124  * clear_bit_unlock - Clears a bit in memory
  125  * @nr: Bit to clear
  126  * @addr: Address to start counting from
  127  *
  128  * clear_bit() is atomic and implies release semantics before the memory
  129  * operation. It can be used for an unlock.
  130  */
  131 static __always_inline void clear_bit_unlock(long nr, volatile unsigned long *addr)
  132 {
  133 	barrier();
  134 	clear_bit(nr, addr);
  135 }
  136 
  137 static __always_inline void __clear_bit(long nr, volatile unsigned long *addr)
  138 {
  139 	asm volatile("btr %1,%0" : ADDR : "Ir" (nr));
  140 }
  141 
  142 static __always_inline bool clear_bit_unlock_is_negative_byte(long nr, volatile unsigned long *addr)
  143 {
  144 	bool negative;
  145 	asm volatile(LOCK_PREFIX "andb %2,%1\n\t"
  146 		CC_SET(s)
  147 		: CC_OUT(s) (negative), ADDR
  148 		: "ir" ((char) ~(1 << nr)) : "memory");
  149 	return negative;
  150 }
  151 
  152 // Let everybody know we have it
  153 #define clear_bit_unlock_is_negative_byte clear_bit_unlock_is_negative_byte
  154 
  155 /*
  156  * __clear_bit_unlock - Clears a bit in memory
  157  * @nr: Bit to clear
  158  * @addr: Address to start counting from
  159  *
  160  * __clear_bit() is non-atomic and implies release semantics before the memory
  161  * operation. It can be used for an unlock if no other CPUs can concurrently
  162  * modify other bits in the word.
  163  *
  164  * No memory barrier is required here, because x86 cannot reorder stores past
  165  * older loads. Same principle as spin_unlock.
  166  */
  167 static __always_inline void __clear_bit_unlock(long nr, volatile unsigned long *addr)
  168 {
  169 	barrier();
  170 	__clear_bit(nr, addr);
  171 }
  172 
  173 /**
  174  * __change_bit - Toggle a bit in memory
  175  * @nr: the bit to change
  176  * @addr: the address to start counting from
  177  *
  178  * Unlike change_bit(), this function is non-atomic and may be reordered.
  179  * If it's called on the same region of memory simultaneously, the effect
  180  * may be that only one operation succeeds.
  181  */
  182 static __always_inline void __change_bit(long nr, volatile unsigned long *addr)
  183 {
  184 	asm volatile("btc %1,%0" : ADDR : "Ir" (nr));
  185 }
  186 
  187 /**
  188  * change_bit - Toggle a bit in memory
  189  * @nr: Bit to change
  190  * @addr: Address to start counting from
  191  *
  192  * change_bit() is atomic and may not be reordered.
  193  * Note that @nr may be almost arbitrarily large; this function is not
  194  * restricted to acting on a single-word quantity.
  195  */
  196 static __always_inline void change_bit(long nr, volatile unsigned long *addr)
  197 {
  198 	if (IS_IMMEDIATE(nr)) {
  199 		asm volatile(LOCK_PREFIX "xorb %1,%0"
  200 			: CONST_MASK_ADDR(nr, addr)
  201 			: "iq" ((u8)CONST_MASK(nr)));
  202 	} else {
  203 		asm volatile(LOCK_PREFIX "btc %1,%0"
  204 			: BITOP_ADDR(addr)
  205 			: "Ir" (nr));
  206 	}
  207 }
  208 
  209 /**
  210  * test_and_set_bit - Set a bit and return its old value
  211  * @nr: Bit to set
  212  * @addr: Address to count from
  213  *
  214  * This operation is atomic and cannot be reordered.
  215  * It also implies a memory barrier.
  216  */
  217 static __always_inline bool test_and_set_bit(long nr, volatile unsigned long *addr)
  218 {
  219 	GEN_BINARY_RMWcc(LOCK_PREFIX "bts", *addr, "Ir", nr, "%0", c);
  220 }
  221 
  222 /**
  223  * test_and_set_bit_lock - Set a bit and return its old value for lock
  224  * @nr: Bit to set
  225  * @addr: Address to count from
  226  *
  227  * This is the same as test_and_set_bit on x86.
  228  */
  229 static __always_inline bool
  230 test_and_set_bit_lock(long nr, volatile unsigned long *addr)
  231 {
  232 	return test_and_set_bit(nr, addr);
  233 }
  234 
  235 /**
  236  * __test_and_set_bit - Set a bit and return its old value
  237  * @nr: Bit to set
  238  * @addr: Address to count from
  239  *
  240  * This operation is non-atomic and can be reordered.
  241  * If two examples of this operation race, one can appear to succeed
  242  * but actually fail.  You must protect multiple accesses with a lock.
  243  */
  244 static __always_inline bool __test_and_set_bit(long nr, volatile unsigned long *addr)
  245 {
  246 	bool oldbit;
  247 
  248 	asm("bts %2,%1\n\t"
  249 	    CC_SET(c)
  250 	    : CC_OUT(c) (oldbit), ADDR
  251 	    : "Ir" (nr));
  252 	return oldbit;
  253 }
  254 
  255 /**
  256  * test_and_clear_bit - Clear a bit and return its old value
  257  * @nr: Bit to clear
  258  * @addr: Address to count from
  259  *
  260  * This operation is atomic and cannot be reordered.
  261  * It also implies a memory barrier.
  262  */
  263 static __always_inline bool test_and_clear_bit(long nr, volatile unsigned long *addr)
  264 {
  265 	GEN_BINARY_RMWcc(LOCK_PREFIX "btr", *addr, "Ir", nr, "%0", c);
  266 }
  267 
  268 /**
  269  * __test_and_clear_bit - Clear a bit and return its old value
  270  * @nr: Bit to clear
  271  * @addr: Address to count from
  272  *
  273  * This operation is non-atomic and can be reordered.
  274  * If two examples of this operation race, one can appear to succeed
  275  * but actually fail.  You must protect multiple accesses with a lock.
  276  *
  277  * Note: the operation is performed atomically with respect to
  278  * the local CPU, but not other CPUs. Portable code should not
  279  * rely on this behaviour.
  280  * KVM relies on this behaviour on x86 for modifying memory that is also
  281  * accessed from a hypervisor on the same CPU if running in a VM: don't change
  282  * this without also updating arch/x86/kernel/kvm.c
  283  */
  284 static __always_inline bool __test_and_clear_bit(long nr, volatile unsigned long *addr)
  285 {
  286 	bool oldbit;
  287 
  288 	asm volatile("btr %2,%1\n\t"
  289 		     CC_SET(c)
  290 		     : CC_OUT(c) (oldbit), ADDR
  291 		     : "Ir" (nr));
  292 	return oldbit;
  293 }
  294 
  295 /* WARNING: non atomic and it can be reordered! */
  296 static __always_inline bool __test_and_change_bit(long nr, volatile unsigned long *addr)
  297 {
  298 	bool oldbit;
  299 
  300 	asm volatile("btc %2,%1\n\t"
  301 		     CC_SET(c)
  302 		     : CC_OUT(c) (oldbit), ADDR
  303 		     : "Ir" (nr) : "memory");
  304 
  305 	return oldbit;
  306 }
  307 
  308 /**
  309  * test_and_change_bit - Change a bit and return its old value
  310  * @nr: Bit to change
  311  * @addr: Address to count from
  312  *
  313  * This operation is atomic and cannot be reordered.
  314  * It also implies a memory barrier.
  315  */
  316 static __always_inline bool test_and_change_bit(long nr, volatile unsigned long *addr)
  317 {
  318 	GEN_BINARY_RMWcc(LOCK_PREFIX "btc", *addr, "Ir", nr, "%0", c);
  319 }
  320 
  321 static __always_inline bool constant_test_bit(long nr, const volatile unsigned long *addr)
  322 {
  323 	return ((1UL << (nr & (BITS_PER_LONG-1))) &
  324 		(addr[nr >> _BITOPS_LONG_SHIFT])) != 0;
  325 }
  326 
  327 static __always_inline bool variable_test_bit(long nr, volatile const unsigned long *addr)
  328 {
  329 	bool oldbit;
  330 
  331 	asm volatile("bt %2,%1\n\t"
  332 		     CC_SET(c)
  333 		     : CC_OUT(c) (oldbit)
  334 		     : "m" (*(unsigned long *)addr), "Ir" (nr));
  335 
  336 	return oldbit;
  337 }
  338 
  339 #if 0 /* Fool kernel-doc since it doesn't do macros yet */
  340 /**
  341  * test_bit - Determine whether a bit is set
  342  * @nr: bit number to test
  343  * @addr: Address to start counting from
  344  */
  345 static bool test_bit(int nr, const volatile unsigned long *addr);
  346 #endif
  347 
  348 #define test_bit(nr, addr)			\
  349 	(__builtin_constant_p((nr))		\
  350 	 ? constant_test_bit((nr), (addr))	\
  351 	 : variable_test_bit((nr), (addr)))
  352 
  353 /**
  354  * __ffs - find first set bit in word
  355  * @word: The word to search
  356  *
  357  * Undefined if no bit exists, so code should check against 0 first.
  358  */
  359 static __always_inline unsigned long __ffs(unsigned long word)
  360 {
  361 	asm("rep; bsf %1,%0"
  362 		: "=r" (word)
  363 		: "rm" (word));
  364 	return word;
  365 }
  366 
  367 /**
  368  * ffz - find first zero bit in word
  369  * @word: The word to search
  370  *
  371  * Undefined if no zero exists, so code should check against ~0UL first.
  372  */
  373 static __always_inline unsigned long ffz(unsigned long word)
  374 {
  375 	asm("rep; bsf %1,%0"
  376 		: "=r" (word)
  377 		: "r" (~word));
  378 	return word;
  379 }
  380 
  381 /*
  382  * __fls: find last set bit in word
  383  * @word: The word to search
  384  *
  385  * Undefined if no set bit exists, so code should check against 0 first.
  386  */
  387 static __always_inline unsigned long __fls(unsigned long word)
  388 {
  389 	asm("bsr %1,%0"
  390 	    : "=r" (word)
  391 	    : "rm" (word));
  392 	return word;
  393 }
  394 
  395 #undef ADDR
  396 
  397 #ifdef __KERNEL__
  398 /**
  399  * ffs - find first set bit in word
  400  * @x: the word to search
  401  *
  402  * This is defined the same way as the libc and compiler builtin ffs
  403  * routines, therefore differs in spirit from the other bitops.
  404  *
  405  * ffs(value) returns 0 if value is 0 or the position of the first
  406  * set bit if value is nonzero. The first (least significant) bit
  407  * is at position 1.
  408  */
  409 static __always_inline int ffs(int x)
  410 {
  411 	int r;
  412 
  413 #ifdef CONFIG_X86_64
  414 	/*
  415 	 * AMD64 says BSFL won't clobber the dest reg if x==0; Intel64 says the
  416 	 * dest reg is undefined if x==0, but their CPU architect says its
  417 	 * value is written to set it to the same as before, except that the
  418 	 * top 32 bits will be cleared.
  419 	 *
  420 	 * We cannot do this on 32 bits because at the very least some
  421 	 * 486 CPUs did not behave this way.
  422 	 */
  423 	asm("bsfl %1,%0"
  424 	    : "=r" (r)
  425 	    : "rm" (x), "0" (-1));
  426 #elif defined(CONFIG_X86_CMOV)
  427 	asm("bsfl %1,%0\n\t"
  428 	    "cmovzl %2,%0"
  429 	    : "=&r" (r) : "rm" (x), "r" (-1));
  430 #else
  431 	asm("bsfl %1,%0\n\t"
  432 	    "jnz 1f\n\t"
  433 	    "movl $-1,%0\n"
  434 	    "1:" : "=r" (r) : "rm" (x));
  435 #endif
  436 	return r + 1;
  437 }
  438 
  439 /**
  440  * fls - find last set bit in word
  441  * @x: the word to search
  442  *
  443  * This is defined in a similar way as the libc and compiler builtin
  444  * ffs, but returns the position of the most significant set bit.
  445  *
  446  * fls(value) returns 0 if value is 0 or the position of the last
  447  * set bit if value is nonzero. The last (most significant) bit is
  448  * at position 32.
  449  */
  450 static __always_inline int fls(int x)
  451 {
  452 	int r;
  453 
  454 #ifdef CONFIG_X86_64
  455 	/*
  456 	 * AMD64 says BSRL won't clobber the dest reg if x==0; Intel64 says the
  457 	 * dest reg is undefined if x==0, but their CPU architect says its
  458 	 * value is written to set it to the same as before, except that the
  459 	 * top 32 bits will be cleared.
  460 	 *
  461 	 * We cannot do this on 32 bits because at the very least some
  462 	 * 486 CPUs did not behave this way.
  463 	 */
  464 	asm("bsrl %1,%0"
  465 	    : "=r" (r)
  466 	    : "rm" (x), "0" (-1));
  467 #elif defined(CONFIG_X86_CMOV)
  468 	asm("bsrl %1,%0\n\t"
  469 	    "cmovzl %2,%0"
  470 	    : "=&r" (r) : "rm" (x), "rm" (-1));
  471 #else
  472 	asm("bsrl %1,%0\n\t"
  473 	    "jnz 1f\n\t"
  474 	    "movl $-1,%0\n"
  475 	    "1:" : "=r" (r) : "rm" (x));
  476 #endif
  477 	return r + 1;
  478 }
  479 
  480 /**
  481  * fls64 - find last set bit in a 64-bit word
  482  * @x: the word to search
  483  *
  484  * This is defined in a similar way as the libc and compiler builtin
  485  * ffsll, but returns the position of the most significant set bit.
  486  *
  487  * fls64(value) returns 0 if value is 0 or the position of the last
  488  * set bit if value is nonzero. The last (most significant) bit is
  489  * at position 64.
  490  */
  491 #ifdef CONFIG_X86_64
  492 static __always_inline int fls64(__u64 x)
  493 {
  494 	int bitpos = -1;
  495 	/*
  496 	 * AMD64 says BSRQ won't clobber the dest reg if x==0; Intel64 says the
  497 	 * dest reg is undefined if x==0, but their CPU architect says its
  498 	 * value is written to set it to the same as before.
  499 	 */
  500 	asm("bsrq %1,%q0"
  501 	    : "+r" (bitpos)
  502 	    : "rm" (x));
  503 	return bitpos + 1;
  504 }
  505 #else
  506 #include <asm-generic/bitops/fls64.h>
  507 #endif
  508 
  509 #include <asm-generic/bitops/find.h>
  510 
  511 #include <asm-generic/bitops/sched.h>
  512 
  513 #include <asm/arch_hweight.h>
  514 
  515 #include <asm-generic/bitops/const_hweight.h>
  516 
  517 #include <asm-generic/bitops/le.h>
  518 
  519 #include <asm-generic/bitops/ext2-atomic-setbit.h>
  520 
  521 #endif /* __KERNEL__ */
  522 #endif /* _ASM_X86_BITOPS_H */                 1 
    2 /*
    3  * z3fold.c
    4  *
    5  * Author: Vitaly Wool <vitaly.wool@konsulko.com>
    6  * Copyright (C) 2016, Sony Mobile Communications Inc.
    7  *
    8  * This implementation is based on zbud written by Seth Jennings.
    9  *
   10  * z3fold is an special purpose allocator for storing compressed pages. It
   11  * can store up to three compressed pages per page which improves the
   12  * compression ratio of zbud while retaining its main concepts (e. g. always
   13  * storing an integral number of objects per page) and simplicity.
   14  * It still has simple and deterministic reclaim properties that make it
   15  * preferable to a higher density approach (with no requirement on integral
   16  * number of object per page) when reclaim is used.
   17  *
   18  * As in zbud, pages are divided into "chunks".  The size of the chunks is
   19  * fixed at compile time and is determined by NCHUNKS_ORDER below.
   20  *
   21  * z3fold doesn't export any API and is meant to be used via zpool API.
   22  */
   23 
   24 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   25 
   26 #include <linux/atomic.h>
   27 #include <linux/list.h>
   28 #include <linux/mm.h>
   29 #include <linux/module.h>
   30 #include <linux/preempt.h>
   31 #include <linux/slab.h>
   32 #include <linux/spinlock.h>
   33 #include <linux/zpool.h>
   34 
   35 /*****************
   36  * Structures
   37 *****************/
   38 struct z3fold_pool;
   39 struct z3fold_ops {
   40 	int (*evict)(struct z3fold_pool *pool, unsigned long handle);
   41 };
   42 
   43 enum buddy {
   44 	HEADLESS = 0,
   45 	FIRST,
   46 	MIDDLE,
   47 	LAST,
   48 	BUDDIES_MAX
   49 };
   50 
   51 /*
   52  * struct z3fold_header - z3fold page metadata occupying the first chunk of each
   53  *			z3fold page, except for HEADLESS pages
   54  * @buddy:	links the z3fold page into the relevant list in the pool
   55  * @page_lock:		per-page lock
   56  * @refcount:		reference cound for the z3fold page
   57  * @first_chunks:	the size of the first buddy in chunks, 0 if free
   58  * @middle_chunks:	the size of the middle buddy in chunks, 0 if free
   59  * @last_chunks:	the size of the last buddy in chunks, 0 if free
   60  * @first_num:		the starting number (for the first handle)
   61  */
   62 struct z3fold_header {
   63 	struct list_head buddy;
   64 	spinlock_t page_lock;
   65 	struct kref refcount;
   66 	unsigned short first_chunks;
   67 	unsigned short middle_chunks;
   68 	unsigned short last_chunks;
   69 	unsigned short start_middle;
   70 	unsigned short first_num:2;
   71 };
   72 
   73 /*
   74  * NCHUNKS_ORDER determines the internal allocation granularity, effectively
   75  * adjusting internal fragmentation.  It also determines the number of
   76  * freelists maintained in each pool. NCHUNKS_ORDER of 6 means that the
   77  * allocation granularity will be in chunks of size PAGE_SIZE/64. Some chunks
   78  * in the beginning of an allocated page are occupied by z3fold header, so
   79  * NCHUNKS will be calculated to 63 (or 62 in case CONFIG_DEBUG_SPINLOCK=y),
   80  * which shows the max number of free chunks in z3fold page, also there will
   81  * be 63, or 62, respectively, freelists per pool.
   82  */
   83 #define NCHUNKS_ORDER	6
   84 
   85 #define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
   86 #define CHUNK_SIZE	(1 << CHUNK_SHIFT)
   87 #define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
   88 #define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
   89 #define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
   90 #define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
   91 
   92 #define BUDDY_MASK	(0x3)
   93 
   94 /**
   95  * struct z3fold_pool - stores metadata for each z3fold pool
   96  * @lock:	protects all pool fields and first|last_chunk fields of any
   97  *		z3fold page in the pool
   98  * @unbuddied:	array of lists tracking z3fold pages that contain 2- buddies;
   99  *		the lists each z3fold page is added to depends on the size of
  100  *		its free region.
  101  * @lru:	list tracking the z3fold pages in LRU order by most recently
  102  *		added buddy.
  103  * @pages_nr:	number of z3fold pages in the pool.
  104  * @ops:	pointer to a structure of user defined operations specified at
  105  *		pool creation time.
  106  *
  107  * This structure is allocated at pool creation time and maintains metadata
  108  * pertaining to a particular z3fold pool.
  109  */
  110 struct z3fold_pool {
  111 	spinlock_t lock;
  112 	struct list_head unbuddied[NCHUNKS];
  113 	struct list_head lru;
  114 	atomic64_t pages_nr;
  115 	const struct z3fold_ops *ops;
  116 	struct zpool *zpool;
  117 	const struct zpool_ops *zpool_ops;
  118 };
  119 
  120 /*
  121  * Internal z3fold page flags
  122  */
  123 enum z3fold_page_flags {
  124 	PAGE_HEADLESS = 0,
  125 	MIDDLE_CHUNK_MAPPED,
  126 };
  127 
  128 
  129 /*****************
  130  * Helpers
  131 *****************/
  132 
  133 /* Converts an allocation size in bytes to size in z3fold chunks */
  134 static int size_to_chunks(size_t size)
  135 {
  136 	return (size + CHUNK_SIZE - 1) >> CHUNK_SHIFT;
  137 }
  138 
  139 #define for_each_unbuddied_list(_iter, _begin) \
  140 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
  141 
  142 /* Initializes the z3fold header of a newly allocated z3fold page */
  143 static struct z3fold_header *init_z3fold_page(struct page *page)
  144 {
  145 	struct z3fold_header *zhdr = page_address(page);
  146 
  147 	INIT_LIST_HEAD(&page->lru);
  148 	clear_bit(PAGE_HEADLESS, &page->private);
  149 	clear_bit(MIDDLE_CHUNK_MAPPED, &page->private);
  150 
  151 	spin_lock_init(&zhdr->page_lock);
  152 	kref_init(&zhdr->refcount);
  153 	zhdr->first_chunks = 0;
  154 	zhdr->middle_chunks = 0;
  155 	zhdr->last_chunks = 0;
  156 	zhdr->first_num = 0;
  157 	zhdr->start_middle = 0;
  158 	INIT_LIST_HEAD(&zhdr->buddy);
  159 	return zhdr;
  160 }
  161 
  162 /* Resets the struct page fields and frees the page */
  163 static void free_z3fold_page(struct page *page)
  164 {
  165 	__free_page(page);
  166 }
  167 
  168 static void release_z3fold_page(struct kref *ref)
  169 {
  170 	struct z3fold_header *zhdr;
  171 	struct page *page;
  172 
  173 	zhdr = container_of(ref, struct z3fold_header, refcount);
  174 	page = virt_to_page(zhdr);
  175 
  176 	if (!list_empty(&zhdr->buddy))
  177 		list_del(&zhdr->buddy);
  178 	if (!list_empty(&page->lru))
  179 		list_del(&page->lru);
  180 	free_z3fold_page(page);
  181 }
  182 
  183 /* Lock a z3fold page */
  184 static inline void z3fold_page_lock(struct z3fold_header *zhdr)
  185 {
  186 	spin_lock(&zhdr->page_lock);
  187 }
  188 
  189 /* Unlock a z3fold page */
  190 static inline void z3fold_page_unlock(struct z3fold_header *zhdr)
  191 {
  192 	spin_unlock(&zhdr->page_lock);
  193 }
  194 
  195 /*
  196  * Encodes the handle of a particular buddy within a z3fold page
  197  * Pool lock should be held as this function accesses first_num
  198  */
  199 static unsigned long encode_handle(struct z3fold_header *zhdr, enum buddy bud)
  200 {
  201 	unsigned long handle;
  202 
  203 	handle = (unsigned long)zhdr;
  204 	if (bud != HEADLESS)
  205 		handle += (bud + zhdr->first_num) & BUDDY_MASK;
  206 	return handle;
  207 }
  208 
  209 /* Returns the z3fold page where a given handle is stored */
  210 static struct z3fold_header *handle_to_z3fold_header(unsigned long handle)
  211 {
  212 	return (struct z3fold_header *)(handle & PAGE_MASK);
  213 }
  214 
  215 /*
  216  * (handle & BUDDY_MASK) < zhdr->first_num is possible in encode_handle
  217  *  but that doesn't matter. because the masking will result in the
  218  *  correct buddy number.
  219  */
  220 static enum buddy handle_to_buddy(unsigned long handle)
  221 {
  222 	struct z3fold_header *zhdr = handle_to_z3fold_header(handle);
  223 	return (handle - zhdr->first_num) & BUDDY_MASK;
  224 }
  225 
  226 /*
  227  * Returns the number of free chunks in a z3fold page.
  228  * NB: can't be used with HEADLESS pages.
  229  */
  230 static int num_free_chunks(struct z3fold_header *zhdr)
  231 {
  232 	int nfree;
  233 	/*
  234 	 * If there is a middle object, pick up the bigger free space
  235 	 * either before or after it. Otherwise just subtract the number
  236 	 * of chunks occupied by the first and the last objects.
  237 	 */
  238 	if (zhdr->middle_chunks != 0) {
  239 		int nfree_before = zhdr->first_chunks ?
  240 			0 : zhdr->start_middle - ZHDR_CHUNKS;
  241 		int nfree_after = zhdr->last_chunks ?
  242 			0 : TOTAL_CHUNKS -
  243 				(zhdr->start_middle + zhdr->middle_chunks);
  244 		nfree = max(nfree_before, nfree_after);
  245 	} else
  246 		nfree = NCHUNKS - zhdr->first_chunks - zhdr->last_chunks;
  247 	return nfree;
  248 }
  249 
  250 /*****************
  251  * API Functions
  252 *****************/
  253 /**
  254  * z3fold_create_pool() - create a new z3fold pool
  255  * @gfp:	gfp flags when allocating the z3fold pool structure
  256  * @ops:	user-defined operations for the z3fold pool
  257  *
  258  * Return: pointer to the new z3fold pool or NULL if the metadata allocation
  259  * failed.
  260  */
  261 static struct z3fold_pool *z3fold_create_pool(gfp_t gfp,
  262 		const struct z3fold_ops *ops)
  263 {
  264 	struct z3fold_pool *pool;
  265 	int i;
  266 
  267 	pool = kzalloc(sizeof(struct z3fold_pool), gfp);
  268 	if (!pool)
  269 		return NULL;
  270 	spin_lock_init(&pool->lock);
  271 	for_each_unbuddied_list(i, 0)
  272 		INIT_LIST_HEAD(&pool->unbuddied[i]);
  273 	INIT_LIST_HEAD(&pool->lru);
  274 	atomic64_set(&pool->pages_nr, 0);
  275 	pool->ops = ops;
  276 	return pool;
  277 }
  278 
  279 /**
  280  * z3fold_destroy_pool() - destroys an existing z3fold pool
  281  * @pool:	the z3fold pool to be destroyed
  282  *
  283  * The pool should be emptied before this function is called.
  284  */
  285 static void z3fold_destroy_pool(struct z3fold_pool *pool)
  286 {
  287 	kfree(pool);
  288 }
  289 
  290 static inline void *mchunk_memmove(struct z3fold_header *zhdr,
  291 				unsigned short dst_chunk)
  292 {
  293 	void *beg = zhdr;
  294 	return memmove(beg + (dst_chunk << CHUNK_SHIFT),
  295 		       beg + (zhdr->start_middle << CHUNK_SHIFT),
  296 		       zhdr->middle_chunks << CHUNK_SHIFT);
  297 }
  298 
  299 #define BIG_CHUNK_GAP	3
  300 /* Has to be called with lock held */
  301 static int z3fold_compact_page(struct z3fold_header *zhdr)
  302 {
  303 	struct page *page = virt_to_page(zhdr);
  304 
  305 	if (test_bit(MIDDLE_CHUNK_MAPPED, &page->private))
  306 		return 0; /* can't move middle chunk, it's used */
  307 
  308 	if (zhdr->middle_chunks == 0)
  309 		return 0; /* nothing to compact */
  310 
  311 	if (zhdr->first_chunks == 0 && zhdr->last_chunks == 0) {
  312 		/* move to the beginning */
  313 		mchunk_memmove(zhdr, ZHDR_CHUNKS);
  314 		zhdr->first_chunks = zhdr->middle_chunks;
  315 		zhdr->middle_chunks = 0;
  316 		zhdr->start_middle = 0;
  317 		zhdr->first_num++;
  318 		return 1;
  319 	}
  320 
  321 	/*
  322 	 * moving data is expensive, so let's only do that if
  323 	 * there's substantial gain (at least BIG_CHUNK_GAP chunks)
  324 	 */
  325 	if (zhdr->first_chunks != 0 && zhdr->last_chunks == 0 &&
  326 	    zhdr->start_middle - (zhdr->first_chunks + ZHDR_CHUNKS) >=
  327 			BIG_CHUNK_GAP) {
  328 		mchunk_memmove(zhdr, zhdr->first_chunks + ZHDR_CHUNKS);
  329 		zhdr->start_middle = zhdr->first_chunks + ZHDR_CHUNKS;
  330 		return 1;
  331 	} else if (zhdr->last_chunks != 0 && zhdr->first_chunks == 0 &&
  332 		   TOTAL_CHUNKS - (zhdr->last_chunks + zhdr->start_middle
  333 					+ zhdr->middle_chunks) >=
  334 			BIG_CHUNK_GAP) {
  335 		unsigned short new_start = TOTAL_CHUNKS - zhdr->last_chunks -
  336 			zhdr->middle_chunks;
  337 		mchunk_memmove(zhdr, new_start);
  338 		zhdr->start_middle = new_start;
  339 		return 1;
  340 	}
  341 
  342 	return 0;
  343 }
  344 
  345 /**
  346  * z3fold_alloc() - allocates a region of a given size
  347  * @pool:	z3fold pool from which to allocate
  348  * @size:	size in bytes of the desired allocation
  349  * @gfp:	gfp flags used if the pool needs to grow
  350  * @handle:	handle of the new allocation
  351  *
  352  * This function will attempt to find a free region in the pool large enough to
  353  * satisfy the allocation request.  A search of the unbuddied lists is
  354  * performed first. If no suitable free region is found, then a new page is
  355  * allocated and added to the pool to satisfy the request.
  356  *
  357  * gfp should not set __GFP_HIGHMEM as highmem pages cannot be used
  358  * as z3fold pool pages.
  359  *
  360  * Return: 0 if success and handle is set, otherwise -EINVAL if the size or
  361  * gfp arguments are invalid or -ENOMEM if the pool was unable to allocate
  362  * a new page.
  363  */
  364 static int z3fold_alloc(struct z3fold_pool *pool, size_t size, gfp_t gfp,
  365 			unsigned long *handle)
  366 {
  367 	int chunks = 0, i, freechunks;
  368 	struct z3fold_header *zhdr = NULL;
  369 	enum buddy bud;
  370 	struct page *page;
  371 
  372 	if (!size || (gfp & __GFP_HIGHMEM))
  373 		return -EINVAL;
  374 
  375 	if (size > PAGE_SIZE)
  376 		return -ENOSPC;
  377 
  378 	if (size > PAGE_SIZE - ZHDR_SIZE_ALIGNED - CHUNK_SIZE)
  379 		bud = HEADLESS;
  380 	else {
  381 		chunks = size_to_chunks(size);
  382 
  383 		/* First, try to find an unbuddied z3fold page. */
  384 		zhdr = NULL;
  385 		for_each_unbuddied_list(i, chunks) {
  386 			spin_lock(&pool->lock);
  387 			zhdr = list_first_entry_or_null(&pool->unbuddied[i],
  388 						struct z3fold_header, buddy);
  389 			if (!zhdr) {
  390 				spin_unlock(&pool->lock);
  391 				continue;
  392 			}
  393 			kref_get(&zhdr->refcount);
  394 			list_del_init(&zhdr->buddy);
  395 			spin_unlock(&pool->lock);
  396 
  397 			page = virt_to_page(zhdr);
  398 			z3fold_page_lock(zhdr);
  399 			if (zhdr->first_chunks == 0) {
  400 				if (zhdr->middle_chunks != 0 &&
  401 				    chunks >= zhdr->start_middle)
  402 					bud = LAST;
  403 				else
  404 					bud = FIRST;
  405 			} else if (zhdr->last_chunks == 0)
  406 				bud = LAST;
  407 			else if (zhdr->middle_chunks == 0)
  408 				bud = MIDDLE;
  409 			else {
  410 				z3fold_page_unlock(zhdr);
  411 				spin_lock(&pool->lock);
  412 				if (kref_put(&zhdr->refcount,
  413 					     release_z3fold_page))
  414 					atomic64_dec(&pool->pages_nr);
  415 				spin_unlock(&pool->lock);
  416 				pr_err("No free chunks in unbuddied\n");
  417 				WARN_ON(1);
  418 				continue;
  419 			}
  420 			goto found;
  421 		}
  422 		bud = FIRST;
  423 	}
  424 
  425 	/* Couldn't find unbuddied z3fold page, create new one */
  426 	page = alloc_page(gfp);
  427 	if (!page)
  428 		return -ENOMEM;
  429 
  430 	atomic64_inc(&pool->pages_nr);
  431 	zhdr = init_z3fold_page(page);
  432 
  433 	if (bud == HEADLESS) {
  434 		set_bit(PAGE_HEADLESS, &page->private);
  435 		spin_lock(&pool->lock);
  436 		goto headless;
  437 	}
  438 	z3fold_page_lock(zhdr);
  439 
  440 found:
  441 	if (bud == FIRST)
  442 		zhdr->first_chunks = chunks;
  443 	else if (bud == LAST)
  444 		zhdr->last_chunks = chunks;
  445 	else {
  446 		zhdr->middle_chunks = chunks;
  447 		zhdr->start_middle = zhdr->first_chunks + ZHDR_CHUNKS;
  448 	}
  449 
  450 	spin_lock(&pool->lock);
  451 	if (zhdr->first_chunks == 0 || zhdr->last_chunks == 0 ||
  452 			zhdr->middle_chunks == 0) {
  453 		/* Add to unbuddied list */
  454 		freechunks = num_free_chunks(zhdr);
  455 		list_add(&zhdr->buddy, &pool->unbuddied[freechunks]);
  456 	}
  457 
  458 headless:
  459 	/* Add/move z3fold page to beginning of LRU */
  460 	if (!list_empty(&page->lru))
  461 		list_del(&page->lru);
  462 
  463 	list_add(&page->lru, &pool->lru);
  464 
  465 	*handle = encode_handle(zhdr, bud);
  466 	spin_unlock(&pool->lock);
  467 	if (bud != HEADLESS)
  468 		z3fold_page_unlock(zhdr);
  469 
  470 	return 0;
  471 }
  472 
  473 /**
  474  * z3fold_free() - frees the allocation associated with the given handle
  475  * @pool:	pool in which the allocation resided
  476  * @handle:	handle associated with the allocation returned by z3fold_alloc()
  477  *
  478  * In the case that the z3fold page in which the allocation resides is under
  479  * reclaim, as indicated by the PG_reclaim flag being set, this function
  480  * only sets the first|last_chunks to 0.  The page is actually freed
  481  * once both buddies are evicted (see z3fold_reclaim_page() below).
  482  */
  483 static void z3fold_free(struct z3fold_pool *pool, unsigned long handle)
  484 {
  485 	struct z3fold_header *zhdr;
  486 	int freechunks;
  487 	struct page *page;
  488 	enum buddy bud;
  489 
  490 	zhdr = handle_to_z3fold_header(handle);
  491 	page = virt_to_page(zhdr);
  492 
  493 	if (test_bit(PAGE_HEADLESS, &page->private)) {
  494 		/* HEADLESS page stored */
  495 		bud = HEADLESS;
  496 	} else {
  497 		z3fold_page_lock(zhdr);
  498 		bud = handle_to_buddy(handle);
  499 
  500 		switch (bud) {
  501 		case FIRST:
  502 			zhdr->first_chunks = 0;
  503 			break;
  504 		case MIDDLE:
  505 			zhdr->middle_chunks = 0;
  506 			zhdr->start_middle = 0;
  507 			break;
  508 		case LAST:
  509 			zhdr->last_chunks = 0;
  510 			break;
  511 		default:
  512 			pr_err("%s: unknown bud %d\n", __func__, bud);
  513 			WARN_ON(1);
  514 			z3fold_page_unlock(zhdr);
  515 			return;
  516 		}
  517 	}
  518 
  519 	if (bud == HEADLESS) {
  520 		spin_lock(&pool->lock);
  521 		list_del(&page->lru);
  522 		spin_unlock(&pool->lock);
  523 		free_z3fold_page(page);
  524 		atomic64_dec(&pool->pages_nr);
  525 	} else {
  526 		if (zhdr->first_chunks != 0 || zhdr->middle_chunks != 0 ||
  527 		    zhdr->last_chunks != 0) {
  528 			z3fold_compact_page(zhdr);
  529 			/* Add to the unbuddied list */
  530 			spin_lock(&pool->lock);
  531 			if (!list_empty(&zhdr->buddy))
  532 				list_del(&zhdr->buddy);
  533 			freechunks = num_free_chunks(zhdr);
  534 			list_add(&zhdr->buddy, &pool->unbuddied[freechunks]);
  535 			spin_unlock(&pool->lock);
  536 		}
  537 		z3fold_page_unlock(zhdr);
  538 		spin_lock(&pool->lock);
  539 		if (kref_put(&zhdr->refcount, release_z3fold_page))
  540 			atomic64_dec(&pool->pages_nr);
  541 		spin_unlock(&pool->lock);
  542 	}
  543 
  544 }
  545 
  546 /**
  547  * z3fold_reclaim_page() - evicts allocations from a pool page and frees it
  548  * @pool:	pool from which a page will attempt to be evicted
  549  * @retires:	number of pages on the LRU list for which eviction will
  550  *		be attempted before failing
  551  *
  552  * z3fold reclaim is different from normal system reclaim in that it is done
  553  * from the bottom, up. This is because only the bottom layer, z3fold, has
  554  * information on how the allocations are organized within each z3fold page.
  555  * This has the potential to create interesting locking situations between
  556  * z3fold and the user, however.
  557  *
  558  * To avoid these, this is how z3fold_reclaim_page() should be called:
  559 
  560  * The user detects a page should be reclaimed and calls z3fold_reclaim_page().
  561  * z3fold_reclaim_page() will remove a z3fold page from the pool LRU list and
  562  * call the user-defined eviction handler with the pool and handle as
  563  * arguments.
  564  *
  565  * If the handle can not be evicted, the eviction handler should return
  566  * non-zero. z3fold_reclaim_page() will add the z3fold page back to the
  567  * appropriate list and try the next z3fold page on the LRU up to
  568  * a user defined number of retries.
  569  *
  570  * If the handle is successfully evicted, the eviction handler should
  571  * return 0 _and_ should have called z3fold_free() on the handle. z3fold_free()
  572  * contains logic to delay freeing the page if the page is under reclaim,
  573  * as indicated by the setting of the PG_reclaim flag on the underlying page.
  574  *
  575  * If all buddies in the z3fold page are successfully evicted, then the
  576  * z3fold page can be freed.
  577  *
  578  * Returns: 0 if page is successfully freed, otherwise -EINVAL if there are
  579  * no pages to evict or an eviction handler is not registered, -EAGAIN if
  580  * the retry limit was hit.
  581  */
  582 static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries)
  583 {
  584 	int i, ret = 0, freechunks;
  585 	struct z3fold_header *zhdr;
  586 	struct page *page;
  587 	unsigned long first_handle = 0, middle_handle = 0, last_handle = 0;
  588 
  589 	spin_lock(&pool->lock);
  590 	if (!pool->ops || !pool->ops->evict || retries == 0) {
  591 		spin_unlock(&pool->lock);
  592 		return -EINVAL;
  593 	}
  594 	for (i = 0; i < retries; i++) {
  595 		if (list_empty(&pool->lru)) {
  596 			spin_unlock(&pool->lock);
  597 			return -EINVAL;
  598 		}
  599 		page = list_last_entry(&pool->lru, struct page, lru);
  600 		list_del_init(&page->lru);
  601 
  602 		zhdr = page_address(page);
  603 		if (!test_bit(PAGE_HEADLESS, &page->private)) {
  604 			if (!list_empty(&zhdr->buddy))
  605 				list_del_init(&zhdr->buddy);
  606 			kref_get(&zhdr->refcount);
  607 			spin_unlock(&pool->lock);
  608 			z3fold_page_lock(zhdr);
  609 			/*
  610 			 * We need encode the handles before unlocking, since
  611 			 * we can race with free that will set
  612 			 * (first|last)_chunks to 0
  613 			 */
  614 			first_handle = 0;
  615 			last_handle = 0;
  616 			middle_handle = 0;
  617 			if (zhdr->first_chunks)
  618 				first_handle = encode_handle(zhdr, FIRST);
  619 			if (zhdr->middle_chunks)
  620 				middle_handle = encode_handle(zhdr, MIDDLE);
  621 			if (zhdr->last_chunks)
  622 				last_handle = encode_handle(zhdr, LAST);
  623 			z3fold_page_unlock(zhdr);
  624 		} else {
  625 			first_handle = encode_handle(zhdr, HEADLESS);
  626 			last_handle = middle_handle = 0;
  627 			spin_unlock(&pool->lock);
  628 		}
  629 
  630 		/* Issue the eviction callback(s) */
  631 		if (middle_handle) {
  632 			ret = pool->ops->evict(pool, middle_handle);
  633 			if (ret)
  634 				goto next;
  635 		}
  636 		if (first_handle) {
  637 			ret = pool->ops->evict(pool, first_handle);
  638 			if (ret)
  639 				goto next;
  640 		}
  641 		if (last_handle) {
  642 			ret = pool->ops->evict(pool, last_handle);
  643 			if (ret)
  644 				goto next;
  645 		}
  646 next:
  647 		if (test_bit(PAGE_HEADLESS, &page->private)) {
  648 			if (ret == 0) {
  649 				free_z3fold_page(page);
  650 				return 0;
  651 			} else {
  652 				spin_lock(&pool->lock);
  653 			}
  654 		} else {
  655 			z3fold_page_lock(zhdr);
  656 			if ((zhdr->first_chunks || zhdr->last_chunks ||
  657 			     zhdr->middle_chunks) &&
  658 			    !(zhdr->first_chunks && zhdr->last_chunks &&
  659 			      zhdr->middle_chunks)) {
  660 				z3fold_compact_page(zhdr);
  661 				/* add to unbuddied list */
  662 				spin_lock(&pool->lock);
  663 				freechunks = num_free_chunks(zhdr);
  664 				list_add(&zhdr->buddy,
  665 					 &pool->unbuddied[freechunks]);
  666 				spin_unlock(&pool->lock);
  667 			}
  668 			z3fold_page_unlock(zhdr);
  669 			spin_lock(&pool->lock);
  670 			if (kref_put(&zhdr->refcount, release_z3fold_page)) {
  671 				atomic64_dec(&pool->pages_nr);
  672 				return 0;
  673 			}
  674 		}
  675 
  676 		/*
  677 		 * Add to the beginning of LRU.
  678 		 * Pool lock has to be kept here to ensure the page has
  679 		 * not already been released
  680 		 */
  681 		list_add(&page->lru, &pool->lru);
  682 	}
  683 	spin_unlock(&pool->lock);
  684 	return -EAGAIN;
  685 }
  686 
  687 /**
  688  * z3fold_map() - maps the allocation associated with the given handle
  689  * @pool:	pool in which the allocation resides
  690  * @handle:	handle associated with the allocation to be mapped
  691  *
  692  * Extracts the buddy number from handle and constructs the pointer to the
  693  * correct starting chunk within the page.
  694  *
  695  * Returns: a pointer to the mapped allocation
  696  */
  697 static void *z3fold_map(struct z3fold_pool *pool, unsigned long handle)
  698 {
  699 	struct z3fold_header *zhdr;
  700 	struct page *page;
  701 	void *addr;
  702 	enum buddy buddy;
  703 
  704 	zhdr = handle_to_z3fold_header(handle);
  705 	addr = zhdr;
  706 	page = virt_to_page(zhdr);
  707 
  708 	if (test_bit(PAGE_HEADLESS, &page->private))
  709 		goto out;
  710 
  711 	z3fold_page_lock(zhdr);
  712 	buddy = handle_to_buddy(handle);
  713 	switch (buddy) {
  714 	case FIRST:
  715 		addr += ZHDR_SIZE_ALIGNED;
  716 		break;
  717 	case MIDDLE:
  718 		addr += zhdr->start_middle << CHUNK_SHIFT;
  719 		set_bit(MIDDLE_CHUNK_MAPPED, &page->private);
  720 		break;
  721 	case LAST:
  722 		addr += PAGE_SIZE - (zhdr->last_chunks << CHUNK_SHIFT);
  723 		break;
  724 	default:
  725 		pr_err("unknown buddy id %d\n", buddy);
  726 		WARN_ON(1);
  727 		addr = NULL;
  728 		break;
  729 	}
  730 
  731 	z3fold_page_unlock(zhdr);
  732 out:
  733 	return addr;
  734 }
  735 
  736 /**
  737  * z3fold_unmap() - unmaps the allocation associated with the given handle
  738  * @pool:	pool in which the allocation resides
  739  * @handle:	handle associated with the allocation to be unmapped
  740  */
  741 static void z3fold_unmap(struct z3fold_pool *pool, unsigned long handle)
  742 {
  743 	struct z3fold_header *zhdr;
  744 	struct page *page;
  745 	enum buddy buddy;
  746 
  747 	zhdr = handle_to_z3fold_header(handle);
  748 	page = virt_to_page(zhdr);
  749 
  750 	if (test_bit(PAGE_HEADLESS, &page->private))
  751 		return;
  752 
  753 	z3fold_page_lock(zhdr);
  754 	buddy = handle_to_buddy(handle);
  755 	if (buddy == MIDDLE)
  756 		clear_bit(MIDDLE_CHUNK_MAPPED, &page->private);
  757 	z3fold_page_unlock(zhdr);
  758 }
  759 
  760 /**
  761  * z3fold_get_pool_size() - gets the z3fold pool size in pages
  762  * @pool:	pool whose size is being queried
  763  *
  764  * Returns: size in pages of the given pool.
  765  */
  766 static u64 z3fold_get_pool_size(struct z3fold_pool *pool)
  767 {
  768 	return atomic64_read(&pool->pages_nr);
  769 }
  770 
  771 /*****************
  772  * zpool
  773  ****************/
  774 
  775 static int z3fold_zpool_evict(struct z3fold_pool *pool, unsigned long handle)
  776 {
  777 	if (pool->zpool && pool->zpool_ops && pool->zpool_ops->evict)
  778 		return pool->zpool_ops->evict(pool->zpool, handle);
  779 	else
  780 		return -ENOENT;
  781 }
  782 
  783 static const struct z3fold_ops z3fold_zpool_ops = {
  784 	.evict =	z3fold_zpool_evict
  785 };
  786 
  787 static void *z3fold_zpool_create(const char *name, gfp_t gfp,
  788 			       const struct zpool_ops *zpool_ops,
  789 			       struct zpool *zpool)
  790 {
  791 	struct z3fold_pool *pool;
  792 
  793 	pool = z3fold_create_pool(gfp, zpool_ops ? &z3fold_zpool_ops : NULL);
  794 	if (pool) {
  795 		pool->zpool = zpool;
  796 		pool->zpool_ops = zpool_ops;
  797 	}
  798 	return pool;
  799 }
  800 
  801 static void z3fold_zpool_destroy(void *pool)
  802 {
  803 	z3fold_destroy_pool(pool);
  804 }
  805 
  806 static int z3fold_zpool_malloc(void *pool, size_t size, gfp_t gfp,
  807 			unsigned long *handle)
  808 {
  809 	return z3fold_alloc(pool, size, gfp, handle);
  810 }
  811 static void z3fold_zpool_free(void *pool, unsigned long handle)
  812 {
  813 	z3fold_free(pool, handle);
  814 }
  815 
  816 static int z3fold_zpool_shrink(void *pool, unsigned int pages,
  817 			unsigned int *reclaimed)
  818 {
  819 	unsigned int total = 0;
  820 	int ret = -EINVAL;
  821 
  822 	while (total < pages) {
  823 		ret = z3fold_reclaim_page(pool, 8);
  824 		if (ret < 0)
  825 			break;
  826 		total++;
  827 	}
  828 
  829 	if (reclaimed)
  830 		*reclaimed = total;
  831 
  832 	return ret;
  833 }
  834 
  835 static void *z3fold_zpool_map(void *pool, unsigned long handle,
  836 			enum zpool_mapmode mm)
  837 {
  838 	return z3fold_map(pool, handle);
  839 }
  840 static void z3fold_zpool_unmap(void *pool, unsigned long handle)
  841 {
  842 	z3fold_unmap(pool, handle);
  843 }
  844 
  845 static u64 z3fold_zpool_total_size(void *pool)
  846 {
  847 	return z3fold_get_pool_size(pool) * PAGE_SIZE;
  848 }
  849 
  850 static struct zpool_driver z3fold_zpool_driver = {
  851 	.type =		"z3fold",
  852 	.owner =	THIS_MODULE,
  853 	.create =	z3fold_zpool_create,
  854 	.destroy =	z3fold_zpool_destroy,
  855 	.malloc =	z3fold_zpool_malloc,
  856 	.free =		z3fold_zpool_free,
  857 	.shrink =	z3fold_zpool_shrink,
  858 	.map =		z3fold_zpool_map,
  859 	.unmap =	z3fold_zpool_unmap,
  860 	.total_size =	z3fold_zpool_total_size,
  861 };
  862 
  863 MODULE_ALIAS("zpool-z3fold");
  864 
  865 static int __init init_z3fold(void)
  866 {
  867 	/* Make sure the z3fold header is not larger than the page size */
  868 	BUILD_BUG_ON(ZHDR_SIZE_ALIGNED > PAGE_SIZE);
  869 	zpool_register_driver(&z3fold_zpool_driver);
  870 
  871 	return 0;
  872 }
  873 
  874 static void __exit exit_z3fold(void)
  875 {
  876 	zpool_unregister_driver(&z3fold_zpool_driver);
  877 }
  878 
  879 module_init(init_z3fold);
  880 module_exit(exit_z3fold);
  881 
  882 MODULE_LICENSE("GPL");
  883 MODULE_AUTHOR("Vitaly Wool <vitalywool@gmail.com>");
  884 MODULE_DESCRIPTION("3-Fold Allocator for Compressed Pages");
  885 
  886 
  887 
  888 
  889 
  890 /* LDV_COMMENT_BEGIN_MAIN */
  891 #ifdef LDV_MAIN0_sequence_infinite_withcheck_stateful
  892 
  893 /*###########################################################################*/
  894 
  895 /*############## Driver Environment Generator 0.2 output ####################*/
  896 
  897 /*###########################################################################*/
  898 
  899 
  900 
  901 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test if all kernel resources are correctly released by driver before driver will be unloaded. */
  902 void ldv_check_final_state(void);
  903 
  904 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result. */
  905 void ldv_check_return_value(int res);
  906 
  907 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result of probe() function. */
  908 void ldv_check_return_value_probe(int res);
  909 
  910 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Initializes the model. */
  911 void ldv_initialize(void);
  912 
  913 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Reinitializes the model between distinct model function calls. */
  914 void ldv_handler_precall(void);
  915 
  916 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Returns arbitrary interger value. */
  917 int nondet_int(void);
  918 
  919 /* LDV_COMMENT_VAR_DECLARE_LDV Special variable for LDV verifier. */
  920 int LDV_IN_INTERRUPT;
  921 
  922 /* LDV_COMMENT_FUNCTION_MAIN Main function for LDV verifier. */
  923 void ldv_main0_sequence_infinite_withcheck_stateful(void) {
  924 
  925 
  926 
  927 	/* LDV_COMMENT_BEGIN_VARIABLE_DECLARATION_PART */
  928 	/*============================= VARIABLE DECLARATION PART   =============================*/
  929 	/** STRUCT: struct type: z3fold_ops, struct name: z3fold_zpool_ops **/
  930 	/* content: static int z3fold_zpool_evict(struct z3fold_pool *pool, unsigned long handle)*/
  931 	/* LDV_COMMENT_BEGIN_PREP */
  932 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  933 	#define NCHUNKS_ORDER	6
  934 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
  935 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
  936 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
  937 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
  938 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
  939 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
  940 	#define BUDDY_MASK	(0x3)
  941 	#define for_each_unbuddied_list(_iter, _begin) \
  942 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
  943 	#define BIG_CHUNK_GAP	3
  944 	/* LDV_COMMENT_END_PREP */
  945 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_evict" */
  946 	struct z3fold_pool * var_group1;
  947 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_evict" */
  948 	unsigned long  var_z3fold_zpool_evict_20_p1;
  949 
  950 	/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
  951 	/* content: static void *z3fold_zpool_create(const char *name, gfp_t gfp, const struct zpool_ops *zpool_ops, struct zpool *zpool)*/
  952 	/* LDV_COMMENT_BEGIN_PREP */
  953 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  954 	#define NCHUNKS_ORDER	6
  955 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
  956 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
  957 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
  958 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
  959 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
  960 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
  961 	#define BUDDY_MASK	(0x3)
  962 	#define for_each_unbuddied_list(_iter, _begin) \
  963 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
  964 	#define BIG_CHUNK_GAP	3
  965 	/* LDV_COMMENT_END_PREP */
  966 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_create" */
  967 	const char * var_z3fold_zpool_create_21_p0;
  968 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_create" */
  969 	gfp_t  var_z3fold_zpool_create_21_p1;
  970 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_create" */
  971 	const struct zpool_ops * var_z3fold_zpool_create_21_p2;
  972 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_create" */
  973 	struct zpool * var_z3fold_zpool_create_21_p3;
  974 	/* content: static void z3fold_zpool_destroy(void *pool)*/
  975 	/* LDV_COMMENT_BEGIN_PREP */
  976 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  977 	#define NCHUNKS_ORDER	6
  978 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
  979 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
  980 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
  981 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
  982 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
  983 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
  984 	#define BUDDY_MASK	(0x3)
  985 	#define for_each_unbuddied_list(_iter, _begin) \
  986 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
  987 	#define BIG_CHUNK_GAP	3
  988 	/* LDV_COMMENT_END_PREP */
  989 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_destroy" */
  990 	void * var_z3fold_zpool_destroy_22_p0;
  991 	/* content: static int z3fold_zpool_malloc(void *pool, size_t size, gfp_t gfp, unsigned long *handle)*/
  992 	/* LDV_COMMENT_BEGIN_PREP */
  993 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  994 	#define NCHUNKS_ORDER	6
  995 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
  996 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
  997 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
  998 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
  999 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1000 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1001 	#define BUDDY_MASK	(0x3)
 1002 	#define for_each_unbuddied_list(_iter, _begin) \
 1003 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1004 	#define BIG_CHUNK_GAP	3
 1005 	/* LDV_COMMENT_END_PREP */
 1006 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_malloc" */
 1007 	void * var_z3fold_zpool_malloc_23_p0;
 1008 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_malloc" */
 1009 	size_t  var_z3fold_zpool_malloc_23_p1;
 1010 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_malloc" */
 1011 	gfp_t  var_z3fold_zpool_malloc_23_p2;
 1012 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_malloc" */
 1013 	unsigned long * var_z3fold_zpool_malloc_23_p3;
 1014 	/* content: static void z3fold_zpool_free(void *pool, unsigned long handle)*/
 1015 	/* LDV_COMMENT_BEGIN_PREP */
 1016 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1017 	#define NCHUNKS_ORDER	6
 1018 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1019 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1020 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1021 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1022 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1023 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1024 	#define BUDDY_MASK	(0x3)
 1025 	#define for_each_unbuddied_list(_iter, _begin) \
 1026 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1027 	#define BIG_CHUNK_GAP	3
 1028 	/* LDV_COMMENT_END_PREP */
 1029 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_free" */
 1030 	void * var_z3fold_zpool_free_24_p0;
 1031 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_free" */
 1032 	unsigned long  var_z3fold_zpool_free_24_p1;
 1033 	/* content: static int z3fold_zpool_shrink(void *pool, unsigned int pages, unsigned int *reclaimed)*/
 1034 	/* LDV_COMMENT_BEGIN_PREP */
 1035 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1036 	#define NCHUNKS_ORDER	6
 1037 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1038 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1039 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1040 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1041 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1042 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1043 	#define BUDDY_MASK	(0x3)
 1044 	#define for_each_unbuddied_list(_iter, _begin) \
 1045 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1046 	#define BIG_CHUNK_GAP	3
 1047 	/* LDV_COMMENT_END_PREP */
 1048 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_shrink" */
 1049 	void * var_z3fold_zpool_shrink_25_p0;
 1050 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_shrink" */
 1051 	unsigned int  var_z3fold_zpool_shrink_25_p1;
 1052 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_shrink" */
 1053 	unsigned int * var_z3fold_zpool_shrink_25_p2;
 1054 	/* content: static void *z3fold_zpool_map(void *pool, unsigned long handle, enum zpool_mapmode mm)*/
 1055 	/* LDV_COMMENT_BEGIN_PREP */
 1056 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1057 	#define NCHUNKS_ORDER	6
 1058 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1059 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1060 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1061 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1062 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1063 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1064 	#define BUDDY_MASK	(0x3)
 1065 	#define for_each_unbuddied_list(_iter, _begin) \
 1066 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1067 	#define BIG_CHUNK_GAP	3
 1068 	/* LDV_COMMENT_END_PREP */
 1069 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_map" */
 1070 	void * var_z3fold_zpool_map_26_p0;
 1071 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_map" */
 1072 	unsigned long  var_z3fold_zpool_map_26_p1;
 1073 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_map" */
 1074 	enum zpool_mapmode  var_z3fold_zpool_map_26_p2;
 1075 	/* content: static void z3fold_zpool_unmap(void *pool, unsigned long handle)*/
 1076 	/* LDV_COMMENT_BEGIN_PREP */
 1077 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1078 	#define NCHUNKS_ORDER	6
 1079 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1080 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1081 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1082 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1083 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1084 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1085 	#define BUDDY_MASK	(0x3)
 1086 	#define for_each_unbuddied_list(_iter, _begin) \
 1087 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1088 	#define BIG_CHUNK_GAP	3
 1089 	/* LDV_COMMENT_END_PREP */
 1090 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_unmap" */
 1091 	void * var_z3fold_zpool_unmap_27_p0;
 1092 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_unmap" */
 1093 	unsigned long  var_z3fold_zpool_unmap_27_p1;
 1094 	/* content: static u64 z3fold_zpool_total_size(void *pool)*/
 1095 	/* LDV_COMMENT_BEGIN_PREP */
 1096 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1097 	#define NCHUNKS_ORDER	6
 1098 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1099 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1100 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1101 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1102 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1103 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1104 	#define BUDDY_MASK	(0x3)
 1105 	#define for_each_unbuddied_list(_iter, _begin) \
 1106 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1107 	#define BIG_CHUNK_GAP	3
 1108 	/* LDV_COMMENT_END_PREP */
 1109 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_total_size" */
 1110 	void * var_z3fold_zpool_total_size_28_p0;
 1111 
 1112 
 1113 
 1114 
 1115 	/* LDV_COMMENT_END_VARIABLE_DECLARATION_PART */
 1116 	/* LDV_COMMENT_BEGIN_VARIABLE_INITIALIZING_PART */
 1117 	/*============================= VARIABLE INITIALIZING PART  =============================*/
 1118 	LDV_IN_INTERRUPT=1;
 1119 
 1120 
 1121 
 1122 
 1123 	/* LDV_COMMENT_END_VARIABLE_INITIALIZING_PART */
 1124 	/* LDV_COMMENT_BEGIN_FUNCTION_CALL_SECTION */
 1125 	/*============================= FUNCTION CALL SECTION       =============================*/
 1126 	/* LDV_COMMENT_FUNCTION_CALL Initialize LDV model. */
 1127 	ldv_initialize();
 1128 
 1129 	/** INIT: init_type: ST_MODULE_INIT **/
 1130 	/* content: static int __init init_z3fold(void)*/
 1131 	/* LDV_COMMENT_BEGIN_PREP */
 1132 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1133 	#define NCHUNKS_ORDER	6
 1134 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1135 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1136 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1137 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1138 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1139 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1140 	#define BUDDY_MASK	(0x3)
 1141 	#define for_each_unbuddied_list(_iter, _begin) \
 1142 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1143 	#define BIG_CHUNK_GAP	3
 1144 	/* LDV_COMMENT_END_PREP */
 1145 	/* LDV_COMMENT_FUNCTION_CALL Kernel calls driver init function after driver loading to kernel. This function declared as "MODULE_INIT(function name)". */
 1146 	ldv_handler_precall();
 1147 	 if(init_z3fold()) 
 1148 		goto ldv_final;
 1149 	
 1150 
 1151 	
 1152 
 1153 
 1154 	while(  nondet_int()
 1155 	) {
 1156 
 1157 		switch(nondet_int()) {
 1158 
 1159 			case 0: {
 1160 
 1161 				/** STRUCT: struct type: z3fold_ops, struct name: z3fold_zpool_ops **/
 1162 				
 1163 
 1164 				/* content: static int z3fold_zpool_evict(struct z3fold_pool *pool, unsigned long handle)*/
 1165 				/* LDV_COMMENT_BEGIN_PREP */
 1166 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1167 				#define NCHUNKS_ORDER	6
 1168 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1169 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1170 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1171 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1172 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1173 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1174 				#define BUDDY_MASK	(0x3)
 1175 				#define for_each_unbuddied_list(_iter, _begin) \
 1176 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1177 				#define BIG_CHUNK_GAP	3
 1178 				/* LDV_COMMENT_END_PREP */
 1179 				/* LDV_COMMENT_FUNCTION_CALL Function from field "evict" from driver structure with callbacks "z3fold_zpool_ops" */
 1180 				ldv_handler_precall();
 1181 				z3fold_zpool_evict( var_group1, var_z3fold_zpool_evict_20_p1);
 1182 				
 1183 
 1184 				
 1185 
 1186 			}
 1187 
 1188 			break;
 1189 			case 1: {
 1190 
 1191 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1192 				
 1193 
 1194 				/* content: static void *z3fold_zpool_create(const char *name, gfp_t gfp, const struct zpool_ops *zpool_ops, struct zpool *zpool)*/
 1195 				/* LDV_COMMENT_BEGIN_PREP */
 1196 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1197 				#define NCHUNKS_ORDER	6
 1198 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1199 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1200 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1201 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1202 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1203 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1204 				#define BUDDY_MASK	(0x3)
 1205 				#define for_each_unbuddied_list(_iter, _begin) \
 1206 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1207 				#define BIG_CHUNK_GAP	3
 1208 				/* LDV_COMMENT_END_PREP */
 1209 				/* LDV_COMMENT_FUNCTION_CALL Function from field "create" from driver structure with callbacks "z3fold_zpool_driver" */
 1210 				ldv_handler_precall();
 1211 				z3fold_zpool_create( var_z3fold_zpool_create_21_p0, var_z3fold_zpool_create_21_p1, var_z3fold_zpool_create_21_p2, var_z3fold_zpool_create_21_p3);
 1212 				
 1213 
 1214 				
 1215 
 1216 			}
 1217 
 1218 			break;
 1219 			case 2: {
 1220 
 1221 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1222 				
 1223 
 1224 				/* content: static void z3fold_zpool_destroy(void *pool)*/
 1225 				/* LDV_COMMENT_BEGIN_PREP */
 1226 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1227 				#define NCHUNKS_ORDER	6
 1228 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1229 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1230 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1231 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1232 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1233 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1234 				#define BUDDY_MASK	(0x3)
 1235 				#define for_each_unbuddied_list(_iter, _begin) \
 1236 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1237 				#define BIG_CHUNK_GAP	3
 1238 				/* LDV_COMMENT_END_PREP */
 1239 				/* LDV_COMMENT_FUNCTION_CALL Function from field "destroy" from driver structure with callbacks "z3fold_zpool_driver" */
 1240 				ldv_handler_precall();
 1241 				z3fold_zpool_destroy( var_z3fold_zpool_destroy_22_p0);
 1242 				
 1243 
 1244 				
 1245 
 1246 			}
 1247 
 1248 			break;
 1249 			case 3: {
 1250 
 1251 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1252 				
 1253 
 1254 				/* content: static int z3fold_zpool_malloc(void *pool, size_t size, gfp_t gfp, unsigned long *handle)*/
 1255 				/* LDV_COMMENT_BEGIN_PREP */
 1256 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1257 				#define NCHUNKS_ORDER	6
 1258 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1259 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1260 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1261 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1262 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1263 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1264 				#define BUDDY_MASK	(0x3)
 1265 				#define for_each_unbuddied_list(_iter, _begin) \
 1266 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1267 				#define BIG_CHUNK_GAP	3
 1268 				/* LDV_COMMENT_END_PREP */
 1269 				/* LDV_COMMENT_FUNCTION_CALL Function from field "malloc" from driver structure with callbacks "z3fold_zpool_driver" */
 1270 				ldv_handler_precall();
 1271 				z3fold_zpool_malloc( var_z3fold_zpool_malloc_23_p0, var_z3fold_zpool_malloc_23_p1, var_z3fold_zpool_malloc_23_p2, var_z3fold_zpool_malloc_23_p3);
 1272 				
 1273 
 1274 				
 1275 
 1276 			}
 1277 
 1278 			break;
 1279 			case 4: {
 1280 
 1281 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1282 				
 1283 
 1284 				/* content: static void z3fold_zpool_free(void *pool, unsigned long handle)*/
 1285 				/* LDV_COMMENT_BEGIN_PREP */
 1286 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1287 				#define NCHUNKS_ORDER	6
 1288 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1289 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1290 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1291 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1292 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1293 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1294 				#define BUDDY_MASK	(0x3)
 1295 				#define for_each_unbuddied_list(_iter, _begin) \
 1296 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1297 				#define BIG_CHUNK_GAP	3
 1298 				/* LDV_COMMENT_END_PREP */
 1299 				/* LDV_COMMENT_FUNCTION_CALL Function from field "free" from driver structure with callbacks "z3fold_zpool_driver" */
 1300 				ldv_handler_precall();
 1301 				z3fold_zpool_free( var_z3fold_zpool_free_24_p0, var_z3fold_zpool_free_24_p1);
 1302 				
 1303 
 1304 				
 1305 
 1306 			}
 1307 
 1308 			break;
 1309 			case 5: {
 1310 
 1311 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1312 				
 1313 
 1314 				/* content: static int z3fold_zpool_shrink(void *pool, unsigned int pages, unsigned int *reclaimed)*/
 1315 				/* LDV_COMMENT_BEGIN_PREP */
 1316 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1317 				#define NCHUNKS_ORDER	6
 1318 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1319 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1320 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1321 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1322 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1323 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1324 				#define BUDDY_MASK	(0x3)
 1325 				#define for_each_unbuddied_list(_iter, _begin) \
 1326 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1327 				#define BIG_CHUNK_GAP	3
 1328 				/* LDV_COMMENT_END_PREP */
 1329 				/* LDV_COMMENT_FUNCTION_CALL Function from field "shrink" from driver structure with callbacks "z3fold_zpool_driver" */
 1330 				ldv_handler_precall();
 1331 				z3fold_zpool_shrink( var_z3fold_zpool_shrink_25_p0, var_z3fold_zpool_shrink_25_p1, var_z3fold_zpool_shrink_25_p2);
 1332 				
 1333 
 1334 				
 1335 
 1336 			}
 1337 
 1338 			break;
 1339 			case 6: {
 1340 
 1341 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1342 				
 1343 
 1344 				/* content: static void *z3fold_zpool_map(void *pool, unsigned long handle, enum zpool_mapmode mm)*/
 1345 				/* LDV_COMMENT_BEGIN_PREP */
 1346 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1347 				#define NCHUNKS_ORDER	6
 1348 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1349 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1350 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1351 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1352 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1353 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1354 				#define BUDDY_MASK	(0x3)
 1355 				#define for_each_unbuddied_list(_iter, _begin) \
 1356 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1357 				#define BIG_CHUNK_GAP	3
 1358 				/* LDV_COMMENT_END_PREP */
 1359 				/* LDV_COMMENT_FUNCTION_CALL Function from field "map" from driver structure with callbacks "z3fold_zpool_driver" */
 1360 				ldv_handler_precall();
 1361 				z3fold_zpool_map( var_z3fold_zpool_map_26_p0, var_z3fold_zpool_map_26_p1, var_z3fold_zpool_map_26_p2);
 1362 				
 1363 
 1364 				
 1365 
 1366 			}
 1367 
 1368 			break;
 1369 			case 7: {
 1370 
 1371 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1372 				
 1373 
 1374 				/* content: static void z3fold_zpool_unmap(void *pool, unsigned long handle)*/
 1375 				/* LDV_COMMENT_BEGIN_PREP */
 1376 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1377 				#define NCHUNKS_ORDER	6
 1378 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1379 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1380 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1381 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1382 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1383 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1384 				#define BUDDY_MASK	(0x3)
 1385 				#define for_each_unbuddied_list(_iter, _begin) \
 1386 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1387 				#define BIG_CHUNK_GAP	3
 1388 				/* LDV_COMMENT_END_PREP */
 1389 				/* LDV_COMMENT_FUNCTION_CALL Function from field "unmap" from driver structure with callbacks "z3fold_zpool_driver" */
 1390 				ldv_handler_precall();
 1391 				z3fold_zpool_unmap( var_z3fold_zpool_unmap_27_p0, var_z3fold_zpool_unmap_27_p1);
 1392 				
 1393 
 1394 				
 1395 
 1396 			}
 1397 
 1398 			break;
 1399 			case 8: {
 1400 
 1401 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1402 				
 1403 
 1404 				/* content: static u64 z3fold_zpool_total_size(void *pool)*/
 1405 				/* LDV_COMMENT_BEGIN_PREP */
 1406 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1407 				#define NCHUNKS_ORDER	6
 1408 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1409 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1410 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1411 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1412 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1413 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1414 				#define BUDDY_MASK	(0x3)
 1415 				#define for_each_unbuddied_list(_iter, _begin) \
 1416 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1417 				#define BIG_CHUNK_GAP	3
 1418 				/* LDV_COMMENT_END_PREP */
 1419 				/* LDV_COMMENT_FUNCTION_CALL Function from field "total_size" from driver structure with callbacks "z3fold_zpool_driver" */
 1420 				ldv_handler_precall();
 1421 				z3fold_zpool_total_size( var_z3fold_zpool_total_size_28_p0);
 1422 				
 1423 
 1424 				
 1425 
 1426 			}
 1427 
 1428 			break;
 1429 			default: break;
 1430 
 1431 		}
 1432 
 1433 	}
 1434 
 1435 	ldv_module_exit: 
 1436 
 1437 	/** INIT: init_type: ST_MODULE_EXIT **/
 1438 	/* content: static void __exit exit_z3fold(void)*/
 1439 	/* LDV_COMMENT_BEGIN_PREP */
 1440 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1441 	#define NCHUNKS_ORDER	6
 1442 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1443 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1444 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1445 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1446 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1447 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1448 	#define BUDDY_MASK	(0x3)
 1449 	#define for_each_unbuddied_list(_iter, _begin) \
 1450 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1451 	#define BIG_CHUNK_GAP	3
 1452 	/* LDV_COMMENT_END_PREP */
 1453 	/* LDV_COMMENT_FUNCTION_CALL Kernel calls driver release function before driver will be uploaded from kernel. This function declared as "MODULE_EXIT(function name)". */
 1454 	ldv_handler_precall();
 1455 	exit_z3fold();
 1456 
 1457 	/* LDV_COMMENT_FUNCTION_CALL Checks that all resources and locks are correctly released before the driver will be unloaded. */
 1458 	ldv_final: ldv_check_final_state();
 1459 
 1460 	/* LDV_COMMENT_END_FUNCTION_CALL_SECTION */
 1461 	return;
 1462 
 1463 }
 1464 #endif
 1465 
 1466 /* LDV_COMMENT_END_MAIN */                 1 
    2 #include <linux/kernel.h>
    3 bool ldv_is_err(const void *ptr);
    4 bool ldv_is_err_or_null(const void *ptr);
    5 void* ldv_err_ptr(long error);
    6 long ldv_ptr_err(const void *ptr);
    7 
    8 #include <linux/kernel.h>
    9 #include <linux/spinlock.h>
   10 
   11 extern void __ldv_spin_lock(spinlock_t *lock);
   12 extern void __ldv_spin_unlock(spinlock_t *lock);
   13 extern int __ldv_spin_trylock(spinlock_t *lock);
   14 extern void __ldv_spin_unlock_wait(spinlock_t *lock);
   15 extern void __ldv_spin_can_lock(spinlock_t *lock);
   16 extern int __ldv_atomic_dec_and_lock(spinlock_t *lock);
   17 
   18 extern void ldv_spin_lock_lock_of_NOT_ARG_SIGN(void);
   19 extern void ldv_spin_unlock_lock_of_NOT_ARG_SIGN(void);
   20 extern int ldv_spin_trylock_lock_of_NOT_ARG_SIGN(void);
   21 extern void ldv_spin_unlock_wait_lock_of_NOT_ARG_SIGN(void);
   22 extern int ldv_spin_is_locked_lock_of_NOT_ARG_SIGN(void);
   23 extern int ldv_spin_can_lock_lock_of_NOT_ARG_SIGN(void);
   24 extern int ldv_spin_is_contended_lock_of_NOT_ARG_SIGN(void);
   25 extern int ldv_atomic_dec_and_lock_lock_of_NOT_ARG_SIGN(void);
   26 extern void ldv_spin_lock_lock_of_z3fold_pool(void);
   27 extern void ldv_spin_unlock_lock_of_z3fold_pool(void);
   28 extern int ldv_spin_trylock_lock_of_z3fold_pool(void);
   29 extern void ldv_spin_unlock_wait_lock_of_z3fold_pool(void);
   30 extern int ldv_spin_is_locked_lock_of_z3fold_pool(void);
   31 extern int ldv_spin_can_lock_lock_of_z3fold_pool(void);
   32 extern int ldv_spin_is_contended_lock_of_z3fold_pool(void);
   33 extern int ldv_atomic_dec_and_lock_lock_of_z3fold_pool(void);
   34 extern void ldv_spin_lock_node_size_lock_of_pglist_data(void);
   35 extern void ldv_spin_unlock_node_size_lock_of_pglist_data(void);
   36 extern int ldv_spin_trylock_node_size_lock_of_pglist_data(void);
   37 extern void ldv_spin_unlock_wait_node_size_lock_of_pglist_data(void);
   38 extern int ldv_spin_is_locked_node_size_lock_of_pglist_data(void);
   39 extern int ldv_spin_can_lock_node_size_lock_of_pglist_data(void);
   40 extern int ldv_spin_is_contended_node_size_lock_of_pglist_data(void);
   41 extern int ldv_atomic_dec_and_lock_node_size_lock_of_pglist_data(void);
   42 extern void ldv_spin_lock_page_lock_of_z3fold_header(void);
   43 extern void ldv_spin_unlock_page_lock_of_z3fold_header(void);
   44 extern int ldv_spin_trylock_page_lock_of_z3fold_header(void);
   45 extern void ldv_spin_unlock_wait_page_lock_of_z3fold_header(void);
   46 extern int ldv_spin_is_locked_page_lock_of_z3fold_header(void);
   47 extern int ldv_spin_can_lock_page_lock_of_z3fold_header(void);
   48 extern int ldv_spin_is_contended_page_lock_of_z3fold_header(void);
   49 extern int ldv_atomic_dec_and_lock_page_lock_of_z3fold_header(void);
   50 extern void ldv_spin_lock_ptl(void);
   51 extern void ldv_spin_unlock_ptl(void);
   52 extern int ldv_spin_trylock_ptl(void);
   53 extern void ldv_spin_unlock_wait_ptl(void);
   54 extern int ldv_spin_is_locked_ptl(void);
   55 extern int ldv_spin_can_lock_ptl(void);
   56 extern int ldv_spin_is_contended_ptl(void);
   57 extern int ldv_atomic_dec_and_lock_ptl(void);
   58 #line 1 "/work/ldvuser/ref_launch/work/current--X--mm--X--defaultlinux-4.11-rc1.tar.xz--X--39_7a--X--cpachecker/linux-4.11-rc1.tar.xz/csd_deg_dscv/19/dscv_tempdir/dscv/ri/39_7a/mm/z3fold.c"
   59 
   60 /*
   61  * z3fold.c
   62  *
   63  * Author: Vitaly Wool <vitaly.wool@konsulko.com>
   64  * Copyright (C) 2016, Sony Mobile Communications Inc.
   65  *
   66  * This implementation is based on zbud written by Seth Jennings.
   67  *
   68  * z3fold is an special purpose allocator for storing compressed pages. It
   69  * can store up to three compressed pages per page which improves the
   70  * compression ratio of zbud while retaining its main concepts (e. g. always
   71  * storing an integral number of objects per page) and simplicity.
   72  * It still has simple and deterministic reclaim properties that make it
   73  * preferable to a higher density approach (with no requirement on integral
   74  * number of object per page) when reclaim is used.
   75  *
   76  * As in zbud, pages are divided into "chunks".  The size of the chunks is
   77  * fixed at compile time and is determined by NCHUNKS_ORDER below.
   78  *
   79  * z3fold doesn't export any API and is meant to be used via zpool API.
   80  */
   81 
   82 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   83 
   84 #include <linux/atomic.h>
   85 #include <linux/list.h>
   86 #include <linux/mm.h>
   87 #include <linux/module.h>
   88 #include <linux/preempt.h>
   89 #include <linux/slab.h>
   90 #include <linux/spinlock.h>
   91 #include <linux/zpool.h>
   92 
   93 /*****************
   94  * Structures
   95 *****************/
   96 struct z3fold_pool;
   97 struct z3fold_ops {
   98 	int (*evict)(struct z3fold_pool *pool, unsigned long handle);
   99 };
  100 
  101 enum buddy {
  102 	HEADLESS = 0,
  103 	FIRST,
  104 	MIDDLE,
  105 	LAST,
  106 	BUDDIES_MAX
  107 };
  108 
  109 /*
  110  * struct z3fold_header - z3fold page metadata occupying the first chunk of each
  111  *			z3fold page, except for HEADLESS pages
  112  * @buddy:	links the z3fold page into the relevant list in the pool
  113  * @page_lock:		per-page lock
  114  * @refcount:		reference cound for the z3fold page
  115  * @first_chunks:	the size of the first buddy in chunks, 0 if free
  116  * @middle_chunks:	the size of the middle buddy in chunks, 0 if free
  117  * @last_chunks:	the size of the last buddy in chunks, 0 if free
  118  * @first_num:		the starting number (for the first handle)
  119  */
  120 struct z3fold_header {
  121 	struct list_head buddy;
  122 	spinlock_t page_lock;
  123 	struct kref refcount;
  124 	unsigned short first_chunks;
  125 	unsigned short middle_chunks;
  126 	unsigned short last_chunks;
  127 	unsigned short start_middle;
  128 	unsigned short first_num:2;
  129 };
  130 
  131 /*
  132  * NCHUNKS_ORDER determines the internal allocation granularity, effectively
  133  * adjusting internal fragmentation.  It also determines the number of
  134  * freelists maintained in each pool. NCHUNKS_ORDER of 6 means that the
  135  * allocation granularity will be in chunks of size PAGE_SIZE/64. Some chunks
  136  * in the beginning of an allocated page are occupied by z3fold header, so
  137  * NCHUNKS will be calculated to 63 (or 62 in case CONFIG_DEBUG_SPINLOCK=y),
  138  * which shows the max number of free chunks in z3fold page, also there will
  139  * be 63, or 62, respectively, freelists per pool.
  140  */
  141 #define NCHUNKS_ORDER	6
  142 
  143 #define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
  144 #define CHUNK_SIZE	(1 << CHUNK_SHIFT)
  145 #define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
  146 #define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
  147 #define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
  148 #define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
  149 
  150 #define BUDDY_MASK	(0x3)
  151 
  152 /**
  153  * struct z3fold_pool - stores metadata for each z3fold pool
  154  * @lock:	protects all pool fields and first|last_chunk fields of any
  155  *		z3fold page in the pool
  156  * @unbuddied:	array of lists tracking z3fold pages that contain 2- buddies;
  157  *		the lists each z3fold page is added to depends on the size of
  158  *		its free region.
  159  * @lru:	list tracking the z3fold pages in LRU order by most recently
  160  *		added buddy.
  161  * @pages_nr:	number of z3fold pages in the pool.
  162  * @ops:	pointer to a structure of user defined operations specified at
  163  *		pool creation time.
  164  *
  165  * This structure is allocated at pool creation time and maintains metadata
  166  * pertaining to a particular z3fold pool.
  167  */
  168 struct z3fold_pool {
  169 	spinlock_t lock;
  170 	struct list_head unbuddied[NCHUNKS];
  171 	struct list_head lru;
  172 	atomic64_t pages_nr;
  173 	const struct z3fold_ops *ops;
  174 	struct zpool *zpool;
  175 	const struct zpool_ops *zpool_ops;
  176 };
  177 
  178 /*
  179  * Internal z3fold page flags
  180  */
  181 enum z3fold_page_flags {
  182 	PAGE_HEADLESS = 0,
  183 	MIDDLE_CHUNK_MAPPED,
  184 };
  185 
  186 
  187 /*****************
  188  * Helpers
  189 *****************/
  190 
  191 /* Converts an allocation size in bytes to size in z3fold chunks */
  192 static int size_to_chunks(size_t size)
  193 {
  194 	return (size + CHUNK_SIZE - 1) >> CHUNK_SHIFT;
  195 }
  196 
  197 #define for_each_unbuddied_list(_iter, _begin) \
  198 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
  199 
  200 /* Initializes the z3fold header of a newly allocated z3fold page */
  201 static struct z3fold_header *init_z3fold_page(struct page *page)
  202 {
  203 	struct z3fold_header *zhdr = page_address(page);
  204 
  205 	INIT_LIST_HEAD(&page->lru);
  206 	clear_bit(PAGE_HEADLESS, &page->private);
  207 	clear_bit(MIDDLE_CHUNK_MAPPED, &page->private);
  208 
  209 	spin_lock_init(&zhdr->page_lock);
  210 	kref_init(&zhdr->refcount);
  211 	zhdr->first_chunks = 0;
  212 	zhdr->middle_chunks = 0;
  213 	zhdr->last_chunks = 0;
  214 	zhdr->first_num = 0;
  215 	zhdr->start_middle = 0;
  216 	INIT_LIST_HEAD(&zhdr->buddy);
  217 	return zhdr;
  218 }
  219 
  220 /* Resets the struct page fields and frees the page */
  221 static void free_z3fold_page(struct page *page)
  222 {
  223 	__free_page(page);
  224 }
  225 
  226 static void release_z3fold_page(struct kref *ref)
  227 {
  228 	struct z3fold_header *zhdr;
  229 	struct page *page;
  230 
  231 	zhdr = container_of(ref, struct z3fold_header, refcount);
  232 	page = virt_to_page(zhdr);
  233 
  234 	if (!list_empty(&zhdr->buddy))
  235 		list_del(&zhdr->buddy);
  236 	if (!list_empty(&page->lru))
  237 		list_del(&page->lru);
  238 	free_z3fold_page(page);
  239 }
  240 
  241 /* Lock a z3fold page */
  242 static inline void z3fold_page_lock(struct z3fold_header *zhdr)
  243 {
  244 	spin_lock(&zhdr->page_lock);
  245 }
  246 
  247 /* Unlock a z3fold page */
  248 static inline void z3fold_page_unlock(struct z3fold_header *zhdr)
  249 {
  250 	spin_unlock(&zhdr->page_lock);
  251 }
  252 
  253 /*
  254  * Encodes the handle of a particular buddy within a z3fold page
  255  * Pool lock should be held as this function accesses first_num
  256  */
  257 static unsigned long encode_handle(struct z3fold_header *zhdr, enum buddy bud)
  258 {
  259 	unsigned long handle;
  260 
  261 	handle = (unsigned long)zhdr;
  262 	if (bud != HEADLESS)
  263 		handle += (bud + zhdr->first_num) & BUDDY_MASK;
  264 	return handle;
  265 }
  266 
  267 /* Returns the z3fold page where a given handle is stored */
  268 static struct z3fold_header *handle_to_z3fold_header(unsigned long handle)
  269 {
  270 	return (struct z3fold_header *)(handle & PAGE_MASK);
  271 }
  272 
  273 /*
  274  * (handle & BUDDY_MASK) < zhdr->first_num is possible in encode_handle
  275  *  but that doesn't matter. because the masking will result in the
  276  *  correct buddy number.
  277  */
  278 static enum buddy handle_to_buddy(unsigned long handle)
  279 {
  280 	struct z3fold_header *zhdr = handle_to_z3fold_header(handle);
  281 	return (handle - zhdr->first_num) & BUDDY_MASK;
  282 }
  283 
  284 /*
  285  * Returns the number of free chunks in a z3fold page.
  286  * NB: can't be used with HEADLESS pages.
  287  */
  288 static int num_free_chunks(struct z3fold_header *zhdr)
  289 {
  290 	int nfree;
  291 	/*
  292 	 * If there is a middle object, pick up the bigger free space
  293 	 * either before or after it. Otherwise just subtract the number
  294 	 * of chunks occupied by the first and the last objects.
  295 	 */
  296 	if (zhdr->middle_chunks != 0) {
  297 		int nfree_before = zhdr->first_chunks ?
  298 			0 : zhdr->start_middle - ZHDR_CHUNKS;
  299 		int nfree_after = zhdr->last_chunks ?
  300 			0 : TOTAL_CHUNKS -
  301 				(zhdr->start_middle + zhdr->middle_chunks);
  302 		nfree = max(nfree_before, nfree_after);
  303 	} else
  304 		nfree = NCHUNKS - zhdr->first_chunks - zhdr->last_chunks;
  305 	return nfree;
  306 }
  307 
  308 /*****************
  309  * API Functions
  310 *****************/
  311 /**
  312  * z3fold_create_pool() - create a new z3fold pool
  313  * @gfp:	gfp flags when allocating the z3fold pool structure
  314  * @ops:	user-defined operations for the z3fold pool
  315  *
  316  * Return: pointer to the new z3fold pool or NULL if the metadata allocation
  317  * failed.
  318  */
  319 static struct z3fold_pool *z3fold_create_pool(gfp_t gfp,
  320 		const struct z3fold_ops *ops)
  321 {
  322 	struct z3fold_pool *pool;
  323 	int i;
  324 
  325 	pool = kzalloc(sizeof(struct z3fold_pool), gfp);
  326 	if (!pool)
  327 		return NULL;
  328 	spin_lock_init(&pool->lock);
  329 	for_each_unbuddied_list(i, 0)
  330 		INIT_LIST_HEAD(&pool->unbuddied[i]);
  331 	INIT_LIST_HEAD(&pool->lru);
  332 	atomic64_set(&pool->pages_nr, 0);
  333 	pool->ops = ops;
  334 	return pool;
  335 }
  336 
  337 /**
  338  * z3fold_destroy_pool() - destroys an existing z3fold pool
  339  * @pool:	the z3fold pool to be destroyed
  340  *
  341  * The pool should be emptied before this function is called.
  342  */
  343 static void z3fold_destroy_pool(struct z3fold_pool *pool)
  344 {
  345 	kfree(pool);
  346 }
  347 
  348 static inline void *mchunk_memmove(struct z3fold_header *zhdr,
  349 				unsigned short dst_chunk)
  350 {
  351 	void *beg = zhdr;
  352 	return memmove(beg + (dst_chunk << CHUNK_SHIFT),
  353 		       beg + (zhdr->start_middle << CHUNK_SHIFT),
  354 		       zhdr->middle_chunks << CHUNK_SHIFT);
  355 }
  356 
  357 #define BIG_CHUNK_GAP	3
  358 /* Has to be called with lock held */
  359 static int z3fold_compact_page(struct z3fold_header *zhdr)
  360 {
  361 	struct page *page = virt_to_page(zhdr);
  362 
  363 	if (test_bit(MIDDLE_CHUNK_MAPPED, &page->private))
  364 		return 0; /* can't move middle chunk, it's used */
  365 
  366 	if (zhdr->middle_chunks == 0)
  367 		return 0; /* nothing to compact */
  368 
  369 	if (zhdr->first_chunks == 0 && zhdr->last_chunks == 0) {
  370 		/* move to the beginning */
  371 		mchunk_memmove(zhdr, ZHDR_CHUNKS);
  372 		zhdr->first_chunks = zhdr->middle_chunks;
  373 		zhdr->middle_chunks = 0;
  374 		zhdr->start_middle = 0;
  375 		zhdr->first_num++;
  376 		return 1;
  377 	}
  378 
  379 	/*
  380 	 * moving data is expensive, so let's only do that if
  381 	 * there's substantial gain (at least BIG_CHUNK_GAP chunks)
  382 	 */
  383 	if (zhdr->first_chunks != 0 && zhdr->last_chunks == 0 &&
  384 	    zhdr->start_middle - (zhdr->first_chunks + ZHDR_CHUNKS) >=
  385 			BIG_CHUNK_GAP) {
  386 		mchunk_memmove(zhdr, zhdr->first_chunks + ZHDR_CHUNKS);
  387 		zhdr->start_middle = zhdr->first_chunks + ZHDR_CHUNKS;
  388 		return 1;
  389 	} else if (zhdr->last_chunks != 0 && zhdr->first_chunks == 0 &&
  390 		   TOTAL_CHUNKS - (zhdr->last_chunks + zhdr->start_middle
  391 					+ zhdr->middle_chunks) >=
  392 			BIG_CHUNK_GAP) {
  393 		unsigned short new_start = TOTAL_CHUNKS - zhdr->last_chunks -
  394 			zhdr->middle_chunks;
  395 		mchunk_memmove(zhdr, new_start);
  396 		zhdr->start_middle = new_start;
  397 		return 1;
  398 	}
  399 
  400 	return 0;
  401 }
  402 
  403 /**
  404  * z3fold_alloc() - allocates a region of a given size
  405  * @pool:	z3fold pool from which to allocate
  406  * @size:	size in bytes of the desired allocation
  407  * @gfp:	gfp flags used if the pool needs to grow
  408  * @handle:	handle of the new allocation
  409  *
  410  * This function will attempt to find a free region in the pool large enough to
  411  * satisfy the allocation request.  A search of the unbuddied lists is
  412  * performed first. If no suitable free region is found, then a new page is
  413  * allocated and added to the pool to satisfy the request.
  414  *
  415  * gfp should not set __GFP_HIGHMEM as highmem pages cannot be used
  416  * as z3fold pool pages.
  417  *
  418  * Return: 0 if success and handle is set, otherwise -EINVAL if the size or
  419  * gfp arguments are invalid or -ENOMEM if the pool was unable to allocate
  420  * a new page.
  421  */
  422 static int z3fold_alloc(struct z3fold_pool *pool, size_t size, gfp_t gfp,
  423 			unsigned long *handle)
  424 {
  425 	int chunks = 0, i, freechunks;
  426 	struct z3fold_header *zhdr = NULL;
  427 	enum buddy bud;
  428 	struct page *page;
  429 
  430 	if (!size || (gfp & __GFP_HIGHMEM))
  431 		return -EINVAL;
  432 
  433 	if (size > PAGE_SIZE)
  434 		return -ENOSPC;
  435 
  436 	if (size > PAGE_SIZE - ZHDR_SIZE_ALIGNED - CHUNK_SIZE)
  437 		bud = HEADLESS;
  438 	else {
  439 		chunks = size_to_chunks(size);
  440 
  441 		/* First, try to find an unbuddied z3fold page. */
  442 		zhdr = NULL;
  443 		for_each_unbuddied_list(i, chunks) {
  444 			spin_lock(&pool->lock);
  445 			zhdr = list_first_entry_or_null(&pool->unbuddied[i],
  446 						struct z3fold_header, buddy);
  447 			if (!zhdr) {
  448 				spin_unlock(&pool->lock);
  449 				continue;
  450 			}
  451 			kref_get(&zhdr->refcount);
  452 			list_del_init(&zhdr->buddy);
  453 			spin_unlock(&pool->lock);
  454 
  455 			page = virt_to_page(zhdr);
  456 			z3fold_page_lock(zhdr);
  457 			if (zhdr->first_chunks == 0) {
  458 				if (zhdr->middle_chunks != 0 &&
  459 				    chunks >= zhdr->start_middle)
  460 					bud = LAST;
  461 				else
  462 					bud = FIRST;
  463 			} else if (zhdr->last_chunks == 0)
  464 				bud = LAST;
  465 			else if (zhdr->middle_chunks == 0)
  466 				bud = MIDDLE;
  467 			else {
  468 				z3fold_page_unlock(zhdr);
  469 				spin_lock(&pool->lock);
  470 				if (kref_put(&zhdr->refcount,
  471 					     release_z3fold_page))
  472 					atomic64_dec(&pool->pages_nr);
  473 				spin_unlock(&pool->lock);
  474 				pr_err("No free chunks in unbuddied\n");
  475 				WARN_ON(1);
  476 				continue;
  477 			}
  478 			goto found;
  479 		}
  480 		bud = FIRST;
  481 	}
  482 
  483 	/* Couldn't find unbuddied z3fold page, create new one */
  484 	page = alloc_page(gfp);
  485 	if (!page)
  486 		return -ENOMEM;
  487 
  488 	atomic64_inc(&pool->pages_nr);
  489 	zhdr = init_z3fold_page(page);
  490 
  491 	if (bud == HEADLESS) {
  492 		set_bit(PAGE_HEADLESS, &page->private);
  493 		spin_lock(&pool->lock);
  494 		goto headless;
  495 	}
  496 	z3fold_page_lock(zhdr);
  497 
  498 found:
  499 	if (bud == FIRST)
  500 		zhdr->first_chunks = chunks;
  501 	else if (bud == LAST)
  502 		zhdr->last_chunks = chunks;
  503 	else {
  504 		zhdr->middle_chunks = chunks;
  505 		zhdr->start_middle = zhdr->first_chunks + ZHDR_CHUNKS;
  506 	}
  507 
  508 	spin_lock(&pool->lock);
  509 	if (zhdr->first_chunks == 0 || zhdr->last_chunks == 0 ||
  510 			zhdr->middle_chunks == 0) {
  511 		/* Add to unbuddied list */
  512 		freechunks = num_free_chunks(zhdr);
  513 		list_add(&zhdr->buddy, &pool->unbuddied[freechunks]);
  514 	}
  515 
  516 headless:
  517 	/* Add/move z3fold page to beginning of LRU */
  518 	if (!list_empty(&page->lru))
  519 		list_del(&page->lru);
  520 
  521 	list_add(&page->lru, &pool->lru);
  522 
  523 	*handle = encode_handle(zhdr, bud);
  524 	spin_unlock(&pool->lock);
  525 	if (bud != HEADLESS)
  526 		z3fold_page_unlock(zhdr);
  527 
  528 	return 0;
  529 }
  530 
  531 /**
  532  * z3fold_free() - frees the allocation associated with the given handle
  533  * @pool:	pool in which the allocation resided
  534  * @handle:	handle associated with the allocation returned by z3fold_alloc()
  535  *
  536  * In the case that the z3fold page in which the allocation resides is under
  537  * reclaim, as indicated by the PG_reclaim flag being set, this function
  538  * only sets the first|last_chunks to 0.  The page is actually freed
  539  * once both buddies are evicted (see z3fold_reclaim_page() below).
  540  */
  541 static void z3fold_free(struct z3fold_pool *pool, unsigned long handle)
  542 {
  543 	struct z3fold_header *zhdr;
  544 	int freechunks;
  545 	struct page *page;
  546 	enum buddy bud;
  547 
  548 	zhdr = handle_to_z3fold_header(handle);
  549 	page = virt_to_page(zhdr);
  550 
  551 	if (test_bit(PAGE_HEADLESS, &page->private)) {
  552 		/* HEADLESS page stored */
  553 		bud = HEADLESS;
  554 	} else {
  555 		z3fold_page_lock(zhdr);
  556 		bud = handle_to_buddy(handle);
  557 
  558 		switch (bud) {
  559 		case FIRST:
  560 			zhdr->first_chunks = 0;
  561 			break;
  562 		case MIDDLE:
  563 			zhdr->middle_chunks = 0;
  564 			zhdr->start_middle = 0;
  565 			break;
  566 		case LAST:
  567 			zhdr->last_chunks = 0;
  568 			break;
  569 		default:
  570 			pr_err("%s: unknown bud %d\n", __func__, bud);
  571 			WARN_ON(1);
  572 			z3fold_page_unlock(zhdr);
  573 			return;
  574 		}
  575 	}
  576 
  577 	if (bud == HEADLESS) {
  578 		spin_lock(&pool->lock);
  579 		list_del(&page->lru);
  580 		spin_unlock(&pool->lock);
  581 		free_z3fold_page(page);
  582 		atomic64_dec(&pool->pages_nr);
  583 	} else {
  584 		if (zhdr->first_chunks != 0 || zhdr->middle_chunks != 0 ||
  585 		    zhdr->last_chunks != 0) {
  586 			z3fold_compact_page(zhdr);
  587 			/* Add to the unbuddied list */
  588 			spin_lock(&pool->lock);
  589 			if (!list_empty(&zhdr->buddy))
  590 				list_del(&zhdr->buddy);
  591 			freechunks = num_free_chunks(zhdr);
  592 			list_add(&zhdr->buddy, &pool->unbuddied[freechunks]);
  593 			spin_unlock(&pool->lock);
  594 		}
  595 		z3fold_page_unlock(zhdr);
  596 		spin_lock(&pool->lock);
  597 		if (kref_put(&zhdr->refcount, release_z3fold_page))
  598 			atomic64_dec(&pool->pages_nr);
  599 		spin_unlock(&pool->lock);
  600 	}
  601 
  602 }
  603 
  604 /**
  605  * z3fold_reclaim_page() - evicts allocations from a pool page and frees it
  606  * @pool:	pool from which a page will attempt to be evicted
  607  * @retires:	number of pages on the LRU list for which eviction will
  608  *		be attempted before failing
  609  *
  610  * z3fold reclaim is different from normal system reclaim in that it is done
  611  * from the bottom, up. This is because only the bottom layer, z3fold, has
  612  * information on how the allocations are organized within each z3fold page.
  613  * This has the potential to create interesting locking situations between
  614  * z3fold and the user, however.
  615  *
  616  * To avoid these, this is how z3fold_reclaim_page() should be called:
  617 
  618  * The user detects a page should be reclaimed and calls z3fold_reclaim_page().
  619  * z3fold_reclaim_page() will remove a z3fold page from the pool LRU list and
  620  * call the user-defined eviction handler with the pool and handle as
  621  * arguments.
  622  *
  623  * If the handle can not be evicted, the eviction handler should return
  624  * non-zero. z3fold_reclaim_page() will add the z3fold page back to the
  625  * appropriate list and try the next z3fold page on the LRU up to
  626  * a user defined number of retries.
  627  *
  628  * If the handle is successfully evicted, the eviction handler should
  629  * return 0 _and_ should have called z3fold_free() on the handle. z3fold_free()
  630  * contains logic to delay freeing the page if the page is under reclaim,
  631  * as indicated by the setting of the PG_reclaim flag on the underlying page.
  632  *
  633  * If all buddies in the z3fold page are successfully evicted, then the
  634  * z3fold page can be freed.
  635  *
  636  * Returns: 0 if page is successfully freed, otherwise -EINVAL if there are
  637  * no pages to evict or an eviction handler is not registered, -EAGAIN if
  638  * the retry limit was hit.
  639  */
  640 static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries)
  641 {
  642 	int i, ret = 0, freechunks;
  643 	struct z3fold_header *zhdr;
  644 	struct page *page;
  645 	unsigned long first_handle = 0, middle_handle = 0, last_handle = 0;
  646 
  647 	spin_lock(&pool->lock);
  648 	if (!pool->ops || !pool->ops->evict || retries == 0) {
  649 		spin_unlock(&pool->lock);
  650 		return -EINVAL;
  651 	}
  652 	for (i = 0; i < retries; i++) {
  653 		if (list_empty(&pool->lru)) {
  654 			spin_unlock(&pool->lock);
  655 			return -EINVAL;
  656 		}
  657 		page = list_last_entry(&pool->lru, struct page, lru);
  658 		list_del_init(&page->lru);
  659 
  660 		zhdr = page_address(page);
  661 		if (!test_bit(PAGE_HEADLESS, &page->private)) {
  662 			if (!list_empty(&zhdr->buddy))
  663 				list_del_init(&zhdr->buddy);
  664 			kref_get(&zhdr->refcount);
  665 			spin_unlock(&pool->lock);
  666 			z3fold_page_lock(zhdr);
  667 			/*
  668 			 * We need encode the handles before unlocking, since
  669 			 * we can race with free that will set
  670 			 * (first|last)_chunks to 0
  671 			 */
  672 			first_handle = 0;
  673 			last_handle = 0;
  674 			middle_handle = 0;
  675 			if (zhdr->first_chunks)
  676 				first_handle = encode_handle(zhdr, FIRST);
  677 			if (zhdr->middle_chunks)
  678 				middle_handle = encode_handle(zhdr, MIDDLE);
  679 			if (zhdr->last_chunks)
  680 				last_handle = encode_handle(zhdr, LAST);
  681 			z3fold_page_unlock(zhdr);
  682 		} else {
  683 			first_handle = encode_handle(zhdr, HEADLESS);
  684 			last_handle = middle_handle = 0;
  685 			spin_unlock(&pool->lock);
  686 		}
  687 
  688 		/* Issue the eviction callback(s) */
  689 		if (middle_handle) {
  690 			ret = pool->ops->evict(pool, middle_handle);
  691 			if (ret)
  692 				goto next;
  693 		}
  694 		if (first_handle) {
  695 			ret = pool->ops->evict(pool, first_handle);
  696 			if (ret)
  697 				goto next;
  698 		}
  699 		if (last_handle) {
  700 			ret = pool->ops->evict(pool, last_handle);
  701 			if (ret)
  702 				goto next;
  703 		}
  704 next:
  705 		if (test_bit(PAGE_HEADLESS, &page->private)) {
  706 			if (ret == 0) {
  707 				free_z3fold_page(page);
  708 				return 0;
  709 			} else {
  710 				spin_lock(&pool->lock);
  711 			}
  712 		} else {
  713 			z3fold_page_lock(zhdr);
  714 			if ((zhdr->first_chunks || zhdr->last_chunks ||
  715 			     zhdr->middle_chunks) &&
  716 			    !(zhdr->first_chunks && zhdr->last_chunks &&
  717 			      zhdr->middle_chunks)) {
  718 				z3fold_compact_page(zhdr);
  719 				/* add to unbuddied list */
  720 				spin_lock(&pool->lock);
  721 				freechunks = num_free_chunks(zhdr);
  722 				list_add(&zhdr->buddy,
  723 					 &pool->unbuddied[freechunks]);
  724 				spin_unlock(&pool->lock);
  725 			}
  726 			z3fold_page_unlock(zhdr);
  727 			spin_lock(&pool->lock);
  728 			if (kref_put(&zhdr->refcount, release_z3fold_page)) {
  729 				atomic64_dec(&pool->pages_nr);
  730 				return 0;
  731 			}
  732 		}
  733 
  734 		/*
  735 		 * Add to the beginning of LRU.
  736 		 * Pool lock has to be kept here to ensure the page has
  737 		 * not already been released
  738 		 */
  739 		list_add(&page->lru, &pool->lru);
  740 	}
  741 	spin_unlock(&pool->lock);
  742 	return -EAGAIN;
  743 }
  744 
  745 /**
  746  * z3fold_map() - maps the allocation associated with the given handle
  747  * @pool:	pool in which the allocation resides
  748  * @handle:	handle associated with the allocation to be mapped
  749  *
  750  * Extracts the buddy number from handle and constructs the pointer to the
  751  * correct starting chunk within the page.
  752  *
  753  * Returns: a pointer to the mapped allocation
  754  */
  755 static void *z3fold_map(struct z3fold_pool *pool, unsigned long handle)
  756 {
  757 	struct z3fold_header *zhdr;
  758 	struct page *page;
  759 	void *addr;
  760 	enum buddy buddy;
  761 
  762 	zhdr = handle_to_z3fold_header(handle);
  763 	addr = zhdr;
  764 	page = virt_to_page(zhdr);
  765 
  766 	if (test_bit(PAGE_HEADLESS, &page->private))
  767 		goto out;
  768 
  769 	z3fold_page_lock(zhdr);
  770 	buddy = handle_to_buddy(handle);
  771 	switch (buddy) {
  772 	case FIRST:
  773 		addr += ZHDR_SIZE_ALIGNED;
  774 		break;
  775 	case MIDDLE:
  776 		addr += zhdr->start_middle << CHUNK_SHIFT;
  777 		set_bit(MIDDLE_CHUNK_MAPPED, &page->private);
  778 		break;
  779 	case LAST:
  780 		addr += PAGE_SIZE - (zhdr->last_chunks << CHUNK_SHIFT);
  781 		break;
  782 	default:
  783 		pr_err("unknown buddy id %d\n", buddy);
  784 		WARN_ON(1);
  785 		addr = NULL;
  786 		break;
  787 	}
  788 
  789 	z3fold_page_unlock(zhdr);
  790 out:
  791 	return addr;
  792 }
  793 
  794 /**
  795  * z3fold_unmap() - unmaps the allocation associated with the given handle
  796  * @pool:	pool in which the allocation resides
  797  * @handle:	handle associated with the allocation to be unmapped
  798  */
  799 static void z3fold_unmap(struct z3fold_pool *pool, unsigned long handle)
  800 {
  801 	struct z3fold_header *zhdr;
  802 	struct page *page;
  803 	enum buddy buddy;
  804 
  805 	zhdr = handle_to_z3fold_header(handle);
  806 	page = virt_to_page(zhdr);
  807 
  808 	if (test_bit(PAGE_HEADLESS, &page->private))
  809 		return;
  810 
  811 	z3fold_page_lock(zhdr);
  812 	buddy = handle_to_buddy(handle);
  813 	if (buddy == MIDDLE)
  814 		clear_bit(MIDDLE_CHUNK_MAPPED, &page->private);
  815 	z3fold_page_unlock(zhdr);
  816 }
  817 
  818 /**
  819  * z3fold_get_pool_size() - gets the z3fold pool size in pages
  820  * @pool:	pool whose size is being queried
  821  *
  822  * Returns: size in pages of the given pool.
  823  */
  824 static u64 z3fold_get_pool_size(struct z3fold_pool *pool)
  825 {
  826 	return atomic64_read(&pool->pages_nr);
  827 }
  828 
  829 /*****************
  830  * zpool
  831  ****************/
  832 
  833 static int z3fold_zpool_evict(struct z3fold_pool *pool, unsigned long handle)
  834 {
  835 	if (pool->zpool && pool->zpool_ops && pool->zpool_ops->evict)
  836 		return pool->zpool_ops->evict(pool->zpool, handle);
  837 	else
  838 		return -ENOENT;
  839 }
  840 
  841 static const struct z3fold_ops z3fold_zpool_ops = {
  842 	.evict =	z3fold_zpool_evict
  843 };
  844 
  845 static void *z3fold_zpool_create(const char *name, gfp_t gfp,
  846 			       const struct zpool_ops *zpool_ops,
  847 			       struct zpool *zpool)
  848 {
  849 	struct z3fold_pool *pool;
  850 
  851 	pool = z3fold_create_pool(gfp, zpool_ops ? &z3fold_zpool_ops : NULL);
  852 	if (pool) {
  853 		pool->zpool = zpool;
  854 		pool->zpool_ops = zpool_ops;
  855 	}
  856 	return pool;
  857 }
  858 
  859 static void z3fold_zpool_destroy(void *pool)
  860 {
  861 	z3fold_destroy_pool(pool);
  862 }
  863 
  864 static int z3fold_zpool_malloc(void *pool, size_t size, gfp_t gfp,
  865 			unsigned long *handle)
  866 {
  867 	return z3fold_alloc(pool, size, gfp, handle);
  868 }
  869 static void z3fold_zpool_free(void *pool, unsigned long handle)
  870 {
  871 	z3fold_free(pool, handle);
  872 }
  873 
  874 static int z3fold_zpool_shrink(void *pool, unsigned int pages,
  875 			unsigned int *reclaimed)
  876 {
  877 	unsigned int total = 0;
  878 	int ret = -EINVAL;
  879 
  880 	while (total < pages) {
  881 		ret = z3fold_reclaim_page(pool, 8);
  882 		if (ret < 0)
  883 			break;
  884 		total++;
  885 	}
  886 
  887 	if (reclaimed)
  888 		*reclaimed = total;
  889 
  890 	return ret;
  891 }
  892 
  893 static void *z3fold_zpool_map(void *pool, unsigned long handle,
  894 			enum zpool_mapmode mm)
  895 {
  896 	return z3fold_map(pool, handle);
  897 }
  898 static void z3fold_zpool_unmap(void *pool, unsigned long handle)
  899 {
  900 	z3fold_unmap(pool, handle);
  901 }
  902 
  903 static u64 z3fold_zpool_total_size(void *pool)
  904 {
  905 	return z3fold_get_pool_size(pool) * PAGE_SIZE;
  906 }
  907 
  908 static struct zpool_driver z3fold_zpool_driver = {
  909 	.type =		"z3fold",
  910 	.owner =	THIS_MODULE,
  911 	.create =	z3fold_zpool_create,
  912 	.destroy =	z3fold_zpool_destroy,
  913 	.malloc =	z3fold_zpool_malloc,
  914 	.free =		z3fold_zpool_free,
  915 	.shrink =	z3fold_zpool_shrink,
  916 	.map =		z3fold_zpool_map,
  917 	.unmap =	z3fold_zpool_unmap,
  918 	.total_size =	z3fold_zpool_total_size,
  919 };
  920 
  921 MODULE_ALIAS("zpool-z3fold");
  922 
  923 static int __init init_z3fold(void)
  924 {
  925 	/* Make sure the z3fold header is not larger than the page size */
  926 	BUILD_BUG_ON(ZHDR_SIZE_ALIGNED > PAGE_SIZE);
  927 	zpool_register_driver(&z3fold_zpool_driver);
  928 
  929 	return 0;
  930 }
  931 
  932 static void __exit exit_z3fold(void)
  933 {
  934 	zpool_unregister_driver(&z3fold_zpool_driver);
  935 }
  936 
  937 module_init(init_z3fold);
  938 module_exit(exit_z3fold);
  939 
  940 MODULE_LICENSE("GPL");
  941 MODULE_AUTHOR("Vitaly Wool <vitalywool@gmail.com>");
  942 MODULE_DESCRIPTION("3-Fold Allocator for Compressed Pages");
  943 
  944 
  945 
  946 
  947 
  948 /* LDV_COMMENT_BEGIN_MAIN */
  949 #ifdef LDV_MAIN0_sequence_infinite_withcheck_stateful
  950 
  951 /*###########################################################################*/
  952 
  953 /*############## Driver Environment Generator 0.2 output ####################*/
  954 
  955 /*###########################################################################*/
  956 
  957 
  958 
  959 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test if all kernel resources are correctly released by driver before driver will be unloaded. */
  960 void ldv_check_final_state(void);
  961 
  962 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result. */
  963 void ldv_check_return_value(int res);
  964 
  965 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result of probe() function. */
  966 void ldv_check_return_value_probe(int res);
  967 
  968 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Initializes the model. */
  969 void ldv_initialize(void);
  970 
  971 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Reinitializes the model between distinct model function calls. */
  972 void ldv_handler_precall(void);
  973 
  974 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Returns arbitrary interger value. */
  975 int nondet_int(void);
  976 
  977 /* LDV_COMMENT_VAR_DECLARE_LDV Special variable for LDV verifier. */
  978 int LDV_IN_INTERRUPT;
  979 
  980 /* LDV_COMMENT_FUNCTION_MAIN Main function for LDV verifier. */
  981 void ldv_main0_sequence_infinite_withcheck_stateful(void) {
  982 
  983 
  984 
  985 	/* LDV_COMMENT_BEGIN_VARIABLE_DECLARATION_PART */
  986 	/*============================= VARIABLE DECLARATION PART   =============================*/
  987 	/** STRUCT: struct type: z3fold_ops, struct name: z3fold_zpool_ops **/
  988 	/* content: static int z3fold_zpool_evict(struct z3fold_pool *pool, unsigned long handle)*/
  989 	/* LDV_COMMENT_BEGIN_PREP */
  990 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  991 	#define NCHUNKS_ORDER	6
  992 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
  993 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
  994 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
  995 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
  996 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
  997 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
  998 	#define BUDDY_MASK	(0x3)
  999 	#define for_each_unbuddied_list(_iter, _begin) \
 1000 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1001 	#define BIG_CHUNK_GAP	3
 1002 	/* LDV_COMMENT_END_PREP */
 1003 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_evict" */
 1004 	struct z3fold_pool * var_group1;
 1005 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_evict" */
 1006 	unsigned long  var_z3fold_zpool_evict_20_p1;
 1007 
 1008 	/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1009 	/* content: static void *z3fold_zpool_create(const char *name, gfp_t gfp, const struct zpool_ops *zpool_ops, struct zpool *zpool)*/
 1010 	/* LDV_COMMENT_BEGIN_PREP */
 1011 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1012 	#define NCHUNKS_ORDER	6
 1013 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1014 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1015 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1016 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1017 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1018 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1019 	#define BUDDY_MASK	(0x3)
 1020 	#define for_each_unbuddied_list(_iter, _begin) \
 1021 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1022 	#define BIG_CHUNK_GAP	3
 1023 	/* LDV_COMMENT_END_PREP */
 1024 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_create" */
 1025 	const char * var_z3fold_zpool_create_21_p0;
 1026 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_create" */
 1027 	gfp_t  var_z3fold_zpool_create_21_p1;
 1028 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_create" */
 1029 	const struct zpool_ops * var_z3fold_zpool_create_21_p2;
 1030 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_create" */
 1031 	struct zpool * var_z3fold_zpool_create_21_p3;
 1032 	/* content: static void z3fold_zpool_destroy(void *pool)*/
 1033 	/* LDV_COMMENT_BEGIN_PREP */
 1034 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1035 	#define NCHUNKS_ORDER	6
 1036 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1037 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1038 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1039 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1040 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1041 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1042 	#define BUDDY_MASK	(0x3)
 1043 	#define for_each_unbuddied_list(_iter, _begin) \
 1044 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1045 	#define BIG_CHUNK_GAP	3
 1046 	/* LDV_COMMENT_END_PREP */
 1047 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_destroy" */
 1048 	void * var_z3fold_zpool_destroy_22_p0;
 1049 	/* content: static int z3fold_zpool_malloc(void *pool, size_t size, gfp_t gfp, unsigned long *handle)*/
 1050 	/* LDV_COMMENT_BEGIN_PREP */
 1051 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1052 	#define NCHUNKS_ORDER	6
 1053 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1054 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1055 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1056 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1057 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1058 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1059 	#define BUDDY_MASK	(0x3)
 1060 	#define for_each_unbuddied_list(_iter, _begin) \
 1061 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1062 	#define BIG_CHUNK_GAP	3
 1063 	/* LDV_COMMENT_END_PREP */
 1064 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_malloc" */
 1065 	void * var_z3fold_zpool_malloc_23_p0;
 1066 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_malloc" */
 1067 	size_t  var_z3fold_zpool_malloc_23_p1;
 1068 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_malloc" */
 1069 	gfp_t  var_z3fold_zpool_malloc_23_p2;
 1070 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_malloc" */
 1071 	unsigned long * var_z3fold_zpool_malloc_23_p3;
 1072 	/* content: static void z3fold_zpool_free(void *pool, unsigned long handle)*/
 1073 	/* LDV_COMMENT_BEGIN_PREP */
 1074 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1075 	#define NCHUNKS_ORDER	6
 1076 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1077 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1078 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1079 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1080 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1081 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1082 	#define BUDDY_MASK	(0x3)
 1083 	#define for_each_unbuddied_list(_iter, _begin) \
 1084 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1085 	#define BIG_CHUNK_GAP	3
 1086 	/* LDV_COMMENT_END_PREP */
 1087 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_free" */
 1088 	void * var_z3fold_zpool_free_24_p0;
 1089 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_free" */
 1090 	unsigned long  var_z3fold_zpool_free_24_p1;
 1091 	/* content: static int z3fold_zpool_shrink(void *pool, unsigned int pages, unsigned int *reclaimed)*/
 1092 	/* LDV_COMMENT_BEGIN_PREP */
 1093 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1094 	#define NCHUNKS_ORDER	6
 1095 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1096 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1097 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1098 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1099 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1100 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1101 	#define BUDDY_MASK	(0x3)
 1102 	#define for_each_unbuddied_list(_iter, _begin) \
 1103 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1104 	#define BIG_CHUNK_GAP	3
 1105 	/* LDV_COMMENT_END_PREP */
 1106 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_shrink" */
 1107 	void * var_z3fold_zpool_shrink_25_p0;
 1108 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_shrink" */
 1109 	unsigned int  var_z3fold_zpool_shrink_25_p1;
 1110 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_shrink" */
 1111 	unsigned int * var_z3fold_zpool_shrink_25_p2;
 1112 	/* content: static void *z3fold_zpool_map(void *pool, unsigned long handle, enum zpool_mapmode mm)*/
 1113 	/* LDV_COMMENT_BEGIN_PREP */
 1114 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1115 	#define NCHUNKS_ORDER	6
 1116 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1117 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1118 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1119 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1120 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1121 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1122 	#define BUDDY_MASK	(0x3)
 1123 	#define for_each_unbuddied_list(_iter, _begin) \
 1124 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1125 	#define BIG_CHUNK_GAP	3
 1126 	/* LDV_COMMENT_END_PREP */
 1127 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_map" */
 1128 	void * var_z3fold_zpool_map_26_p0;
 1129 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_map" */
 1130 	unsigned long  var_z3fold_zpool_map_26_p1;
 1131 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_map" */
 1132 	enum zpool_mapmode  var_z3fold_zpool_map_26_p2;
 1133 	/* content: static void z3fold_zpool_unmap(void *pool, unsigned long handle)*/
 1134 	/* LDV_COMMENT_BEGIN_PREP */
 1135 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1136 	#define NCHUNKS_ORDER	6
 1137 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1138 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1139 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1140 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1141 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1142 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1143 	#define BUDDY_MASK	(0x3)
 1144 	#define for_each_unbuddied_list(_iter, _begin) \
 1145 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1146 	#define BIG_CHUNK_GAP	3
 1147 	/* LDV_COMMENT_END_PREP */
 1148 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_unmap" */
 1149 	void * var_z3fold_zpool_unmap_27_p0;
 1150 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_unmap" */
 1151 	unsigned long  var_z3fold_zpool_unmap_27_p1;
 1152 	/* content: static u64 z3fold_zpool_total_size(void *pool)*/
 1153 	/* LDV_COMMENT_BEGIN_PREP */
 1154 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1155 	#define NCHUNKS_ORDER	6
 1156 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1157 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1158 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1159 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1160 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1161 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1162 	#define BUDDY_MASK	(0x3)
 1163 	#define for_each_unbuddied_list(_iter, _begin) \
 1164 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1165 	#define BIG_CHUNK_GAP	3
 1166 	/* LDV_COMMENT_END_PREP */
 1167 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "z3fold_zpool_total_size" */
 1168 	void * var_z3fold_zpool_total_size_28_p0;
 1169 
 1170 
 1171 
 1172 
 1173 	/* LDV_COMMENT_END_VARIABLE_DECLARATION_PART */
 1174 	/* LDV_COMMENT_BEGIN_VARIABLE_INITIALIZING_PART */
 1175 	/*============================= VARIABLE INITIALIZING PART  =============================*/
 1176 	LDV_IN_INTERRUPT=1;
 1177 
 1178 
 1179 
 1180 
 1181 	/* LDV_COMMENT_END_VARIABLE_INITIALIZING_PART */
 1182 	/* LDV_COMMENT_BEGIN_FUNCTION_CALL_SECTION */
 1183 	/*============================= FUNCTION CALL SECTION       =============================*/
 1184 	/* LDV_COMMENT_FUNCTION_CALL Initialize LDV model. */
 1185 	ldv_initialize();
 1186 
 1187 	/** INIT: init_type: ST_MODULE_INIT **/
 1188 	/* content: static int __init init_z3fold(void)*/
 1189 	/* LDV_COMMENT_BEGIN_PREP */
 1190 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1191 	#define NCHUNKS_ORDER	6
 1192 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1193 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1194 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1195 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1196 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1197 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1198 	#define BUDDY_MASK	(0x3)
 1199 	#define for_each_unbuddied_list(_iter, _begin) \
 1200 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1201 	#define BIG_CHUNK_GAP	3
 1202 	/* LDV_COMMENT_END_PREP */
 1203 	/* LDV_COMMENT_FUNCTION_CALL Kernel calls driver init function after driver loading to kernel. This function declared as "MODULE_INIT(function name)". */
 1204 	ldv_handler_precall();
 1205 	 if(init_z3fold()) 
 1206 		goto ldv_final;
 1207 	
 1208 
 1209 	
 1210 
 1211 
 1212 	while(  nondet_int()
 1213 	) {
 1214 
 1215 		switch(nondet_int()) {
 1216 
 1217 			case 0: {
 1218 
 1219 				/** STRUCT: struct type: z3fold_ops, struct name: z3fold_zpool_ops **/
 1220 				
 1221 
 1222 				/* content: static int z3fold_zpool_evict(struct z3fold_pool *pool, unsigned long handle)*/
 1223 				/* LDV_COMMENT_BEGIN_PREP */
 1224 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1225 				#define NCHUNKS_ORDER	6
 1226 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1227 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1228 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1229 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1230 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1231 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1232 				#define BUDDY_MASK	(0x3)
 1233 				#define for_each_unbuddied_list(_iter, _begin) \
 1234 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1235 				#define BIG_CHUNK_GAP	3
 1236 				/* LDV_COMMENT_END_PREP */
 1237 				/* LDV_COMMENT_FUNCTION_CALL Function from field "evict" from driver structure with callbacks "z3fold_zpool_ops" */
 1238 				ldv_handler_precall();
 1239 				z3fold_zpool_evict( var_group1, var_z3fold_zpool_evict_20_p1);
 1240 				
 1241 
 1242 				
 1243 
 1244 			}
 1245 
 1246 			break;
 1247 			case 1: {
 1248 
 1249 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1250 				
 1251 
 1252 				/* content: static void *z3fold_zpool_create(const char *name, gfp_t gfp, const struct zpool_ops *zpool_ops, struct zpool *zpool)*/
 1253 				/* LDV_COMMENT_BEGIN_PREP */
 1254 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1255 				#define NCHUNKS_ORDER	6
 1256 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1257 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1258 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1259 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1260 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1261 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1262 				#define BUDDY_MASK	(0x3)
 1263 				#define for_each_unbuddied_list(_iter, _begin) \
 1264 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1265 				#define BIG_CHUNK_GAP	3
 1266 				/* LDV_COMMENT_END_PREP */
 1267 				/* LDV_COMMENT_FUNCTION_CALL Function from field "create" from driver structure with callbacks "z3fold_zpool_driver" */
 1268 				ldv_handler_precall();
 1269 				z3fold_zpool_create( var_z3fold_zpool_create_21_p0, var_z3fold_zpool_create_21_p1, var_z3fold_zpool_create_21_p2, var_z3fold_zpool_create_21_p3);
 1270 				
 1271 
 1272 				
 1273 
 1274 			}
 1275 
 1276 			break;
 1277 			case 2: {
 1278 
 1279 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1280 				
 1281 
 1282 				/* content: static void z3fold_zpool_destroy(void *pool)*/
 1283 				/* LDV_COMMENT_BEGIN_PREP */
 1284 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1285 				#define NCHUNKS_ORDER	6
 1286 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1287 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1288 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1289 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1290 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1291 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1292 				#define BUDDY_MASK	(0x3)
 1293 				#define for_each_unbuddied_list(_iter, _begin) \
 1294 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1295 				#define BIG_CHUNK_GAP	3
 1296 				/* LDV_COMMENT_END_PREP */
 1297 				/* LDV_COMMENT_FUNCTION_CALL Function from field "destroy" from driver structure with callbacks "z3fold_zpool_driver" */
 1298 				ldv_handler_precall();
 1299 				z3fold_zpool_destroy( var_z3fold_zpool_destroy_22_p0);
 1300 				
 1301 
 1302 				
 1303 
 1304 			}
 1305 
 1306 			break;
 1307 			case 3: {
 1308 
 1309 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1310 				
 1311 
 1312 				/* content: static int z3fold_zpool_malloc(void *pool, size_t size, gfp_t gfp, unsigned long *handle)*/
 1313 				/* LDV_COMMENT_BEGIN_PREP */
 1314 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1315 				#define NCHUNKS_ORDER	6
 1316 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1317 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1318 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1319 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1320 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1321 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1322 				#define BUDDY_MASK	(0x3)
 1323 				#define for_each_unbuddied_list(_iter, _begin) \
 1324 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1325 				#define BIG_CHUNK_GAP	3
 1326 				/* LDV_COMMENT_END_PREP */
 1327 				/* LDV_COMMENT_FUNCTION_CALL Function from field "malloc" from driver structure with callbacks "z3fold_zpool_driver" */
 1328 				ldv_handler_precall();
 1329 				z3fold_zpool_malloc( var_z3fold_zpool_malloc_23_p0, var_z3fold_zpool_malloc_23_p1, var_z3fold_zpool_malloc_23_p2, var_z3fold_zpool_malloc_23_p3);
 1330 				
 1331 
 1332 				
 1333 
 1334 			}
 1335 
 1336 			break;
 1337 			case 4: {
 1338 
 1339 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1340 				
 1341 
 1342 				/* content: static void z3fold_zpool_free(void *pool, unsigned long handle)*/
 1343 				/* LDV_COMMENT_BEGIN_PREP */
 1344 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1345 				#define NCHUNKS_ORDER	6
 1346 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1347 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1348 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1349 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1350 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1351 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1352 				#define BUDDY_MASK	(0x3)
 1353 				#define for_each_unbuddied_list(_iter, _begin) \
 1354 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1355 				#define BIG_CHUNK_GAP	3
 1356 				/* LDV_COMMENT_END_PREP */
 1357 				/* LDV_COMMENT_FUNCTION_CALL Function from field "free" from driver structure with callbacks "z3fold_zpool_driver" */
 1358 				ldv_handler_precall();
 1359 				z3fold_zpool_free( var_z3fold_zpool_free_24_p0, var_z3fold_zpool_free_24_p1);
 1360 				
 1361 
 1362 				
 1363 
 1364 			}
 1365 
 1366 			break;
 1367 			case 5: {
 1368 
 1369 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1370 				
 1371 
 1372 				/* content: static int z3fold_zpool_shrink(void *pool, unsigned int pages, unsigned int *reclaimed)*/
 1373 				/* LDV_COMMENT_BEGIN_PREP */
 1374 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1375 				#define NCHUNKS_ORDER	6
 1376 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1377 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1378 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1379 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1380 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1381 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1382 				#define BUDDY_MASK	(0x3)
 1383 				#define for_each_unbuddied_list(_iter, _begin) \
 1384 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1385 				#define BIG_CHUNK_GAP	3
 1386 				/* LDV_COMMENT_END_PREP */
 1387 				/* LDV_COMMENT_FUNCTION_CALL Function from field "shrink" from driver structure with callbacks "z3fold_zpool_driver" */
 1388 				ldv_handler_precall();
 1389 				z3fold_zpool_shrink( var_z3fold_zpool_shrink_25_p0, var_z3fold_zpool_shrink_25_p1, var_z3fold_zpool_shrink_25_p2);
 1390 				
 1391 
 1392 				
 1393 
 1394 			}
 1395 
 1396 			break;
 1397 			case 6: {
 1398 
 1399 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1400 				
 1401 
 1402 				/* content: static void *z3fold_zpool_map(void *pool, unsigned long handle, enum zpool_mapmode mm)*/
 1403 				/* LDV_COMMENT_BEGIN_PREP */
 1404 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1405 				#define NCHUNKS_ORDER	6
 1406 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1407 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1408 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1409 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1410 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1411 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1412 				#define BUDDY_MASK	(0x3)
 1413 				#define for_each_unbuddied_list(_iter, _begin) \
 1414 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1415 				#define BIG_CHUNK_GAP	3
 1416 				/* LDV_COMMENT_END_PREP */
 1417 				/* LDV_COMMENT_FUNCTION_CALL Function from field "map" from driver structure with callbacks "z3fold_zpool_driver" */
 1418 				ldv_handler_precall();
 1419 				z3fold_zpool_map( var_z3fold_zpool_map_26_p0, var_z3fold_zpool_map_26_p1, var_z3fold_zpool_map_26_p2);
 1420 				
 1421 
 1422 				
 1423 
 1424 			}
 1425 
 1426 			break;
 1427 			case 7: {
 1428 
 1429 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1430 				
 1431 
 1432 				/* content: static void z3fold_zpool_unmap(void *pool, unsigned long handle)*/
 1433 				/* LDV_COMMENT_BEGIN_PREP */
 1434 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1435 				#define NCHUNKS_ORDER	6
 1436 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1437 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1438 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1439 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1440 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1441 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1442 				#define BUDDY_MASK	(0x3)
 1443 				#define for_each_unbuddied_list(_iter, _begin) \
 1444 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1445 				#define BIG_CHUNK_GAP	3
 1446 				/* LDV_COMMENT_END_PREP */
 1447 				/* LDV_COMMENT_FUNCTION_CALL Function from field "unmap" from driver structure with callbacks "z3fold_zpool_driver" */
 1448 				ldv_handler_precall();
 1449 				z3fold_zpool_unmap( var_z3fold_zpool_unmap_27_p0, var_z3fold_zpool_unmap_27_p1);
 1450 				
 1451 
 1452 				
 1453 
 1454 			}
 1455 
 1456 			break;
 1457 			case 8: {
 1458 
 1459 				/** STRUCT: struct type: zpool_driver, struct name: z3fold_zpool_driver **/
 1460 				
 1461 
 1462 				/* content: static u64 z3fold_zpool_total_size(void *pool)*/
 1463 				/* LDV_COMMENT_BEGIN_PREP */
 1464 				#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1465 				#define NCHUNKS_ORDER	6
 1466 				#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1467 				#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1468 				#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1469 				#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1470 				#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1471 				#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1472 				#define BUDDY_MASK	(0x3)
 1473 				#define for_each_unbuddied_list(_iter, _begin) \
 1474 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1475 				#define BIG_CHUNK_GAP	3
 1476 				/* LDV_COMMENT_END_PREP */
 1477 				/* LDV_COMMENT_FUNCTION_CALL Function from field "total_size" from driver structure with callbacks "z3fold_zpool_driver" */
 1478 				ldv_handler_precall();
 1479 				z3fold_zpool_total_size( var_z3fold_zpool_total_size_28_p0);
 1480 				
 1481 
 1482 				
 1483 
 1484 			}
 1485 
 1486 			break;
 1487 			default: break;
 1488 
 1489 		}
 1490 
 1491 	}
 1492 
 1493 	ldv_module_exit: 
 1494 
 1495 	/** INIT: init_type: ST_MODULE_EXIT **/
 1496 	/* content: static void __exit exit_z3fold(void)*/
 1497 	/* LDV_COMMENT_BEGIN_PREP */
 1498 	#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 1499 	#define NCHUNKS_ORDER	6
 1500 	#define CHUNK_SHIFT	(PAGE_SHIFT - NCHUNKS_ORDER)
 1501 	#define CHUNK_SIZE	(1 << CHUNK_SHIFT)
 1502 	#define ZHDR_SIZE_ALIGNED round_up(sizeof(struct z3fold_header), CHUNK_SIZE)
 1503 	#define ZHDR_CHUNKS	(ZHDR_SIZE_ALIGNED >> CHUNK_SHIFT)
 1504 	#define TOTAL_CHUNKS	(PAGE_SIZE >> CHUNK_SHIFT)
 1505 	#define NCHUNKS		((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
 1506 	#define BUDDY_MASK	(0x3)
 1507 	#define for_each_unbuddied_list(_iter, _begin) \
 1508 	for ((_iter) = (_begin); (_iter) < NCHUNKS; (_iter)++)
 1509 	#define BIG_CHUNK_GAP	3
 1510 	/* LDV_COMMENT_END_PREP */
 1511 	/* LDV_COMMENT_FUNCTION_CALL Kernel calls driver release function before driver will be uploaded from kernel. This function declared as "MODULE_EXIT(function name)". */
 1512 	ldv_handler_precall();
 1513 	exit_z3fold();
 1514 
 1515 	/* LDV_COMMENT_FUNCTION_CALL Checks that all resources and locks are correctly released before the driver will be unloaded. */
 1516 	ldv_final: ldv_check_final_state();
 1517 
 1518 	/* LDV_COMMENT_END_FUNCTION_CALL_SECTION */
 1519 	return;
 1520 
 1521 }
 1522 #endif
 1523 
 1524 /* LDV_COMMENT_END_MAIN */
 1525 
 1526 #line 58 "/work/ldvuser/ref_launch/work/current--X--mm--X--defaultlinux-4.11-rc1.tar.xz--X--39_7a--X--cpachecker/linux-4.11-rc1.tar.xz/csd_deg_dscv/19/dscv_tempdir/dscv/ri/39_7a/mm/z3fold.o.c.prepared"                 1 
    2 
    3 #include <linux/kernel.h>
    4 #include <linux/spinlock.h>
    5 
    6 #include <verifier/rcv.h>
    7 #include <kernel-model/ERR.inc>
    8 
    9 static int ldv_spin_lock_of_NOT_ARG_SIGN = 1;
   10 
   11 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_lock_lock_of_NOT_ARG_SIGN') Check that spin 'lock_of_NOT_ARG_SIGN' was not locked and lock it */
   12 void ldv_spin_lock_lock_of_NOT_ARG_SIGN(void)
   13 {
   14   /* LDV_COMMENT_ASSERT Spin 'lock_of_NOT_ARG_SIGN' must be unlocked */
   15   ldv_assert(ldv_spin_lock_of_NOT_ARG_SIGN == 1);
   16   /* LDV_COMMENT_CHANGE_STATE Lock spin 'lock_of_NOT_ARG_SIGN' */
   17   ldv_spin_lock_of_NOT_ARG_SIGN = 2;
   18 }
   19 
   20 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_lock_of_NOT_ARG_SIGN') Check that spin 'lock_of_NOT_ARG_SIGN' was locked and unlock it */
   21 void ldv_spin_unlock_lock_of_NOT_ARG_SIGN(void)
   22 {
   23   /* LDV_COMMENT_ASSERT Spin 'lock_of_NOT_ARG_SIGN' must be locked */
   24   ldv_assert(ldv_spin_lock_of_NOT_ARG_SIGN == 2);
   25   /* LDV_COMMENT_CHANGE_STATE Unlock spin 'lock_of_NOT_ARG_SIGN' */
   26   ldv_spin_lock_of_NOT_ARG_SIGN = 1;
   27 }
   28 
   29 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_trylock_lock_of_NOT_ARG_SIGN') Check that spin 'lock_of_NOT_ARG_SIGN' was not locked and nondeterministically lock it. Return 0 on fails */
   30 int ldv_spin_trylock_lock_of_NOT_ARG_SIGN(void)
   31 {
   32   int is_spin_held_by_another_thread;
   33 
   34   /* LDV_COMMENT_ASSERT It may be an error if spin 'lock_of_NOT_ARG_SIGN' is locked at this point */
   35   ldv_assert(ldv_spin_lock_of_NOT_ARG_SIGN == 1);
   36 
   37   /* LDV_COMMENT_OTHER Construct nondetermined result */
   38   is_spin_held_by_another_thread = ldv_undef_int();
   39 
   40   /* LDV_COMMENT_ASSERT Nondeterministically lock spin 'lock_of_NOT_ARG_SIGN' */
   41   if (is_spin_held_by_another_thread)
   42   {
   43     /* LDV_COMMENT_RETURN Spin 'lock_of_NOT_ARG_SIGN' was not locked. Finish with fail */
   44     return 0;
   45   }
   46   else
   47   {
   48     /* LDV_COMMENT_CHANGE_STATE Lock spin 'lock_of_NOT_ARG_SIGN' */
   49     ldv_spin_lock_of_NOT_ARG_SIGN = 2;
   50     /* LDV_COMMENT_RETURN Finish with success */
   51     return 1;
   52   }
   53 }
   54 
   55 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_wait_lock_of_NOT_ARG_SIGN') The same process can not both lock spin 'lock_of_NOT_ARG_SIGN' and wait until it will be unlocked  */
   56 void ldv_spin_unlock_wait_lock_of_NOT_ARG_SIGN(void)
   57 {
   58   /* LDV_COMMENT_ASSERT Spin 'lock_of_NOT_ARG_SIGN' must not be locked by a current process */
   59   ldv_assert(ldv_spin_lock_of_NOT_ARG_SIGN == 1);
   60 }
   61 
   62 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_locked_lock_of_NOT_ARG_SIGN') Check whether spin 'lock_of_NOT_ARG_SIGN' was locked */
   63 int ldv_spin_is_locked_lock_of_NOT_ARG_SIGN(void)
   64 {
   65   int is_spin_held_by_another_thread;
   66 
   67   /* LDV_COMMENT_OTHER Construct nondetermined result */
   68   is_spin_held_by_another_thread = ldv_undef_int();
   69 
   70   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'lock_of_NOT_ARG_SIGN' was locked */
   71   if(ldv_spin_lock_of_NOT_ARG_SIGN == 1 && !is_spin_held_by_another_thread)
   72   {
   73     /* LDV_COMMENT_RETURN Spin 'lock_of_NOT_ARG_SIGN' was unlocked */
   74     return 0;
   75   }
   76   else
   77   {
   78     /* LDV_COMMENT_RETURN Spin 'lock_of_NOT_ARG_SIGN' was locked */
   79     return 1;
   80   }
   81 }
   82 
   83 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_can_lock_lock_of_NOT_ARG_SIGN') Check whether spin 'lock_of_NOT_ARG_SIGN' was locked */
   84 int ldv_spin_can_lock_lock_of_NOT_ARG_SIGN(void)
   85 {
   86   /* LDV_COMMENT_RETURN Inverse function for spin_is_locked() */
   87   return !ldv_spin_is_locked_lock_of_NOT_ARG_SIGN();
   88 }
   89 
   90 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_contended_lock_of_NOT_ARG_SIGN') Check whether spin 'lock_of_NOT_ARG_SIGN' is contended */
   91 int ldv_spin_is_contended_lock_of_NOT_ARG_SIGN(void)
   92 {
   93   int is_spin_contended;
   94 
   95   /* LDV_COMMENT_OTHER Construct nondetermined result */
   96   is_spin_contended = ldv_undef_int();
   97 
   98   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'lock_of_NOT_ARG_SIGN' is contended */
   99   if(is_spin_contended)
  100   {
  101     /* LDV_COMMENT_RETURN Spin 'lock_of_NOT_ARG_SIGN' is contended */
  102     return 0;
  103   }
  104   else
  105   {
  106     /* LDV_COMMENT_RETURN Spin 'lock_of_NOT_ARG_SIGN' isn't contended */
  107     return 1;
  108   }
  109 }
  110 
  111 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_atomic_dec_and_lock_lock_of_NOT_ARG_SIGN') Lock spin 'lock_of_NOT_ARG_SIGN' if atomic decrement result is zero */
  112 int ldv_atomic_dec_and_lock_lock_of_NOT_ARG_SIGN(void)
  113 {
  114   int atomic_value_after_dec;
  115 
  116   /* LDV_COMMENT_ASSERT Spin 'lock_of_NOT_ARG_SIGN' must be unlocked (since we may lock it in this function) */
  117   ldv_assert(ldv_spin_lock_of_NOT_ARG_SIGN == 1);
  118 
  119   /* LDV_COMMENT_OTHER Assign the result of atomic decrement */
  120   atomic_value_after_dec = ldv_undef_int();
  121 
  122   /* LDV_COMMENT_ASSERT Check if atomic decrement returns zero */
  123   if (atomic_value_after_dec == 0)
  124   {
  125     /* LDV_COMMENT_CHANGE_STATE Lock spin 'lock_of_NOT_ARG_SIGN', as atomic has decremented to zero */
  126     ldv_spin_lock_of_NOT_ARG_SIGN = 2;
  127     /* LDV_COMMENT_RETURN Return 1 with locked spin 'lock_of_NOT_ARG_SIGN' */
  128     return 1;
  129   }
  130 
  131   /* LDV_COMMENT_RETURN Atomic decrement is still not zero, return 0 without locking spin 'lock_of_NOT_ARG_SIGN' */
  132   return 0;
  133 }
  134 static int ldv_spin_lock_of_z3fold_pool = 1;
  135 
  136 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_lock_lock_of_z3fold_pool') Check that spin 'lock_of_z3fold_pool' was not locked and lock it */
  137 void ldv_spin_lock_lock_of_z3fold_pool(void)
  138 {
  139   /* LDV_COMMENT_ASSERT Spin 'lock_of_z3fold_pool' must be unlocked */
  140   ldv_assert(ldv_spin_lock_of_z3fold_pool == 1);
  141   /* LDV_COMMENT_CHANGE_STATE Lock spin 'lock_of_z3fold_pool' */
  142   ldv_spin_lock_of_z3fold_pool = 2;
  143 }
  144 
  145 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_lock_of_z3fold_pool') Check that spin 'lock_of_z3fold_pool' was locked and unlock it */
  146 void ldv_spin_unlock_lock_of_z3fold_pool(void)
  147 {
  148   /* LDV_COMMENT_ASSERT Spin 'lock_of_z3fold_pool' must be locked */
  149   ldv_assert(ldv_spin_lock_of_z3fold_pool == 2);
  150   /* LDV_COMMENT_CHANGE_STATE Unlock spin 'lock_of_z3fold_pool' */
  151   ldv_spin_lock_of_z3fold_pool = 1;
  152 }
  153 
  154 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_trylock_lock_of_z3fold_pool') Check that spin 'lock_of_z3fold_pool' was not locked and nondeterministically lock it. Return 0 on fails */
  155 int ldv_spin_trylock_lock_of_z3fold_pool(void)
  156 {
  157   int is_spin_held_by_another_thread;
  158 
  159   /* LDV_COMMENT_ASSERT It may be an error if spin 'lock_of_z3fold_pool' is locked at this point */
  160   ldv_assert(ldv_spin_lock_of_z3fold_pool == 1);
  161 
  162   /* LDV_COMMENT_OTHER Construct nondetermined result */
  163   is_spin_held_by_another_thread = ldv_undef_int();
  164 
  165   /* LDV_COMMENT_ASSERT Nondeterministically lock spin 'lock_of_z3fold_pool' */
  166   if (is_spin_held_by_another_thread)
  167   {
  168     /* LDV_COMMENT_RETURN Spin 'lock_of_z3fold_pool' was not locked. Finish with fail */
  169     return 0;
  170   }
  171   else
  172   {
  173     /* LDV_COMMENT_CHANGE_STATE Lock spin 'lock_of_z3fold_pool' */
  174     ldv_spin_lock_of_z3fold_pool = 2;
  175     /* LDV_COMMENT_RETURN Finish with success */
  176     return 1;
  177   }
  178 }
  179 
  180 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_wait_lock_of_z3fold_pool') The same process can not both lock spin 'lock_of_z3fold_pool' and wait until it will be unlocked  */
  181 void ldv_spin_unlock_wait_lock_of_z3fold_pool(void)
  182 {
  183   /* LDV_COMMENT_ASSERT Spin 'lock_of_z3fold_pool' must not be locked by a current process */
  184   ldv_assert(ldv_spin_lock_of_z3fold_pool == 1);
  185 }
  186 
  187 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_locked_lock_of_z3fold_pool') Check whether spin 'lock_of_z3fold_pool' was locked */
  188 int ldv_spin_is_locked_lock_of_z3fold_pool(void)
  189 {
  190   int is_spin_held_by_another_thread;
  191 
  192   /* LDV_COMMENT_OTHER Construct nondetermined result */
  193   is_spin_held_by_another_thread = ldv_undef_int();
  194 
  195   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'lock_of_z3fold_pool' was locked */
  196   if(ldv_spin_lock_of_z3fold_pool == 1 && !is_spin_held_by_another_thread)
  197   {
  198     /* LDV_COMMENT_RETURN Spin 'lock_of_z3fold_pool' was unlocked */
  199     return 0;
  200   }
  201   else
  202   {
  203     /* LDV_COMMENT_RETURN Spin 'lock_of_z3fold_pool' was locked */
  204     return 1;
  205   }
  206 }
  207 
  208 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_can_lock_lock_of_z3fold_pool') Check whether spin 'lock_of_z3fold_pool' was locked */
  209 int ldv_spin_can_lock_lock_of_z3fold_pool(void)
  210 {
  211   /* LDV_COMMENT_RETURN Inverse function for spin_is_locked() */
  212   return !ldv_spin_is_locked_lock_of_z3fold_pool();
  213 }
  214 
  215 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_contended_lock_of_z3fold_pool') Check whether spin 'lock_of_z3fold_pool' is contended */
  216 int ldv_spin_is_contended_lock_of_z3fold_pool(void)
  217 {
  218   int is_spin_contended;
  219 
  220   /* LDV_COMMENT_OTHER Construct nondetermined result */
  221   is_spin_contended = ldv_undef_int();
  222 
  223   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'lock_of_z3fold_pool' is contended */
  224   if(is_spin_contended)
  225   {
  226     /* LDV_COMMENT_RETURN Spin 'lock_of_z3fold_pool' is contended */
  227     return 0;
  228   }
  229   else
  230   {
  231     /* LDV_COMMENT_RETURN Spin 'lock_of_z3fold_pool' isn't contended */
  232     return 1;
  233   }
  234 }
  235 
  236 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_atomic_dec_and_lock_lock_of_z3fold_pool') Lock spin 'lock_of_z3fold_pool' if atomic decrement result is zero */
  237 int ldv_atomic_dec_and_lock_lock_of_z3fold_pool(void)
  238 {
  239   int atomic_value_after_dec;
  240 
  241   /* LDV_COMMENT_ASSERT Spin 'lock_of_z3fold_pool' must be unlocked (since we may lock it in this function) */
  242   ldv_assert(ldv_spin_lock_of_z3fold_pool == 1);
  243 
  244   /* LDV_COMMENT_OTHER Assign the result of atomic decrement */
  245   atomic_value_after_dec = ldv_undef_int();
  246 
  247   /* LDV_COMMENT_ASSERT Check if atomic decrement returns zero */
  248   if (atomic_value_after_dec == 0)
  249   {
  250     /* LDV_COMMENT_CHANGE_STATE Lock spin 'lock_of_z3fold_pool', as atomic has decremented to zero */
  251     ldv_spin_lock_of_z3fold_pool = 2;
  252     /* LDV_COMMENT_RETURN Return 1 with locked spin 'lock_of_z3fold_pool' */
  253     return 1;
  254   }
  255 
  256   /* LDV_COMMENT_RETURN Atomic decrement is still not zero, return 0 without locking spin 'lock_of_z3fold_pool' */
  257   return 0;
  258 }
  259 static int ldv_spin_node_size_lock_of_pglist_data = 1;
  260 
  261 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_lock_node_size_lock_of_pglist_data') Check that spin 'node_size_lock_of_pglist_data' was not locked and lock it */
  262 void ldv_spin_lock_node_size_lock_of_pglist_data(void)
  263 {
  264   /* LDV_COMMENT_ASSERT Spin 'node_size_lock_of_pglist_data' must be unlocked */
  265   ldv_assert(ldv_spin_node_size_lock_of_pglist_data == 1);
  266   /* LDV_COMMENT_CHANGE_STATE Lock spin 'node_size_lock_of_pglist_data' */
  267   ldv_spin_node_size_lock_of_pglist_data = 2;
  268 }
  269 
  270 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_node_size_lock_of_pglist_data') Check that spin 'node_size_lock_of_pglist_data' was locked and unlock it */
  271 void ldv_spin_unlock_node_size_lock_of_pglist_data(void)
  272 {
  273   /* LDV_COMMENT_ASSERT Spin 'node_size_lock_of_pglist_data' must be locked */
  274   ldv_assert(ldv_spin_node_size_lock_of_pglist_data == 2);
  275   /* LDV_COMMENT_CHANGE_STATE Unlock spin 'node_size_lock_of_pglist_data' */
  276   ldv_spin_node_size_lock_of_pglist_data = 1;
  277 }
  278 
  279 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_trylock_node_size_lock_of_pglist_data') Check that spin 'node_size_lock_of_pglist_data' was not locked and nondeterministically lock it. Return 0 on fails */
  280 int ldv_spin_trylock_node_size_lock_of_pglist_data(void)
  281 {
  282   int is_spin_held_by_another_thread;
  283 
  284   /* LDV_COMMENT_ASSERT It may be an error if spin 'node_size_lock_of_pglist_data' is locked at this point */
  285   ldv_assert(ldv_spin_node_size_lock_of_pglist_data == 1);
  286 
  287   /* LDV_COMMENT_OTHER Construct nondetermined result */
  288   is_spin_held_by_another_thread = ldv_undef_int();
  289 
  290   /* LDV_COMMENT_ASSERT Nondeterministically lock spin 'node_size_lock_of_pglist_data' */
  291   if (is_spin_held_by_another_thread)
  292   {
  293     /* LDV_COMMENT_RETURN Spin 'node_size_lock_of_pglist_data' was not locked. Finish with fail */
  294     return 0;
  295   }
  296   else
  297   {
  298     /* LDV_COMMENT_CHANGE_STATE Lock spin 'node_size_lock_of_pglist_data' */
  299     ldv_spin_node_size_lock_of_pglist_data = 2;
  300     /* LDV_COMMENT_RETURN Finish with success */
  301     return 1;
  302   }
  303 }
  304 
  305 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_wait_node_size_lock_of_pglist_data') The same process can not both lock spin 'node_size_lock_of_pglist_data' and wait until it will be unlocked  */
  306 void ldv_spin_unlock_wait_node_size_lock_of_pglist_data(void)
  307 {
  308   /* LDV_COMMENT_ASSERT Spin 'node_size_lock_of_pglist_data' must not be locked by a current process */
  309   ldv_assert(ldv_spin_node_size_lock_of_pglist_data == 1);
  310 }
  311 
  312 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_locked_node_size_lock_of_pglist_data') Check whether spin 'node_size_lock_of_pglist_data' was locked */
  313 int ldv_spin_is_locked_node_size_lock_of_pglist_data(void)
  314 {
  315   int is_spin_held_by_another_thread;
  316 
  317   /* LDV_COMMENT_OTHER Construct nondetermined result */
  318   is_spin_held_by_another_thread = ldv_undef_int();
  319 
  320   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'node_size_lock_of_pglist_data' was locked */
  321   if(ldv_spin_node_size_lock_of_pglist_data == 1 && !is_spin_held_by_another_thread)
  322   {
  323     /* LDV_COMMENT_RETURN Spin 'node_size_lock_of_pglist_data' was unlocked */
  324     return 0;
  325   }
  326   else
  327   {
  328     /* LDV_COMMENT_RETURN Spin 'node_size_lock_of_pglist_data' was locked */
  329     return 1;
  330   }
  331 }
  332 
  333 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_can_lock_node_size_lock_of_pglist_data') Check whether spin 'node_size_lock_of_pglist_data' was locked */
  334 int ldv_spin_can_lock_node_size_lock_of_pglist_data(void)
  335 {
  336   /* LDV_COMMENT_RETURN Inverse function for spin_is_locked() */
  337   return !ldv_spin_is_locked_node_size_lock_of_pglist_data();
  338 }
  339 
  340 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_contended_node_size_lock_of_pglist_data') Check whether spin 'node_size_lock_of_pglist_data' is contended */
  341 int ldv_spin_is_contended_node_size_lock_of_pglist_data(void)
  342 {
  343   int is_spin_contended;
  344 
  345   /* LDV_COMMENT_OTHER Construct nondetermined result */
  346   is_spin_contended = ldv_undef_int();
  347 
  348   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'node_size_lock_of_pglist_data' is contended */
  349   if(is_spin_contended)
  350   {
  351     /* LDV_COMMENT_RETURN Spin 'node_size_lock_of_pglist_data' is contended */
  352     return 0;
  353   }
  354   else
  355   {
  356     /* LDV_COMMENT_RETURN Spin 'node_size_lock_of_pglist_data' isn't contended */
  357     return 1;
  358   }
  359 }
  360 
  361 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_atomic_dec_and_lock_node_size_lock_of_pglist_data') Lock spin 'node_size_lock_of_pglist_data' if atomic decrement result is zero */
  362 int ldv_atomic_dec_and_lock_node_size_lock_of_pglist_data(void)
  363 {
  364   int atomic_value_after_dec;
  365 
  366   /* LDV_COMMENT_ASSERT Spin 'node_size_lock_of_pglist_data' must be unlocked (since we may lock it in this function) */
  367   ldv_assert(ldv_spin_node_size_lock_of_pglist_data == 1);
  368 
  369   /* LDV_COMMENT_OTHER Assign the result of atomic decrement */
  370   atomic_value_after_dec = ldv_undef_int();
  371 
  372   /* LDV_COMMENT_ASSERT Check if atomic decrement returns zero */
  373   if (atomic_value_after_dec == 0)
  374   {
  375     /* LDV_COMMENT_CHANGE_STATE Lock spin 'node_size_lock_of_pglist_data', as atomic has decremented to zero */
  376     ldv_spin_node_size_lock_of_pglist_data = 2;
  377     /* LDV_COMMENT_RETURN Return 1 with locked spin 'node_size_lock_of_pglist_data' */
  378     return 1;
  379   }
  380 
  381   /* LDV_COMMENT_RETURN Atomic decrement is still not zero, return 0 without locking spin 'node_size_lock_of_pglist_data' */
  382   return 0;
  383 }
  384 static int ldv_spin_page_lock_of_z3fold_header = 1;
  385 
  386 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_lock_page_lock_of_z3fold_header') Check that spin 'page_lock_of_z3fold_header' was not locked and lock it */
  387 void ldv_spin_lock_page_lock_of_z3fold_header(void)
  388 {
  389   /* LDV_COMMENT_ASSERT Spin 'page_lock_of_z3fold_header' must be unlocked */
  390   ldv_assert(ldv_spin_page_lock_of_z3fold_header == 1);
  391   /* LDV_COMMENT_CHANGE_STATE Lock spin 'page_lock_of_z3fold_header' */
  392   ldv_spin_page_lock_of_z3fold_header = 2;
  393 }
  394 
  395 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_page_lock_of_z3fold_header') Check that spin 'page_lock_of_z3fold_header' was locked and unlock it */
  396 void ldv_spin_unlock_page_lock_of_z3fold_header(void)
  397 {
  398   /* LDV_COMMENT_ASSERT Spin 'page_lock_of_z3fold_header' must be locked */
  399   ldv_assert(ldv_spin_page_lock_of_z3fold_header == 2);
  400   /* LDV_COMMENT_CHANGE_STATE Unlock spin 'page_lock_of_z3fold_header' */
  401   ldv_spin_page_lock_of_z3fold_header = 1;
  402 }
  403 
  404 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_trylock_page_lock_of_z3fold_header') Check that spin 'page_lock_of_z3fold_header' was not locked and nondeterministically lock it. Return 0 on fails */
  405 int ldv_spin_trylock_page_lock_of_z3fold_header(void)
  406 {
  407   int is_spin_held_by_another_thread;
  408 
  409   /* LDV_COMMENT_ASSERT It may be an error if spin 'page_lock_of_z3fold_header' is locked at this point */
  410   ldv_assert(ldv_spin_page_lock_of_z3fold_header == 1);
  411 
  412   /* LDV_COMMENT_OTHER Construct nondetermined result */
  413   is_spin_held_by_another_thread = ldv_undef_int();
  414 
  415   /* LDV_COMMENT_ASSERT Nondeterministically lock spin 'page_lock_of_z3fold_header' */
  416   if (is_spin_held_by_another_thread)
  417   {
  418     /* LDV_COMMENT_RETURN Spin 'page_lock_of_z3fold_header' was not locked. Finish with fail */
  419     return 0;
  420   }
  421   else
  422   {
  423     /* LDV_COMMENT_CHANGE_STATE Lock spin 'page_lock_of_z3fold_header' */
  424     ldv_spin_page_lock_of_z3fold_header = 2;
  425     /* LDV_COMMENT_RETURN Finish with success */
  426     return 1;
  427   }
  428 }
  429 
  430 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_wait_page_lock_of_z3fold_header') The same process can not both lock spin 'page_lock_of_z3fold_header' and wait until it will be unlocked  */
  431 void ldv_spin_unlock_wait_page_lock_of_z3fold_header(void)
  432 {
  433   /* LDV_COMMENT_ASSERT Spin 'page_lock_of_z3fold_header' must not be locked by a current process */
  434   ldv_assert(ldv_spin_page_lock_of_z3fold_header == 1);
  435 }
  436 
  437 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_locked_page_lock_of_z3fold_header') Check whether spin 'page_lock_of_z3fold_header' was locked */
  438 int ldv_spin_is_locked_page_lock_of_z3fold_header(void)
  439 {
  440   int is_spin_held_by_another_thread;
  441 
  442   /* LDV_COMMENT_OTHER Construct nondetermined result */
  443   is_spin_held_by_another_thread = ldv_undef_int();
  444 
  445   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'page_lock_of_z3fold_header' was locked */
  446   if(ldv_spin_page_lock_of_z3fold_header == 1 && !is_spin_held_by_another_thread)
  447   {
  448     /* LDV_COMMENT_RETURN Spin 'page_lock_of_z3fold_header' was unlocked */
  449     return 0;
  450   }
  451   else
  452   {
  453     /* LDV_COMMENT_RETURN Spin 'page_lock_of_z3fold_header' was locked */
  454     return 1;
  455   }
  456 }
  457 
  458 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_can_lock_page_lock_of_z3fold_header') Check whether spin 'page_lock_of_z3fold_header' was locked */
  459 int ldv_spin_can_lock_page_lock_of_z3fold_header(void)
  460 {
  461   /* LDV_COMMENT_RETURN Inverse function for spin_is_locked() */
  462   return !ldv_spin_is_locked_page_lock_of_z3fold_header();
  463 }
  464 
  465 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_contended_page_lock_of_z3fold_header') Check whether spin 'page_lock_of_z3fold_header' is contended */
  466 int ldv_spin_is_contended_page_lock_of_z3fold_header(void)
  467 {
  468   int is_spin_contended;
  469 
  470   /* LDV_COMMENT_OTHER Construct nondetermined result */
  471   is_spin_contended = ldv_undef_int();
  472 
  473   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'page_lock_of_z3fold_header' is contended */
  474   if(is_spin_contended)
  475   {
  476     /* LDV_COMMENT_RETURN Spin 'page_lock_of_z3fold_header' is contended */
  477     return 0;
  478   }
  479   else
  480   {
  481     /* LDV_COMMENT_RETURN Spin 'page_lock_of_z3fold_header' isn't contended */
  482     return 1;
  483   }
  484 }
  485 
  486 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_atomic_dec_and_lock_page_lock_of_z3fold_header') Lock spin 'page_lock_of_z3fold_header' if atomic decrement result is zero */
  487 int ldv_atomic_dec_and_lock_page_lock_of_z3fold_header(void)
  488 {
  489   int atomic_value_after_dec;
  490 
  491   /* LDV_COMMENT_ASSERT Spin 'page_lock_of_z3fold_header' must be unlocked (since we may lock it in this function) */
  492   ldv_assert(ldv_spin_page_lock_of_z3fold_header == 1);
  493 
  494   /* LDV_COMMENT_OTHER Assign the result of atomic decrement */
  495   atomic_value_after_dec = ldv_undef_int();
  496 
  497   /* LDV_COMMENT_ASSERT Check if atomic decrement returns zero */
  498   if (atomic_value_after_dec == 0)
  499   {
  500     /* LDV_COMMENT_CHANGE_STATE Lock spin 'page_lock_of_z3fold_header', as atomic has decremented to zero */
  501     ldv_spin_page_lock_of_z3fold_header = 2;
  502     /* LDV_COMMENT_RETURN Return 1 with locked spin 'page_lock_of_z3fold_header' */
  503     return 1;
  504   }
  505 
  506   /* LDV_COMMENT_RETURN Atomic decrement is still not zero, return 0 without locking spin 'page_lock_of_z3fold_header' */
  507   return 0;
  508 }
  509 static int ldv_spin_ptl = 1;
  510 
  511 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_lock_ptl') Check that spin 'ptl' was not locked and lock it */
  512 void ldv_spin_lock_ptl(void)
  513 {
  514   /* LDV_COMMENT_ASSERT Spin 'ptl' must be unlocked */
  515   ldv_assert(ldv_spin_ptl == 1);
  516   /* LDV_COMMENT_CHANGE_STATE Lock spin 'ptl' */
  517   ldv_spin_ptl = 2;
  518 }
  519 
  520 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_ptl') Check that spin 'ptl' was locked and unlock it */
  521 void ldv_spin_unlock_ptl(void)
  522 {
  523   /* LDV_COMMENT_ASSERT Spin 'ptl' must be locked */
  524   ldv_assert(ldv_spin_ptl == 2);
  525   /* LDV_COMMENT_CHANGE_STATE Unlock spin 'ptl' */
  526   ldv_spin_ptl = 1;
  527 }
  528 
  529 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_trylock_ptl') Check that spin 'ptl' was not locked and nondeterministically lock it. Return 0 on fails */
  530 int ldv_spin_trylock_ptl(void)
  531 {
  532   int is_spin_held_by_another_thread;
  533 
  534   /* LDV_COMMENT_ASSERT It may be an error if spin 'ptl' is locked at this point */
  535   ldv_assert(ldv_spin_ptl == 1);
  536 
  537   /* LDV_COMMENT_OTHER Construct nondetermined result */
  538   is_spin_held_by_another_thread = ldv_undef_int();
  539 
  540   /* LDV_COMMENT_ASSERT Nondeterministically lock spin 'ptl' */
  541   if (is_spin_held_by_another_thread)
  542   {
  543     /* LDV_COMMENT_RETURN Spin 'ptl' was not locked. Finish with fail */
  544     return 0;
  545   }
  546   else
  547   {
  548     /* LDV_COMMENT_CHANGE_STATE Lock spin 'ptl' */
  549     ldv_spin_ptl = 2;
  550     /* LDV_COMMENT_RETURN Finish with success */
  551     return 1;
  552   }
  553 }
  554 
  555 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_unlock_wait_ptl') The same process can not both lock spin 'ptl' and wait until it will be unlocked  */
  556 void ldv_spin_unlock_wait_ptl(void)
  557 {
  558   /* LDV_COMMENT_ASSERT Spin 'ptl' must not be locked by a current process */
  559   ldv_assert(ldv_spin_ptl == 1);
  560 }
  561 
  562 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_locked_ptl') Check whether spin 'ptl' was locked */
  563 int ldv_spin_is_locked_ptl(void)
  564 {
  565   int is_spin_held_by_another_thread;
  566 
  567   /* LDV_COMMENT_OTHER Construct nondetermined result */
  568   is_spin_held_by_another_thread = ldv_undef_int();
  569 
  570   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'ptl' was locked */
  571   if(ldv_spin_ptl == 1 && !is_spin_held_by_another_thread)
  572   {
  573     /* LDV_COMMENT_RETURN Spin 'ptl' was unlocked */
  574     return 0;
  575   }
  576   else
  577   {
  578     /* LDV_COMMENT_RETURN Spin 'ptl' was locked */
  579     return 1;
  580   }
  581 }
  582 
  583 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_can_lock_ptl') Check whether spin 'ptl' was locked */
  584 int ldv_spin_can_lock_ptl(void)
  585 {
  586   /* LDV_COMMENT_RETURN Inverse function for spin_is_locked() */
  587   return !ldv_spin_is_locked_ptl();
  588 }
  589 
  590 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_spin_is_contended_ptl') Check whether spin 'ptl' is contended */
  591 int ldv_spin_is_contended_ptl(void)
  592 {
  593   int is_spin_contended;
  594 
  595   /* LDV_COMMENT_OTHER Construct nondetermined result */
  596   is_spin_contended = ldv_undef_int();
  597 
  598   /* LDV_COMMENT_ASSERT Nondeterministically understand whether spin 'ptl' is contended */
  599   if(is_spin_contended)
  600   {
  601     /* LDV_COMMENT_RETURN Spin 'ptl' is contended */
  602     return 0;
  603   }
  604   else
  605   {
  606     /* LDV_COMMENT_RETURN Spin 'ptl' isn't contended */
  607     return 1;
  608   }
  609 }
  610 
  611 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_atomic_dec_and_lock_ptl') Lock spin 'ptl' if atomic decrement result is zero */
  612 int ldv_atomic_dec_and_lock_ptl(void)
  613 {
  614   int atomic_value_after_dec;
  615 
  616   /* LDV_COMMENT_ASSERT Spin 'ptl' must be unlocked (since we may lock it in this function) */
  617   ldv_assert(ldv_spin_ptl == 1);
  618 
  619   /* LDV_COMMENT_OTHER Assign the result of atomic decrement */
  620   atomic_value_after_dec = ldv_undef_int();
  621 
  622   /* LDV_COMMENT_ASSERT Check if atomic decrement returns zero */
  623   if (atomic_value_after_dec == 0)
  624   {
  625     /* LDV_COMMENT_CHANGE_STATE Lock spin 'ptl', as atomic has decremented to zero */
  626     ldv_spin_ptl = 2;
  627     /* LDV_COMMENT_RETURN Return 1 with locked spin 'ptl' */
  628     return 1;
  629   }
  630 
  631   /* LDV_COMMENT_RETURN Atomic decrement is still not zero, return 0 without locking spin 'ptl' */
  632   return 0;
  633 }
  634 
  635 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_check_final_state') Check that all spins are unlocked at the end */
  636 void ldv_check_final_state(void)
  637 {
  638   /* LDV_COMMENT_ASSERT Spin 'lock_of_NOT_ARG_SIGN' must be unlocked at the end */
  639   ldv_assert(ldv_spin_lock_of_NOT_ARG_SIGN == 1);
  640   /* LDV_COMMENT_ASSERT Spin 'lock_of_z3fold_pool' must be unlocked at the end */
  641   ldv_assert(ldv_spin_lock_of_z3fold_pool == 1);
  642   /* LDV_COMMENT_ASSERT Spin 'node_size_lock_of_pglist_data' must be unlocked at the end */
  643   ldv_assert(ldv_spin_node_size_lock_of_pglist_data == 1);
  644   /* LDV_COMMENT_ASSERT Spin 'page_lock_of_z3fold_header' must be unlocked at the end */
  645   ldv_assert(ldv_spin_page_lock_of_z3fold_header == 1);
  646   /* LDV_COMMENT_ASSERT Spin 'ptl' must be unlocked at the end */
  647   ldv_assert(ldv_spin_ptl == 1);
  648 }                 1 #ifndef _LDV_RCV_H_
    2 #define _LDV_RCV_H_
    3 
    4 /* If expr evaluates to zero, ldv_assert() causes a program to reach the error
    5    label like the standard assert(). */
    6 #define ldv_assert(expr) ((expr) ? 0 : ldv_error())
    7 
    8 /* The error label wrapper. It is used because of some static verifiers (like
    9    BLAST) don't accept multiple error labels through a program. */
   10 static inline void ldv_error(void)
   11 {
   12   LDV_ERROR: goto LDV_ERROR;
   13 }
   14 
   15 /* If expr evaluates to zero, ldv_assume() causes an infinite loop that is
   16    avoided by verifiers. */
   17 #define ldv_assume(expr) ((expr) ? 0 : ldv_stop())
   18 
   19 /* Infinite loop, that causes verifiers to skip such paths. */
   20 static inline void ldv_stop(void) {
   21   LDV_STOP: goto LDV_STOP;
   22 }
   23 
   24 /* Special nondeterministic functions. */
   25 int ldv_undef_int(void);
   26 void *ldv_undef_ptr(void);
   27 unsigned long ldv_undef_ulong(void);
   28 long ldv_undef_long(void);
   29 /* Return nondeterministic negative integer number. */
   30 static inline int ldv_undef_int_negative(void)
   31 {
   32   int ret = ldv_undef_int();
   33 
   34   ldv_assume(ret < 0);
   35 
   36   return ret;
   37 }
   38 /* Return nondeterministic nonpositive integer number. */
   39 static inline int ldv_undef_int_nonpositive(void)
   40 {
   41   int ret = ldv_undef_int();
   42 
   43   ldv_assume(ret <= 0);
   44 
   45   return ret;
   46 }
   47 
   48 /* Add explicit model for __builin_expect GCC function. Without the model a
   49    return value will be treated as nondetermined by verifiers. */
   50 static inline long __builtin_expect(long exp, long c)
   51 {
   52   return exp;
   53 }
   54 
   55 /* This function causes the program to exit abnormally. GCC implements this
   56 function by using a target-dependent mechanism (such as intentionally executing
   57 an illegal instruction) or by calling abort. The mechanism used may vary from
   58 release to release so you should not rely on any particular implementation.
   59 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html */
   60 static inline void __builtin_trap(void)
   61 {
   62   ldv_assert(0);
   63 }
   64 
   65 /* The constant is for simulating an error of ldv_undef_ptr() function. */
   66 #define LDV_PTR_MAX 2012
   67 
   68 #endif /* _LDV_RCV_H_ */                 1 #ifndef __LINUX_COMPILER_H
    2 #define __LINUX_COMPILER_H
    3 
    4 #ifndef __ASSEMBLY__
    5 
    6 #ifdef __CHECKER__
    7 # define __user		__attribute__((noderef, address_space(1)))
    8 # define __kernel	__attribute__((address_space(0)))
    9 # define __safe		__attribute__((safe))
   10 # define __force	__attribute__((force))
   11 # define __nocast	__attribute__((nocast))
   12 # define __iomem	__attribute__((noderef, address_space(2)))
   13 # define __must_hold(x)	__attribute__((context(x,1,1)))
   14 # define __acquires(x)	__attribute__((context(x,0,1)))
   15 # define __releases(x)	__attribute__((context(x,1,0)))
   16 # define __acquire(x)	__context__(x,1)
   17 # define __release(x)	__context__(x,-1)
   18 # define __cond_lock(x,c)	((c) ? ({ __acquire(x); 1; }) : 0)
   19 # define __percpu	__attribute__((noderef, address_space(3)))
   20 #ifdef CONFIG_SPARSE_RCU_POINTER
   21 # define __rcu		__attribute__((noderef, address_space(4)))
   22 #else /* CONFIG_SPARSE_RCU_POINTER */
   23 # define __rcu
   24 #endif /* CONFIG_SPARSE_RCU_POINTER */
   25 # define __private	__attribute__((noderef))
   26 extern void __chk_user_ptr(const volatile void __user *);
   27 extern void __chk_io_ptr(const volatile void __iomem *);
   28 # define ACCESS_PRIVATE(p, member) (*((typeof((p)->member) __force *) &(p)->member))
   29 #else /* __CHECKER__ */
   30 # ifdef STRUCTLEAK_PLUGIN
   31 #  define __user __attribute__((user))
   32 # else
   33 #  define __user
   34 # endif
   35 # define __kernel
   36 # define __safe
   37 # define __force
   38 # define __nocast
   39 # define __iomem
   40 # define __chk_user_ptr(x) (void)0
   41 # define __chk_io_ptr(x) (void)0
   42 # define __builtin_warning(x, y...) (1)
   43 # define __must_hold(x)
   44 # define __acquires(x)
   45 # define __releases(x)
   46 # define __acquire(x) (void)0
   47 # define __release(x) (void)0
   48 # define __cond_lock(x,c) (c)
   49 # define __percpu
   50 # define __rcu
   51 # define __private
   52 # define ACCESS_PRIVATE(p, member) ((p)->member)
   53 #endif /* __CHECKER__ */
   54 
   55 /* Indirect macros required for expanded argument pasting, eg. __LINE__. */
   56 #define ___PASTE(a,b) a##b
   57 #define __PASTE(a,b) ___PASTE(a,b)
   58 
   59 #ifdef __KERNEL__
   60 
   61 #ifdef __GNUC__
   62 #include <linux/compiler-gcc.h>
   63 #endif
   64 
   65 #if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__)
   66 #define notrace __attribute__((hotpatch(0,0)))
   67 #else
   68 #define notrace __attribute__((no_instrument_function))
   69 #endif
   70 
   71 /* Intel compiler defines __GNUC__. So we will overwrite implementations
   72  * coming from above header files here
   73  */
   74 #ifdef __INTEL_COMPILER
   75 # include <linux/compiler-intel.h>
   76 #endif
   77 
   78 /* Clang compiler defines __GNUC__. So we will overwrite implementations
   79  * coming from above header files here
   80  */
   81 #ifdef __clang__
   82 #include <linux/compiler-clang.h>
   83 #endif
   84 
   85 /*
   86  * Generic compiler-dependent macros required for kernel
   87  * build go below this comment. Actual compiler/compiler version
   88  * specific implementations come from the above header files
   89  */
   90 
   91 struct ftrace_branch_data {
   92 	const char *func;
   93 	const char *file;
   94 	unsigned line;
   95 	union {
   96 		struct {
   97 			unsigned long correct;
   98 			unsigned long incorrect;
   99 		};
  100 		struct {
  101 			unsigned long miss;
  102 			unsigned long hit;
  103 		};
  104 		unsigned long miss_hit[2];
  105 	};
  106 };
  107 
  108 struct ftrace_likely_data {
  109 	struct ftrace_branch_data	data;
  110 	unsigned long			constant;
  111 };
  112 
  113 /*
  114  * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
  115  * to disable branch tracing on a per file basis.
  116  */
  117 #if defined(CONFIG_TRACE_BRANCH_PROFILING) \
  118     && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
  119 void ftrace_likely_update(struct ftrace_likely_data *f, int val,
  120 			  int expect, int is_constant);
  121 
  122 #define likely_notrace(x)	__builtin_expect(!!(x), 1)
  123 #define unlikely_notrace(x)	__builtin_expect(!!(x), 0)
  124 
  125 #define __branch_check__(x, expect, is_constant) ({			\
  126 			int ______r;					\
  127 			static struct ftrace_likely_data		\
  128 				__attribute__((__aligned__(4)))		\
  129 				__attribute__((section("_ftrace_annotated_branch"))) \
  130 				______f = {				\
  131 				.data.func = __func__,			\
  132 				.data.file = __FILE__,			\
  133 				.data.line = __LINE__,			\
  134 			};						\
  135 			______r = __builtin_expect(!!(x), expect);	\
  136 			ftrace_likely_update(&______f, ______r,		\
  137 					     expect, is_constant);	\
  138 			______r;					\
  139 		})
  140 
  141 /*
  142  * Using __builtin_constant_p(x) to ignore cases where the return
  143  * value is always the same.  This idea is taken from a similar patch
  144  * written by Daniel Walker.
  145  */
  146 # ifndef likely
  147 #  define likely(x)	(__branch_check__(x, 1, __builtin_constant_p(x)))
  148 # endif
  149 # ifndef unlikely
  150 #  define unlikely(x)	(__branch_check__(x, 0, __builtin_constant_p(x)))
  151 # endif
  152 
  153 #ifdef CONFIG_PROFILE_ALL_BRANCHES
  154 /*
  155  * "Define 'is'", Bill Clinton
  156  * "Define 'if'", Steven Rostedt
  157  */
  158 #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
  159 #define __trace_if(cond) \
  160 	if (__builtin_constant_p(!!(cond)) ? !!(cond) :			\
  161 	({								\
  162 		int ______r;						\
  163 		static struct ftrace_branch_data			\
  164 			__attribute__((__aligned__(4)))			\
  165 			__attribute__((section("_ftrace_branch")))	\
  166 			______f = {					\
  167 				.func = __func__,			\
  168 				.file = __FILE__,			\
  169 				.line = __LINE__,			\
  170 			};						\
  171 		______r = !!(cond);					\
  172 		______f.miss_hit[______r]++;					\
  173 		______r;						\
  174 	}))
  175 #endif /* CONFIG_PROFILE_ALL_BRANCHES */
  176 
  177 #else
  178 # define likely(x)	__builtin_expect(!!(x), 1)
  179 # define unlikely(x)	__builtin_expect(!!(x), 0)
  180 #endif
  181 
  182 /* Optimization barrier */
  183 #ifndef barrier
  184 # define barrier() __memory_barrier()
  185 #endif
  186 
  187 #ifndef barrier_data
  188 # define barrier_data(ptr) barrier()
  189 #endif
  190 
  191 /* Unreachable code */
  192 #ifndef unreachable
  193 # define unreachable() do { } while (1)
  194 #endif
  195 
  196 /*
  197  * KENTRY - kernel entry point
  198  * This can be used to annotate symbols (functions or data) that are used
  199  * without their linker symbol being referenced explicitly. For example,
  200  * interrupt vector handlers, or functions in the kernel image that are found
  201  * programatically.
  202  *
  203  * Not required for symbols exported with EXPORT_SYMBOL, or initcalls. Those
  204  * are handled in their own way (with KEEP() in linker scripts).
  205  *
  206  * KENTRY can be avoided if the symbols in question are marked as KEEP() in the
  207  * linker script. For example an architecture could KEEP() its entire
  208  * boot/exception vector code rather than annotate each function and data.
  209  */
  210 #ifndef KENTRY
  211 # define KENTRY(sym)						\
  212 	extern typeof(sym) sym;					\
  213 	static const unsigned long __kentry_##sym		\
  214 	__used							\
  215 	__attribute__((section("___kentry" "+" #sym ), used))	\
  216 	= (unsigned long)&sym;
  217 #endif
  218 
  219 #ifndef RELOC_HIDE
  220 # define RELOC_HIDE(ptr, off)					\
  221   ({ unsigned long __ptr;					\
  222      __ptr = (unsigned long) (ptr);				\
  223     (typeof(ptr)) (__ptr + (off)); })
  224 #endif
  225 
  226 #ifndef OPTIMIZER_HIDE_VAR
  227 #define OPTIMIZER_HIDE_VAR(var) barrier()
  228 #endif
  229 
  230 /* Not-quite-unique ID. */
  231 #ifndef __UNIQUE_ID
  232 # define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__)
  233 #endif
  234 
  235 #include <uapi/linux/types.h>
  236 
  237 #define __READ_ONCE_SIZE						\
  238 ({									\
  239 	switch (size) {							\
  240 	case 1: *(__u8 *)res = *(volatile __u8 *)p; break;		\
  241 	case 2: *(__u16 *)res = *(volatile __u16 *)p; break;		\
  242 	case 4: *(__u32 *)res = *(volatile __u32 *)p; break;		\
  243 	case 8: *(__u64 *)res = *(volatile __u64 *)p; break;		\
  244 	default:							\
  245 		barrier();						\
  246 		__builtin_memcpy((void *)res, (const void *)p, size);	\
  247 		barrier();						\
  248 	}								\
  249 })
  250 
  251 static __always_inline
  252 void __read_once_size(const volatile void *p, void *res, int size)
  253 {
  254 	__READ_ONCE_SIZE;
  255 }
  256 
  257 #ifdef CONFIG_KASAN
  258 /*
  259  * This function is not 'inline' because __no_sanitize_address confilcts
  260  * with inlining. Attempt to inline it may cause a build failure.
  261  * 	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
  262  * '__maybe_unused' allows us to avoid defined-but-not-used warnings.
  263  */
  264 static __no_sanitize_address __maybe_unused
  265 void __read_once_size_nocheck(const volatile void *p, void *res, int size)
  266 {
  267 	__READ_ONCE_SIZE;
  268 }
  269 #else
  270 static __always_inline
  271 void __read_once_size_nocheck(const volatile void *p, void *res, int size)
  272 {
  273 	__READ_ONCE_SIZE;
  274 }
  275 #endif
  276 
  277 static __always_inline void __write_once_size(volatile void *p, void *res, int size)
  278 {
  279 	switch (size) {
  280 	case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
  281 	case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
  282 	case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
  283 	case 8: *(volatile __u64 *)p = *(__u64 *)res; break;
  284 	default:
  285 		barrier();
  286 		__builtin_memcpy((void *)p, (const void *)res, size);
  287 		barrier();
  288 	}
  289 }
  290 
  291 /*
  292  * Prevent the compiler from merging or refetching reads or writes. The
  293  * compiler is also forbidden from reordering successive instances of
  294  * READ_ONCE, WRITE_ONCE and ACCESS_ONCE (see below), but only when the
  295  * compiler is aware of some particular ordering.  One way to make the
  296  * compiler aware of ordering is to put the two invocations of READ_ONCE,
  297  * WRITE_ONCE or ACCESS_ONCE() in different C statements.
  298  *
  299  * In contrast to ACCESS_ONCE these two macros will also work on aggregate
  300  * data types like structs or unions. If the size of the accessed data
  301  * type exceeds the word size of the machine (e.g., 32 bits or 64 bits)
  302  * READ_ONCE() and WRITE_ONCE() will fall back to memcpy(). There's at
  303  * least two memcpy()s: one for the __builtin_memcpy() and then one for
  304  * the macro doing the copy of variable - '__u' allocated on the stack.
  305  *
  306  * Their two major use cases are: (1) Mediating communication between
  307  * process-level code and irq/NMI handlers, all running on the same CPU,
  308  * and (2) Ensuring that the compiler does not  fold, spindle, or otherwise
  309  * mutilate accesses that either do not require ordering or that interact
  310  * with an explicit memory barrier or atomic instruction that provides the
  311  * required ordering.
  312  */
  313 
  314 #define __READ_ONCE(x, check)						\
  315 ({									\
  316 	union { typeof(x) __val; char __c[1]; } __u;			\
  317 	if (check)							\
  318 		__read_once_size(&(x), __u.__c, sizeof(x));		\
  319 	else								\
  320 		__read_once_size_nocheck(&(x), __u.__c, sizeof(x));	\
  321 	__u.__val;							\
  322 })
  323 #define READ_ONCE(x) __READ_ONCE(x, 1)
  324 
  325 /*
  326  * Use READ_ONCE_NOCHECK() instead of READ_ONCE() if you need
  327  * to hide memory access from KASAN.
  328  */
  329 #define READ_ONCE_NOCHECK(x) __READ_ONCE(x, 0)
  330 
  331 #define WRITE_ONCE(x, val) \
  332 ({							\
  333 	union { typeof(x) __val; char __c[1]; } __u =	\
  334 		{ .__val = (__force typeof(x)) (val) }; \
  335 	__write_once_size(&(x), __u.__c, sizeof(x));	\
  336 	__u.__val;					\
  337 })
  338 
  339 #endif /* __KERNEL__ */
  340 
  341 #endif /* __ASSEMBLY__ */
  342 
  343 #ifdef __KERNEL__
  344 /*
  345  * Allow us to mark functions as 'deprecated' and have gcc emit a nice
  346  * warning for each use, in hopes of speeding the functions removal.
  347  * Usage is:
  348  * 		int __deprecated foo(void)
  349  */
  350 #ifndef __deprecated
  351 # define __deprecated		/* unimplemented */
  352 #endif
  353 
  354 #ifdef MODULE
  355 #define __deprecated_for_modules __deprecated
  356 #else
  357 #define __deprecated_for_modules
  358 #endif
  359 
  360 #ifndef __must_check
  361 #define __must_check
  362 #endif
  363 
  364 #ifndef CONFIG_ENABLE_MUST_CHECK
  365 #undef __must_check
  366 #define __must_check
  367 #endif
  368 #ifndef CONFIG_ENABLE_WARN_DEPRECATED
  369 #undef __deprecated
  370 #undef __deprecated_for_modules
  371 #define __deprecated
  372 #define __deprecated_for_modules
  373 #endif
  374 
  375 #ifndef __malloc
  376 #define __malloc
  377 #endif
  378 
  379 /*
  380  * Allow us to avoid 'defined but not used' warnings on functions and data,
  381  * as well as force them to be emitted to the assembly file.
  382  *
  383  * As of gcc 3.4, static functions that are not marked with attribute((used))
  384  * may be elided from the assembly file.  As of gcc 3.4, static data not so
  385  * marked will not be elided, but this may change in a future gcc version.
  386  *
  387  * NOTE: Because distributions shipped with a backported unit-at-a-time
  388  * compiler in gcc 3.3, we must define __used to be __attribute__((used))
  389  * for gcc >=3.3 instead of 3.4.
  390  *
  391  * In prior versions of gcc, such functions and data would be emitted, but
  392  * would be warned about except with attribute((unused)).
  393  *
  394  * Mark functions that are referenced only in inline assembly as __used so
  395  * the code is emitted even though it appears to be unreferenced.
  396  */
  397 #ifndef __used
  398 # define __used			/* unimplemented */
  399 #endif
  400 
  401 #ifndef __maybe_unused
  402 # define __maybe_unused		/* unimplemented */
  403 #endif
  404 
  405 #ifndef __always_unused
  406 # define __always_unused	/* unimplemented */
  407 #endif
  408 
  409 #ifndef noinline
  410 #define noinline
  411 #endif
  412 
  413 /*
  414  * Rather then using noinline to prevent stack consumption, use
  415  * noinline_for_stack instead.  For documentation reasons.
  416  */
  417 #define noinline_for_stack noinline
  418 
  419 #ifndef __always_inline
  420 #define __always_inline inline
  421 #endif
  422 
  423 #endif /* __KERNEL__ */
  424 
  425 /*
  426  * From the GCC manual:
  427  *
  428  * Many functions do not examine any values except their arguments,
  429  * and have no effects except the return value.  Basically this is
  430  * just slightly more strict class than the `pure' attribute above,
  431  * since function is not allowed to read global memory.
  432  *
  433  * Note that a function that has pointer arguments and examines the
  434  * data pointed to must _not_ be declared `const'.  Likewise, a
  435  * function that calls a non-`const' function usually must not be
  436  * `const'.  It does not make sense for a `const' function to return
  437  * `void'.
  438  */
  439 #ifndef __attribute_const__
  440 # define __attribute_const__	/* unimplemented */
  441 #endif
  442 
  443 #ifndef __latent_entropy
  444 # define __latent_entropy
  445 #endif
  446 
  447 /*
  448  * Tell gcc if a function is cold. The compiler will assume any path
  449  * directly leading to the call is unlikely.
  450  */
  451 
  452 #ifndef __cold
  453 #define __cold
  454 #endif
  455 
  456 /* Simple shorthand for a section definition */
  457 #ifndef __section
  458 # define __section(S) __attribute__ ((__section__(#S)))
  459 #endif
  460 
  461 #ifndef __visible
  462 #define __visible
  463 #endif
  464 
  465 /*
  466  * Assume alignment of return value.
  467  */
  468 #ifndef __assume_aligned
  469 #define __assume_aligned(a, ...)
  470 #endif
  471 
  472 
  473 /* Are two types/vars the same type (ignoring qualifiers)? */
  474 #ifndef __same_type
  475 # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
  476 #endif
  477 
  478 /* Is this type a native word size -- useful for atomic operations */
  479 #ifndef __native_word
  480 # define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
  481 #endif
  482 
  483 /* Compile time object size, -1 for unknown */
  484 #ifndef __compiletime_object_size
  485 # define __compiletime_object_size(obj) -1
  486 #endif
  487 #ifndef __compiletime_warning
  488 # define __compiletime_warning(message)
  489 #endif
  490 #ifndef __compiletime_error
  491 # define __compiletime_error(message)
  492 /*
  493  * Sparse complains of variable sized arrays due to the temporary variable in
  494  * __compiletime_assert. Unfortunately we can't just expand it out to make
  495  * sparse see a constant array size without breaking compiletime_assert on old
  496  * versions of GCC (e.g. 4.2.4), so hide the array from sparse altogether.
  497  */
  498 # ifndef __CHECKER__
  499 #  define __compiletime_error_fallback(condition) \
  500 	do {  } while (0)
  501 # endif
  502 #endif
  503 #ifndef __compiletime_error_fallback
  504 # define __compiletime_error_fallback(condition) do { } while (0)
  505 #endif
  506 
  507 #define __compiletime_assert(condition, msg, prefix, suffix)		\
  508 	do {								\
  509 		bool __cond = !(condition);				\
  510 		extern void prefix ## suffix(void) __compiletime_error(msg); \
  511 		if (__cond)						\
  512 			prefix ## suffix();				\
  513 		__compiletime_error_fallback(__cond);			\
  514 	} while (0)
  515 
  516 #define _compiletime_assert(condition, msg, prefix, suffix) \
  517 	__compiletime_assert(condition, msg, prefix, suffix)
  518 
  519 /**
  520  * compiletime_assert - break build and emit msg if condition is false
  521  * @condition: a compile-time constant condition to check
  522  * @msg:       a message to emit if condition is false
  523  *
  524  * In tradition of POSIX assert, this macro will break the build if the
  525  * supplied condition is *false*, emitting the supplied error message if the
  526  * compiler has support to do so.
  527  */
  528 #define compiletime_assert(condition, msg) \
  529 	_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
  530 
  531 #define compiletime_assert_atomic_type(t)				\
  532 	compiletime_assert(__native_word(t),				\
  533 		"Need native word sized stores/loads for atomicity.")
  534 
  535 /*
  536  * Prevent the compiler from merging or refetching accesses.  The compiler
  537  * is also forbidden from reordering successive instances of ACCESS_ONCE(),
  538  * but only when the compiler is aware of some particular ordering.  One way
  539  * to make the compiler aware of ordering is to put the two invocations of
  540  * ACCESS_ONCE() in different C statements.
  541  *
  542  * ACCESS_ONCE will only work on scalar types. For union types, ACCESS_ONCE
  543  * on a union member will work as long as the size of the member matches the
  544  * size of the union and the size is smaller than word size.
  545  *
  546  * The major use cases of ACCESS_ONCE used to be (1) Mediating communication
  547  * between process-level code and irq/NMI handlers, all running on the same CPU,
  548  * and (2) Ensuring that the compiler does not  fold, spindle, or otherwise
  549  * mutilate accesses that either do not require ordering or that interact
  550  * with an explicit memory barrier or atomic instruction that provides the
  551  * required ordering.
  552  *
  553  * If possible use READ_ONCE()/WRITE_ONCE() instead.
  554  */
  555 #define __ACCESS_ONCE(x) ({ \
  556 	 __maybe_unused typeof(x) __var = (__force typeof(x)) 0; \
  557 	(volatile typeof(x) *)&(x); })
  558 #define ACCESS_ONCE(x) (*__ACCESS_ONCE(x))
  559 
  560 /**
  561  * lockless_dereference() - safely load a pointer for later dereference
  562  * @p: The pointer to load
  563  *
  564  * Similar to rcu_dereference(), but for situations where the pointed-to
  565  * object's lifetime is managed by something other than RCU.  That
  566  * "something other" might be reference counting or simple immortality.
  567  *
  568  * The seemingly unused variable ___typecheck_p validates that @p is
  569  * indeed a pointer type by using a pointer to typeof(*p) as the type.
  570  * Taking a pointer to typeof(*p) again is needed in case p is void *.
  571  */
  572 #define lockless_dereference(p) \
  573 ({ \
  574 	typeof(p) _________p1 = READ_ONCE(p); \
  575 	typeof(*(p)) *___typecheck_p __maybe_unused; \
  576 	smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
  577 	(_________p1); \
  578 })
  579 
  580 #endif /* __LINUX_COMPILER_H */                 1 /*
    2  * kref.h - library routines for handling generic reference counted objects
    3  *
    4  * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
    5  * Copyright (C) 2004 IBM Corp.
    6  *
    7  * based on kobject.h which was:
    8  * Copyright (C) 2002-2003 Patrick Mochel <mochel@osdl.org>
    9  * Copyright (C) 2002-2003 Open Source Development Labs
   10  *
   11  * This file is released under the GPLv2.
   12  *
   13  */
   14 
   15 #ifndef _KREF_H_
   16 #define _KREF_H_
   17 
   18 #include <linux/spinlock.h>
   19 #include <linux/refcount.h>
   20 
   21 struct kref {
   22 	refcount_t refcount;
   23 };
   24 
   25 #define KREF_INIT(n)	{ .refcount = REFCOUNT_INIT(n), }
   26 
   27 /**
   28  * kref_init - initialize object.
   29  * @kref: object in question.
   30  */
   31 static inline void kref_init(struct kref *kref)
   32 {
   33 	refcount_set(&kref->refcount, 1);
   34 }
   35 
   36 static inline unsigned int kref_read(const struct kref *kref)
   37 {
   38 	return refcount_read(&kref->refcount);
   39 }
   40 
   41 /**
   42  * kref_get - increment refcount for object.
   43  * @kref: object.
   44  */
   45 static inline void kref_get(struct kref *kref)
   46 {
   47 	refcount_inc(&kref->refcount);
   48 }
   49 
   50 /**
   51  * kref_put - decrement refcount for object.
   52  * @kref: object.
   53  * @release: pointer to the function that will clean up the object when the
   54  *	     last reference to the object is released.
   55  *	     This pointer is required, and it is not acceptable to pass kfree
   56  *	     in as this function.  If the caller does pass kfree to this
   57  *	     function, you will be publicly mocked mercilessly by the kref
   58  *	     maintainer, and anyone else who happens to notice it.  You have
   59  *	     been warned.
   60  *
   61  * Decrement the refcount, and if 0, call release().
   62  * Return 1 if the object was removed, otherwise return 0.  Beware, if this
   63  * function returns 0, you still can not count on the kref from remaining in
   64  * memory.  Only use the return value if you want to see if the kref is now
   65  * gone, not present.
   66  */
   67 static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref))
   68 {
   69 	WARN_ON(release == NULL);
   70 
   71 	if (refcount_dec_and_test(&kref->refcount)) {
   72 		release(kref);
   73 		return 1;
   74 	}
   75 	return 0;
   76 }
   77 
   78 static inline int kref_put_mutex(struct kref *kref,
   79 				 void (*release)(struct kref *kref),
   80 				 struct mutex *lock)
   81 {
   82 	WARN_ON(release == NULL);
   83 
   84 	if (refcount_dec_and_mutex_lock(&kref->refcount, lock)) {
   85 		release(kref);
   86 		return 1;
   87 	}
   88 	return 0;
   89 }
   90 
   91 static inline int kref_put_lock(struct kref *kref,
   92 				void (*release)(struct kref *kref),
   93 				spinlock_t *lock)
   94 {
   95 	WARN_ON(release == NULL);
   96 
   97 	if (refcount_dec_and_lock(&kref->refcount, lock)) {
   98 		release(kref);
   99 		return 1;
  100 	}
  101 	return 0;
  102 }
  103 
  104 /**
  105  * kref_get_unless_zero - Increment refcount for object unless it is zero.
  106  * @kref: object.
  107  *
  108  * Return non-zero if the increment succeeded. Otherwise return 0.
  109  *
  110  * This function is intended to simplify locking around refcounting for
  111  * objects that can be looked up from a lookup structure, and which are
  112  * removed from that lookup structure in the object destructor.
  113  * Operations on such objects require at least a read lock around
  114  * lookup + kref_get, and a write lock around kref_put + remove from lookup
  115  * structure. Furthermore, RCU implementations become extremely tricky.
  116  * With a lookup followed by a kref_get_unless_zero *with return value check*
  117  * locking in the kref_put path can be deferred to the actual removal from
  118  * the lookup structure and RCU lookups become trivial.
  119  */
  120 static inline int __must_check kref_get_unless_zero(struct kref *kref)
  121 {
  122 	return refcount_inc_not_zero(&kref->refcount);
  123 }
  124 #endif /* _KREF_H_ */                 1 #ifndef _LINUX_LIST_H
    2 #define _LINUX_LIST_H
    3 
    4 #include <linux/types.h>
    5 #include <linux/stddef.h>
    6 #include <linux/poison.h>
    7 #include <linux/const.h>
    8 #include <linux/kernel.h>
    9 
   10 /*
   11  * Simple doubly linked list implementation.
   12  *
   13  * Some of the internal functions ("__xxx") are useful when
   14  * manipulating whole lists rather than single entries, as
   15  * sometimes we already know the next/prev entries and we can
   16  * generate better code by using them directly rather than
   17  * using the generic single-entry routines.
   18  */
   19 
   20 #define LIST_HEAD_INIT(name) { &(name), &(name) }
   21 
   22 #define LIST_HEAD(name) \
   23 	struct list_head name = LIST_HEAD_INIT(name)
   24 
   25 static inline void INIT_LIST_HEAD(struct list_head *list)
   26 {
   27 	WRITE_ONCE(list->next, list);
   28 	list->prev = list;
   29 }
   30 
   31 #ifdef CONFIG_DEBUG_LIST
   32 extern bool __list_add_valid(struct list_head *new,
   33 			      struct list_head *prev,
   34 			      struct list_head *next);
   35 extern bool __list_del_entry_valid(struct list_head *entry);
   36 #else
   37 static inline bool __list_add_valid(struct list_head *new,
   38 				struct list_head *prev,
   39 				struct list_head *next)
   40 {
   41 	return true;
   42 }
   43 static inline bool __list_del_entry_valid(struct list_head *entry)
   44 {
   45 	return true;
   46 }
   47 #endif
   48 
   49 /*
   50  * Insert a new entry between two known consecutive entries.
   51  *
   52  * This is only for internal list manipulation where we know
   53  * the prev/next entries already!
   54  */
   55 static inline void __list_add(struct list_head *new,
   56 			      struct list_head *prev,
   57 			      struct list_head *next)
   58 {
   59 	if (!__list_add_valid(new, prev, next))
   60 		return;
   61 
   62 	next->prev = new;
   63 	new->next = next;
   64 	new->prev = prev;
   65 	WRITE_ONCE(prev->next, new);
   66 }
   67 
   68 /**
   69  * list_add - add a new entry
   70  * @new: new entry to be added
   71  * @head: list head to add it after
   72  *
   73  * Insert a new entry after the specified head.
   74  * This is good for implementing stacks.
   75  */
   76 static inline void list_add(struct list_head *new, struct list_head *head)
   77 {
   78 	__list_add(new, head, head->next);
   79 }
   80 
   81 
   82 /**
   83  * list_add_tail - add a new entry
   84  * @new: new entry to be added
   85  * @head: list head to add it before
   86  *
   87  * Insert a new entry before the specified head.
   88  * This is useful for implementing queues.
   89  */
   90 static inline void list_add_tail(struct list_head *new, struct list_head *head)
   91 {
   92 	__list_add(new, head->prev, head);
   93 }
   94 
   95 /*
   96  * Delete a list entry by making the prev/next entries
   97  * point to each other.
   98  *
   99  * This is only for internal list manipulation where we know
  100  * the prev/next entries already!
  101  */
  102 static inline void __list_del(struct list_head * prev, struct list_head * next)
  103 {
  104 	next->prev = prev;
  105 	WRITE_ONCE(prev->next, next);
  106 }
  107 
  108 /**
  109  * list_del - deletes entry from list.
  110  * @entry: the element to delete from the list.
  111  * Note: list_empty() on entry does not return true after this, the entry is
  112  * in an undefined state.
  113  */
  114 static inline void __list_del_entry(struct list_head *entry)
  115 {
  116 	if (!__list_del_entry_valid(entry))
  117 		return;
  118 
  119 	__list_del(entry->prev, entry->next);
  120 }
  121 
  122 static inline void list_del(struct list_head *entry)
  123 {
  124 	__list_del_entry(entry);
  125 	entry->next = LIST_POISON1;
  126 	entry->prev = LIST_POISON2;
  127 }
  128 
  129 /**
  130  * list_replace - replace old entry by new one
  131  * @old : the element to be replaced
  132  * @new : the new element to insert
  133  *
  134  * If @old was empty, it will be overwritten.
  135  */
  136 static inline void list_replace(struct list_head *old,
  137 				struct list_head *new)
  138 {
  139 	new->next = old->next;
  140 	new->next->prev = new;
  141 	new->prev = old->prev;
  142 	new->prev->next = new;
  143 }
  144 
  145 static inline void list_replace_init(struct list_head *old,
  146 					struct list_head *new)
  147 {
  148 	list_replace(old, new);
  149 	INIT_LIST_HEAD(old);
  150 }
  151 
  152 /**
  153  * list_del_init - deletes entry from list and reinitialize it.
  154  * @entry: the element to delete from the list.
  155  */
  156 static inline void list_del_init(struct list_head *entry)
  157 {
  158 	__list_del_entry(entry);
  159 	INIT_LIST_HEAD(entry);
  160 }
  161 
  162 /**
  163  * list_move - delete from one list and add as another's head
  164  * @list: the entry to move
  165  * @head: the head that will precede our entry
  166  */
  167 static inline void list_move(struct list_head *list, struct list_head *head)
  168 {
  169 	__list_del_entry(list);
  170 	list_add(list, head);
  171 }
  172 
  173 /**
  174  * list_move_tail - delete from one list and add as another's tail
  175  * @list: the entry to move
  176  * @head: the head that will follow our entry
  177  */
  178 static inline void list_move_tail(struct list_head *list,
  179 				  struct list_head *head)
  180 {
  181 	__list_del_entry(list);
  182 	list_add_tail(list, head);
  183 }
  184 
  185 /**
  186  * list_is_last - tests whether @list is the last entry in list @head
  187  * @list: the entry to test
  188  * @head: the head of the list
  189  */
  190 static inline int list_is_last(const struct list_head *list,
  191 				const struct list_head *head)
  192 {
  193 	return list->next == head;
  194 }
  195 
  196 /**
  197  * list_empty - tests whether a list is empty
  198  * @head: the list to test.
  199  */
  200 static inline int list_empty(const struct list_head *head)
  201 {
  202 	return READ_ONCE(head->next) == head;
  203 }
  204 
  205 /**
  206  * list_empty_careful - tests whether a list is empty and not being modified
  207  * @head: the list to test
  208  *
  209  * Description:
  210  * tests whether a list is empty _and_ checks that no other CPU might be
  211  * in the process of modifying either member (next or prev)
  212  *
  213  * NOTE: using list_empty_careful() without synchronization
  214  * can only be safe if the only activity that can happen
  215  * to the list entry is list_del_init(). Eg. it cannot be used
  216  * if another CPU could re-list_add() it.
  217  */
  218 static inline int list_empty_careful(const struct list_head *head)
  219 {
  220 	struct list_head *next = head->next;
  221 	return (next == head) && (next == head->prev);
  222 }
  223 
  224 /**
  225  * list_rotate_left - rotate the list to the left
  226  * @head: the head of the list
  227  */
  228 static inline void list_rotate_left(struct list_head *head)
  229 {
  230 	struct list_head *first;
  231 
  232 	if (!list_empty(head)) {
  233 		first = head->next;
  234 		list_move_tail(first, head);
  235 	}
  236 }
  237 
  238 /**
  239  * list_is_singular - tests whether a list has just one entry.
  240  * @head: the list to test.
  241  */
  242 static inline int list_is_singular(const struct list_head *head)
  243 {
  244 	return !list_empty(head) && (head->next == head->prev);
  245 }
  246 
  247 static inline void __list_cut_position(struct list_head *list,
  248 		struct list_head *head, struct list_head *entry)
  249 {
  250 	struct list_head *new_first = entry->next;
  251 	list->next = head->next;
  252 	list->next->prev = list;
  253 	list->prev = entry;
  254 	entry->next = list;
  255 	head->next = new_first;
  256 	new_first->prev = head;
  257 }
  258 
  259 /**
  260  * list_cut_position - cut a list into two
  261  * @list: a new list to add all removed entries
  262  * @head: a list with entries
  263  * @entry: an entry within head, could be the head itself
  264  *	and if so we won't cut the list
  265  *
  266  * This helper moves the initial part of @head, up to and
  267  * including @entry, from @head to @list. You should
  268  * pass on @entry an element you know is on @head. @list
  269  * should be an empty list or a list you do not care about
  270  * losing its data.
  271  *
  272  */
  273 static inline void list_cut_position(struct list_head *list,
  274 		struct list_head *head, struct list_head *entry)
  275 {
  276 	if (list_empty(head))
  277 		return;
  278 	if (list_is_singular(head) &&
  279 		(head->next != entry && head != entry))
  280 		return;
  281 	if (entry == head)
  282 		INIT_LIST_HEAD(list);
  283 	else
  284 		__list_cut_position(list, head, entry);
  285 }
  286 
  287 static inline void __list_splice(const struct list_head *list,
  288 				 struct list_head *prev,
  289 				 struct list_head *next)
  290 {
  291 	struct list_head *first = list->next;
  292 	struct list_head *last = list->prev;
  293 
  294 	first->prev = prev;
  295 	prev->next = first;
  296 
  297 	last->next = next;
  298 	next->prev = last;
  299 }
  300 
  301 /**
  302  * list_splice - join two lists, this is designed for stacks
  303  * @list: the new list to add.
  304  * @head: the place to add it in the first list.
  305  */
  306 static inline void list_splice(const struct list_head *list,
  307 				struct list_head *head)
  308 {
  309 	if (!list_empty(list))
  310 		__list_splice(list, head, head->next);
  311 }
  312 
  313 /**
  314  * list_splice_tail - join two lists, each list being a queue
  315  * @list: the new list to add.
  316  * @head: the place to add it in the first list.
  317  */
  318 static inline void list_splice_tail(struct list_head *list,
  319 				struct list_head *head)
  320 {
  321 	if (!list_empty(list))
  322 		__list_splice(list, head->prev, head);
  323 }
  324 
  325 /**
  326  * list_splice_init - join two lists and reinitialise the emptied list.
  327  * @list: the new list to add.
  328  * @head: the place to add it in the first list.
  329  *
  330  * The list at @list is reinitialised
  331  */
  332 static inline void list_splice_init(struct list_head *list,
  333 				    struct list_head *head)
  334 {
  335 	if (!list_empty(list)) {
  336 		__list_splice(list, head, head->next);
  337 		INIT_LIST_HEAD(list);
  338 	}
  339 }
  340 
  341 /**
  342  * list_splice_tail_init - join two lists and reinitialise the emptied list
  343  * @list: the new list to add.
  344  * @head: the place to add it in the first list.
  345  *
  346  * Each of the lists is a queue.
  347  * The list at @list is reinitialised
  348  */
  349 static inline void list_splice_tail_init(struct list_head *list,
  350 					 struct list_head *head)
  351 {
  352 	if (!list_empty(list)) {
  353 		__list_splice(list, head->prev, head);
  354 		INIT_LIST_HEAD(list);
  355 	}
  356 }
  357 
  358 /**
  359  * list_entry - get the struct for this entry
  360  * @ptr:	the &struct list_head pointer.
  361  * @type:	the type of the struct this is embedded in.
  362  * @member:	the name of the list_head within the struct.
  363  */
  364 #define list_entry(ptr, type, member) \
  365 	container_of(ptr, type, member)
  366 
  367 /**
  368  * list_first_entry - get the first element from a list
  369  * @ptr:	the list head to take the element from.
  370  * @type:	the type of the struct this is embedded in.
  371  * @member:	the name of the list_head within the struct.
  372  *
  373  * Note, that list is expected to be not empty.
  374  */
  375 #define list_first_entry(ptr, type, member) \
  376 	list_entry((ptr)->next, type, member)
  377 
  378 /**
  379  * list_last_entry - get the last element from a list
  380  * @ptr:	the list head to take the element from.
  381  * @type:	the type of the struct this is embedded in.
  382  * @member:	the name of the list_head within the struct.
  383  *
  384  * Note, that list is expected to be not empty.
  385  */
  386 #define list_last_entry(ptr, type, member) \
  387 	list_entry((ptr)->prev, type, member)
  388 
  389 /**
  390  * list_first_entry_or_null - get the first element from a list
  391  * @ptr:	the list head to take the element from.
  392  * @type:	the type of the struct this is embedded in.
  393  * @member:	the name of the list_head within the struct.
  394  *
  395  * Note that if the list is empty, it returns NULL.
  396  */
  397 #define list_first_entry_or_null(ptr, type, member) ({ \
  398 	struct list_head *head__ = (ptr); \
  399 	struct list_head *pos__ = READ_ONCE(head__->next); \
  400 	pos__ != head__ ? list_entry(pos__, type, member) : NULL; \
  401 })
  402 
  403 /**
  404  * list_next_entry - get the next element in list
  405  * @pos:	the type * to cursor
  406  * @member:	the name of the list_head within the struct.
  407  */
  408 #define list_next_entry(pos, member) \
  409 	list_entry((pos)->member.next, typeof(*(pos)), member)
  410 
  411 /**
  412  * list_prev_entry - get the prev element in list
  413  * @pos:	the type * to cursor
  414  * @member:	the name of the list_head within the struct.
  415  */
  416 #define list_prev_entry(pos, member) \
  417 	list_entry((pos)->member.prev, typeof(*(pos)), member)
  418 
  419 /**
  420  * list_for_each	-	iterate over a list
  421  * @pos:	the &struct list_head to use as a loop cursor.
  422  * @head:	the head for your list.
  423  */
  424 #define list_for_each(pos, head) \
  425 	for (pos = (head)->next; pos != (head); pos = pos->next)
  426 
  427 /**
  428  * list_for_each_prev	-	iterate over a list backwards
  429  * @pos:	the &struct list_head to use as a loop cursor.
  430  * @head:	the head for your list.
  431  */
  432 #define list_for_each_prev(pos, head) \
  433 	for (pos = (head)->prev; pos != (head); pos = pos->prev)
  434 
  435 /**
  436  * list_for_each_safe - iterate over a list safe against removal of list entry
  437  * @pos:	the &struct list_head to use as a loop cursor.
  438  * @n:		another &struct list_head to use as temporary storage
  439  * @head:	the head for your list.
  440  */
  441 #define list_for_each_safe(pos, n, head) \
  442 	for (pos = (head)->next, n = pos->next; pos != (head); \
  443 		pos = n, n = pos->next)
  444 
  445 /**
  446  * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry
  447  * @pos:	the &struct list_head to use as a loop cursor.
  448  * @n:		another &struct list_head to use as temporary storage
  449  * @head:	the head for your list.
  450  */
  451 #define list_for_each_prev_safe(pos, n, head) \
  452 	for (pos = (head)->prev, n = pos->prev; \
  453 	     pos != (head); \
  454 	     pos = n, n = pos->prev)
  455 
  456 /**
  457  * list_for_each_entry	-	iterate over list of given type
  458  * @pos:	the type * to use as a loop cursor.
  459  * @head:	the head for your list.
  460  * @member:	the name of the list_head within the struct.
  461  */
  462 #define list_for_each_entry(pos, head, member)				\
  463 	for (pos = list_first_entry(head, typeof(*pos), member);	\
  464 	     &pos->member != (head);					\
  465 	     pos = list_next_entry(pos, member))
  466 
  467 /**
  468  * list_for_each_entry_reverse - iterate backwards over list of given type.
  469  * @pos:	the type * to use as a loop cursor.
  470  * @head:	the head for your list.
  471  * @member:	the name of the list_head within the struct.
  472  */
  473 #define list_for_each_entry_reverse(pos, head, member)			\
  474 	for (pos = list_last_entry(head, typeof(*pos), member);		\
  475 	     &pos->member != (head); 					\
  476 	     pos = list_prev_entry(pos, member))
  477 
  478 /**
  479  * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
  480  * @pos:	the type * to use as a start point
  481  * @head:	the head of the list
  482  * @member:	the name of the list_head within the struct.
  483  *
  484  * Prepares a pos entry for use as a start point in list_for_each_entry_continue().
  485  */
  486 #define list_prepare_entry(pos, head, member) \
  487 	((pos) ? : list_entry(head, typeof(*pos), member))
  488 
  489 /**
  490  * list_for_each_entry_continue - continue iteration over list of given type
  491  * @pos:	the type * to use as a loop cursor.
  492  * @head:	the head for your list.
  493  * @member:	the name of the list_head within the struct.
  494  *
  495  * Continue to iterate over list of given type, continuing after
  496  * the current position.
  497  */
  498 #define list_for_each_entry_continue(pos, head, member) 		\
  499 	for (pos = list_next_entry(pos, member);			\
  500 	     &pos->member != (head);					\
  501 	     pos = list_next_entry(pos, member))
  502 
  503 /**
  504  * list_for_each_entry_continue_reverse - iterate backwards from the given point
  505  * @pos:	the type * to use as a loop cursor.
  506  * @head:	the head for your list.
  507  * @member:	the name of the list_head within the struct.
  508  *
  509  * Start to iterate over list of given type backwards, continuing after
  510  * the current position.
  511  */
  512 #define list_for_each_entry_continue_reverse(pos, head, member)		\
  513 	for (pos = list_prev_entry(pos, member);			\
  514 	     &pos->member != (head);					\
  515 	     pos = list_prev_entry(pos, member))
  516 
  517 /**
  518  * list_for_each_entry_from - iterate over list of given type from the current point
  519  * @pos:	the type * to use as a loop cursor.
  520  * @head:	the head for your list.
  521  * @member:	the name of the list_head within the struct.
  522  *
  523  * Iterate over list of given type, continuing from current position.
  524  */
  525 #define list_for_each_entry_from(pos, head, member) 			\
  526 	for (; &pos->member != (head);					\
  527 	     pos = list_next_entry(pos, member))
  528 
  529 /**
  530  * list_for_each_entry_from_reverse - iterate backwards over list of given type
  531  *                                    from the current point
  532  * @pos:	the type * to use as a loop cursor.
  533  * @head:	the head for your list.
  534  * @member:	the name of the list_head within the struct.
  535  *
  536  * Iterate backwards over list of given type, continuing from current position.
  537  */
  538 #define list_for_each_entry_from_reverse(pos, head, member)		\
  539 	for (; &pos->member != (head);					\
  540 	     pos = list_prev_entry(pos, member))
  541 
  542 /**
  543  * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
  544  * @pos:	the type * to use as a loop cursor.
  545  * @n:		another type * to use as temporary storage
  546  * @head:	the head for your list.
  547  * @member:	the name of the list_head within the struct.
  548  */
  549 #define list_for_each_entry_safe(pos, n, head, member)			\
  550 	for (pos = list_first_entry(head, typeof(*pos), member),	\
  551 		n = list_next_entry(pos, member);			\
  552 	     &pos->member != (head); 					\
  553 	     pos = n, n = list_next_entry(n, member))
  554 
  555 /**
  556  * list_for_each_entry_safe_continue - continue list iteration safe against removal
  557  * @pos:	the type * to use as a loop cursor.
  558  * @n:		another type * to use as temporary storage
  559  * @head:	the head for your list.
  560  * @member:	the name of the list_head within the struct.
  561  *
  562  * Iterate over list of given type, continuing after current point,
  563  * safe against removal of list entry.
  564  */
  565 #define list_for_each_entry_safe_continue(pos, n, head, member) 		\
  566 	for (pos = list_next_entry(pos, member), 				\
  567 		n = list_next_entry(pos, member);				\
  568 	     &pos->member != (head);						\
  569 	     pos = n, n = list_next_entry(n, member))
  570 
  571 /**
  572  * list_for_each_entry_safe_from - iterate over list from current point safe against removal
  573  * @pos:	the type * to use as a loop cursor.
  574  * @n:		another type * to use as temporary storage
  575  * @head:	the head for your list.
  576  * @member:	the name of the list_head within the struct.
  577  *
  578  * Iterate over list of given type from current point, safe against
  579  * removal of list entry.
  580  */
  581 #define list_for_each_entry_safe_from(pos, n, head, member) 			\
  582 	for (n = list_next_entry(pos, member);					\
  583 	     &pos->member != (head);						\
  584 	     pos = n, n = list_next_entry(n, member))
  585 
  586 /**
  587  * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal
  588  * @pos:	the type * to use as a loop cursor.
  589  * @n:		another type * to use as temporary storage
  590  * @head:	the head for your list.
  591  * @member:	the name of the list_head within the struct.
  592  *
  593  * Iterate backwards over list of given type, safe against removal
  594  * of list entry.
  595  */
  596 #define list_for_each_entry_safe_reverse(pos, n, head, member)		\
  597 	for (pos = list_last_entry(head, typeof(*pos), member),		\
  598 		n = list_prev_entry(pos, member);			\
  599 	     &pos->member != (head); 					\
  600 	     pos = n, n = list_prev_entry(n, member))
  601 
  602 /**
  603  * list_safe_reset_next - reset a stale list_for_each_entry_safe loop
  604  * @pos:	the loop cursor used in the list_for_each_entry_safe loop
  605  * @n:		temporary storage used in list_for_each_entry_safe
  606  * @member:	the name of the list_head within the struct.
  607  *
  608  * list_safe_reset_next is not safe to use in general if the list may be
  609  * modified concurrently (eg. the lock is dropped in the loop body). An
  610  * exception to this is if the cursor element (pos) is pinned in the list,
  611  * and list_safe_reset_next is called after re-taking the lock and before
  612  * completing the current iteration of the loop body.
  613  */
  614 #define list_safe_reset_next(pos, n, member)				\
  615 	n = list_next_entry(pos, member)
  616 
  617 /*
  618  * Double linked lists with a single pointer list head.
  619  * Mostly useful for hash tables where the two pointer list head is
  620  * too wasteful.
  621  * You lose the ability to access the tail in O(1).
  622  */
  623 
  624 #define HLIST_HEAD_INIT { .first = NULL }
  625 #define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
  626 #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
  627 static inline void INIT_HLIST_NODE(struct hlist_node *h)
  628 {
  629 	h->next = NULL;
  630 	h->pprev = NULL;
  631 }
  632 
  633 static inline int hlist_unhashed(const struct hlist_node *h)
  634 {
  635 	return !h->pprev;
  636 }
  637 
  638 static inline int hlist_empty(const struct hlist_head *h)
  639 {
  640 	return !READ_ONCE(h->first);
  641 }
  642 
  643 static inline void __hlist_del(struct hlist_node *n)
  644 {
  645 	struct hlist_node *next = n->next;
  646 	struct hlist_node **pprev = n->pprev;
  647 
  648 	WRITE_ONCE(*pprev, next);
  649 	if (next)
  650 		next->pprev = pprev;
  651 }
  652 
  653 static inline void hlist_del(struct hlist_node *n)
  654 {
  655 	__hlist_del(n);
  656 	n->next = LIST_POISON1;
  657 	n->pprev = LIST_POISON2;
  658 }
  659 
  660 static inline void hlist_del_init(struct hlist_node *n)
  661 {
  662 	if (!hlist_unhashed(n)) {
  663 		__hlist_del(n);
  664 		INIT_HLIST_NODE(n);
  665 	}
  666 }
  667 
  668 static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
  669 {
  670 	struct hlist_node *first = h->first;
  671 	n->next = first;
  672 	if (first)
  673 		first->pprev = &n->next;
  674 	WRITE_ONCE(h->first, n);
  675 	n->pprev = &h->first;
  676 }
  677 
  678 /* next must be != NULL */
  679 static inline void hlist_add_before(struct hlist_node *n,
  680 					struct hlist_node *next)
  681 {
  682 	n->pprev = next->pprev;
  683 	n->next = next;
  684 	next->pprev = &n->next;
  685 	WRITE_ONCE(*(n->pprev), n);
  686 }
  687 
  688 static inline void hlist_add_behind(struct hlist_node *n,
  689 				    struct hlist_node *prev)
  690 {
  691 	n->next = prev->next;
  692 	WRITE_ONCE(prev->next, n);
  693 	n->pprev = &prev->next;
  694 
  695 	if (n->next)
  696 		n->next->pprev  = &n->next;
  697 }
  698 
  699 /* after that we'll appear to be on some hlist and hlist_del will work */
  700 static inline void hlist_add_fake(struct hlist_node *n)
  701 {
  702 	n->pprev = &n->next;
  703 }
  704 
  705 static inline bool hlist_fake(struct hlist_node *h)
  706 {
  707 	return h->pprev == &h->next;
  708 }
  709 
  710 /*
  711  * Check whether the node is the only node of the head without
  712  * accessing head:
  713  */
  714 static inline bool
  715 hlist_is_singular_node(struct hlist_node *n, struct hlist_head *h)
  716 {
  717 	return !n->next && n->pprev == &h->first;
  718 }
  719 
  720 /*
  721  * Move a list from one list head to another. Fixup the pprev
  722  * reference of the first entry if it exists.
  723  */
  724 static inline void hlist_move_list(struct hlist_head *old,
  725 				   struct hlist_head *new)
  726 {
  727 	new->first = old->first;
  728 	if (new->first)
  729 		new->first->pprev = &new->first;
  730 	old->first = NULL;
  731 }
  732 
  733 #define hlist_entry(ptr, type, member) container_of(ptr,type,member)
  734 
  735 #define hlist_for_each(pos, head) \
  736 	for (pos = (head)->first; pos ; pos = pos->next)
  737 
  738 #define hlist_for_each_safe(pos, n, head) \
  739 	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
  740 	     pos = n)
  741 
  742 #define hlist_entry_safe(ptr, type, member) \
  743 	({ typeof(ptr) ____ptr = (ptr); \
  744 	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
  745 	})
  746 
  747 /**
  748  * hlist_for_each_entry	- iterate over list of given type
  749  * @pos:	the type * to use as a loop cursor.
  750  * @head:	the head for your list.
  751  * @member:	the name of the hlist_node within the struct.
  752  */
  753 #define hlist_for_each_entry(pos, head, member)				\
  754 	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
  755 	     pos;							\
  756 	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
  757 
  758 /**
  759  * hlist_for_each_entry_continue - iterate over a hlist continuing after current point
  760  * @pos:	the type * to use as a loop cursor.
  761  * @member:	the name of the hlist_node within the struct.
  762  */
  763 #define hlist_for_each_entry_continue(pos, member)			\
  764 	for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\
  765 	     pos;							\
  766 	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
  767 
  768 /**
  769  * hlist_for_each_entry_from - iterate over a hlist continuing from current point
  770  * @pos:	the type * to use as a loop cursor.
  771  * @member:	the name of the hlist_node within the struct.
  772  */
  773 #define hlist_for_each_entry_from(pos, member)				\
  774 	for (; pos;							\
  775 	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
  776 
  777 /**
  778  * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
  779  * @pos:	the type * to use as a loop cursor.
  780  * @n:		another &struct hlist_node to use as temporary storage
  781  * @head:	the head for your list.
  782  * @member:	the name of the hlist_node within the struct.
  783  */
  784 #define hlist_for_each_entry_safe(pos, n, head, member) 		\
  785 	for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\
  786 	     pos && ({ n = pos->member.next; 1; });			\
  787 	     pos = hlist_entry_safe(n, typeof(*pos), member))
  788 
  789 #endif                 1 #ifndef _LINUX_MM_H
    2 #define _LINUX_MM_H
    3 
    4 #include <linux/errno.h>
    5 
    6 #ifdef __KERNEL__
    7 
    8 #include <linux/mmdebug.h>
    9 #include <linux/gfp.h>
   10 #include <linux/bug.h>
   11 #include <linux/list.h>
   12 #include <linux/mmzone.h>
   13 #include <linux/rbtree.h>
   14 #include <linux/atomic.h>
   15 #include <linux/debug_locks.h>
   16 #include <linux/mm_types.h>
   17 #include <linux/range.h>
   18 #include <linux/pfn.h>
   19 #include <linux/percpu-refcount.h>
   20 #include <linux/bit_spinlock.h>
   21 #include <linux/shrinker.h>
   22 #include <linux/resource.h>
   23 #include <linux/page_ext.h>
   24 #include <linux/err.h>
   25 #include <linux/page_ref.h>
   26 
   27 struct mempolicy;
   28 struct anon_vma;
   29 struct anon_vma_chain;
   30 struct file_ra_state;
   31 struct user_struct;
   32 struct writeback_control;
   33 struct bdi_writeback;
   34 
   35 #ifndef CONFIG_NEED_MULTIPLE_NODES	/* Don't use mapnrs, do it properly */
   36 extern unsigned long max_mapnr;
   37 
   38 static inline void set_max_mapnr(unsigned long limit)
   39 {
   40 	max_mapnr = limit;
   41 }
   42 #else
   43 static inline void set_max_mapnr(unsigned long limit) { }
   44 #endif
   45 
   46 extern unsigned long totalram_pages;
   47 extern void * high_memory;
   48 extern int page_cluster;
   49 
   50 #ifdef CONFIG_SYSCTL
   51 extern int sysctl_legacy_va_layout;
   52 #else
   53 #define sysctl_legacy_va_layout 0
   54 #endif
   55 
   56 #ifdef CONFIG_HAVE_ARCH_MMAP_RND_BITS
   57 extern const int mmap_rnd_bits_min;
   58 extern const int mmap_rnd_bits_max;
   59 extern int mmap_rnd_bits __read_mostly;
   60 #endif
   61 #ifdef CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS
   62 extern const int mmap_rnd_compat_bits_min;
   63 extern const int mmap_rnd_compat_bits_max;
   64 extern int mmap_rnd_compat_bits __read_mostly;
   65 #endif
   66 
   67 #include <asm/page.h>
   68 #include <asm/pgtable.h>
   69 #include <asm/processor.h>
   70 
   71 #ifndef __pa_symbol
   72 #define __pa_symbol(x)  __pa(RELOC_HIDE((unsigned long)(x), 0))
   73 #endif
   74 
   75 #ifndef page_to_virt
   76 #define page_to_virt(x)	__va(PFN_PHYS(page_to_pfn(x)))
   77 #endif
   78 
   79 #ifndef lm_alias
   80 #define lm_alias(x)	__va(__pa_symbol(x))
   81 #endif
   82 
   83 /*
   84  * To prevent common memory management code establishing
   85  * a zero page mapping on a read fault.
   86  * This macro should be defined within <asm/pgtable.h>.
   87  * s390 does this to prevent multiplexing of hardware bits
   88  * related to the physical page in case of virtualization.
   89  */
   90 #ifndef mm_forbids_zeropage
   91 #define mm_forbids_zeropage(X)	(0)
   92 #endif
   93 
   94 /*
   95  * Default maximum number of active map areas, this limits the number of vmas
   96  * per mm struct. Users can overwrite this number by sysctl but there is a
   97  * problem.
   98  *
   99  * When a program's coredump is generated as ELF format, a section is created
  100  * per a vma. In ELF, the number of sections is represented in unsigned short.
  101  * This means the number of sections should be smaller than 65535 at coredump.
  102  * Because the kernel adds some informative sections to a image of program at
  103  * generating coredump, we need some margin. The number of extra sections is
  104  * 1-3 now and depends on arch. We use "5" as safe margin, here.
  105  *
  106  * ELF extended numbering allows more than 65535 sections, so 16-bit bound is
  107  * not a hard limit any more. Although some userspace tools can be surprised by
  108  * that.
  109  */
  110 #define MAPCOUNT_ELF_CORE_MARGIN	(5)
  111 #define DEFAULT_MAX_MAP_COUNT	(USHRT_MAX - MAPCOUNT_ELF_CORE_MARGIN)
  112 
  113 extern int sysctl_max_map_count;
  114 
  115 extern unsigned long sysctl_user_reserve_kbytes;
  116 extern unsigned long sysctl_admin_reserve_kbytes;
  117 
  118 extern int sysctl_overcommit_memory;
  119 extern int sysctl_overcommit_ratio;
  120 extern unsigned long sysctl_overcommit_kbytes;
  121 
  122 extern int overcommit_ratio_handler(struct ctl_table *, int, void __user *,
  123 				    size_t *, loff_t *);
  124 extern int overcommit_kbytes_handler(struct ctl_table *, int, void __user *,
  125 				    size_t *, loff_t *);
  126 
  127 #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
  128 
  129 /* to align the pointer to the (next) page boundary */
  130 #define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)
  131 
  132 /* test whether an address (unsigned long or pointer) is aligned to PAGE_SIZE */
  133 #define PAGE_ALIGNED(addr)	IS_ALIGNED((unsigned long)(addr), PAGE_SIZE)
  134 
  135 /*
  136  * Linux kernel virtual memory manager primitives.
  137  * The idea being to have a "virtual" mm in the same way
  138  * we have a virtual fs - giving a cleaner interface to the
  139  * mm details, and allowing different kinds of memory mappings
  140  * (from shared memory to executable loading to arbitrary
  141  * mmap() functions).
  142  */
  143 
  144 extern struct kmem_cache *vm_area_cachep;
  145 
  146 #ifndef CONFIG_MMU
  147 extern struct rb_root nommu_region_tree;
  148 extern struct rw_semaphore nommu_region_sem;
  149 
  150 extern unsigned int kobjsize(const void *objp);
  151 #endif
  152 
  153 /*
  154  * vm_flags in vm_area_struct, see mm_types.h.
  155  * When changing, update also include/trace/events/mmflags.h
  156  */
  157 #define VM_NONE		0x00000000
  158 
  159 #define VM_READ		0x00000001	/* currently active flags */
  160 #define VM_WRITE	0x00000002
  161 #define VM_EXEC		0x00000004
  162 #define VM_SHARED	0x00000008
  163 
  164 /* mprotect() hardcodes VM_MAYREAD >> 4 == VM_READ, and so for r/w/x bits. */
  165 #define VM_MAYREAD	0x00000010	/* limits for mprotect() etc */
  166 #define VM_MAYWRITE	0x00000020
  167 #define VM_MAYEXEC	0x00000040
  168 #define VM_MAYSHARE	0x00000080
  169 
  170 #define VM_GROWSDOWN	0x00000100	/* general info on the segment */
  171 #define VM_UFFD_MISSING	0x00000200	/* missing pages tracking */
  172 #define VM_PFNMAP	0x00000400	/* Page-ranges managed without "struct page", just pure PFN */
  173 #define VM_DENYWRITE	0x00000800	/* ETXTBSY on write attempts.. */
  174 #define VM_UFFD_WP	0x00001000	/* wrprotect pages tracking */
  175 
  176 #define VM_LOCKED	0x00002000
  177 #define VM_IO           0x00004000	/* Memory mapped I/O or similar */
  178 
  179 					/* Used by sys_madvise() */
  180 #define VM_SEQ_READ	0x00008000	/* App will access data sequentially */
  181 #define VM_RAND_READ	0x00010000	/* App will not benefit from clustered reads */
  182 
  183 #define VM_DONTCOPY	0x00020000      /* Do not copy this vma on fork */
  184 #define VM_DONTEXPAND	0x00040000	/* Cannot expand with mremap() */
  185 #define VM_LOCKONFAULT	0x00080000	/* Lock the pages covered when they are faulted in */
  186 #define VM_ACCOUNT	0x00100000	/* Is a VM accounted object */
  187 #define VM_NORESERVE	0x00200000	/* should the VM suppress accounting */
  188 #define VM_HUGETLB	0x00400000	/* Huge TLB Page VM */
  189 #define VM_ARCH_1	0x01000000	/* Architecture-specific flag */
  190 #define VM_ARCH_2	0x02000000
  191 #define VM_DONTDUMP	0x04000000	/* Do not include in the core dump */
  192 
  193 #ifdef CONFIG_MEM_SOFT_DIRTY
  194 # define VM_SOFTDIRTY	0x08000000	/* Not soft dirty clean area */
  195 #else
  196 # define VM_SOFTDIRTY	0
  197 #endif
  198 
  199 #define VM_MIXEDMAP	0x10000000	/* Can contain "struct page" and pure PFN pages */
  200 #define VM_HUGEPAGE	0x20000000	/* MADV_HUGEPAGE marked this vma */
  201 #define VM_NOHUGEPAGE	0x40000000	/* MADV_NOHUGEPAGE marked this vma */
  202 #define VM_MERGEABLE	0x80000000	/* KSM may merge identical pages */
  203 
  204 #ifdef CONFIG_ARCH_USES_HIGH_VMA_FLAGS
  205 #define VM_HIGH_ARCH_BIT_0	32	/* bit only usable on 64-bit architectures */
  206 #define VM_HIGH_ARCH_BIT_1	33	/* bit only usable on 64-bit architectures */
  207 #define VM_HIGH_ARCH_BIT_2	34	/* bit only usable on 64-bit architectures */
  208 #define VM_HIGH_ARCH_BIT_3	35	/* bit only usable on 64-bit architectures */
  209 #define VM_HIGH_ARCH_0	BIT(VM_HIGH_ARCH_BIT_0)
  210 #define VM_HIGH_ARCH_1	BIT(VM_HIGH_ARCH_BIT_1)
  211 #define VM_HIGH_ARCH_2	BIT(VM_HIGH_ARCH_BIT_2)
  212 #define VM_HIGH_ARCH_3	BIT(VM_HIGH_ARCH_BIT_3)
  213 #endif /* CONFIG_ARCH_USES_HIGH_VMA_FLAGS */
  214 
  215 #if defined(CONFIG_X86)
  216 # define VM_PAT		VM_ARCH_1	/* PAT reserves whole VMA at once (x86) */
  217 #if defined (CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS)
  218 # define VM_PKEY_SHIFT	VM_HIGH_ARCH_BIT_0
  219 # define VM_PKEY_BIT0	VM_HIGH_ARCH_0	/* A protection key is a 4-bit value */
  220 # define VM_PKEY_BIT1	VM_HIGH_ARCH_1
  221 # define VM_PKEY_BIT2	VM_HIGH_ARCH_2
  222 # define VM_PKEY_BIT3	VM_HIGH_ARCH_3
  223 #endif
  224 #elif defined(CONFIG_PPC)
  225 # define VM_SAO		VM_ARCH_1	/* Strong Access Ordering (powerpc) */
  226 #elif defined(CONFIG_PARISC)
  227 # define VM_GROWSUP	VM_ARCH_1
  228 #elif defined(CONFIG_METAG)
  229 # define VM_GROWSUP	VM_ARCH_1
  230 #elif defined(CONFIG_IA64)
  231 # define VM_GROWSUP	VM_ARCH_1
  232 #elif !defined(CONFIG_MMU)
  233 # define VM_MAPPED_COPY	VM_ARCH_1	/* T if mapped copy of data (nommu mmap) */
  234 #endif
  235 
  236 #if defined(CONFIG_X86)
  237 /* MPX specific bounds table or bounds directory */
  238 # define VM_MPX		VM_ARCH_2
  239 #endif
  240 
  241 #ifndef VM_GROWSUP
  242 # define VM_GROWSUP	VM_NONE
  243 #endif
  244 
  245 /* Bits set in the VMA until the stack is in its final location */
  246 #define VM_STACK_INCOMPLETE_SETUP	(VM_RAND_READ | VM_SEQ_READ)
  247 
  248 #ifndef VM_STACK_DEFAULT_FLAGS		/* arch can override this */
  249 #define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
  250 #endif
  251 
  252 #ifdef CONFIG_STACK_GROWSUP
  253 #define VM_STACK	VM_GROWSUP
  254 #else
  255 #define VM_STACK	VM_GROWSDOWN
  256 #endif
  257 
  258 #define VM_STACK_FLAGS	(VM_STACK | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
  259 
  260 /*
  261  * Special vmas that are non-mergable, non-mlock()able.
  262  * Note: mm/huge_memory.c VM_NO_THP depends on this definition.
  263  */
  264 #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_MIXEDMAP)
  265 
  266 /* This mask defines which mm->def_flags a process can inherit its parent */
  267 #define VM_INIT_DEF_MASK	VM_NOHUGEPAGE
  268 
  269 /* This mask is used to clear all the VMA flags used by mlock */
  270 #define VM_LOCKED_CLEAR_MASK	(~(VM_LOCKED | VM_LOCKONFAULT))
  271 
  272 /*
  273  * mapping from the currently active vm_flags protection bits (the
  274  * low four bits) to a page protection mask..
  275  */
  276 extern pgprot_t protection_map[16];
  277 
  278 #define FAULT_FLAG_WRITE	0x01	/* Fault was a write access */
  279 #define FAULT_FLAG_MKWRITE	0x02	/* Fault was mkwrite of existing pte */
  280 #define FAULT_FLAG_ALLOW_RETRY	0x04	/* Retry fault if blocking */
  281 #define FAULT_FLAG_RETRY_NOWAIT	0x08	/* Don't drop mmap_sem and wait when retrying */
  282 #define FAULT_FLAG_KILLABLE	0x10	/* The fault task is in SIGKILL killable region */
  283 #define FAULT_FLAG_TRIED	0x20	/* Second try */
  284 #define FAULT_FLAG_USER		0x40	/* The fault originated in userspace */
  285 #define FAULT_FLAG_REMOTE	0x80	/* faulting for non current tsk/mm */
  286 #define FAULT_FLAG_INSTRUCTION  0x100	/* The fault was during an instruction fetch */
  287 
  288 #define FAULT_FLAG_TRACE \
  289 	{ FAULT_FLAG_WRITE,		"WRITE" }, \
  290 	{ FAULT_FLAG_MKWRITE,		"MKWRITE" }, \
  291 	{ FAULT_FLAG_ALLOW_RETRY,	"ALLOW_RETRY" }, \
  292 	{ FAULT_FLAG_RETRY_NOWAIT,	"RETRY_NOWAIT" }, \
  293 	{ FAULT_FLAG_KILLABLE,		"KILLABLE" }, \
  294 	{ FAULT_FLAG_TRIED,		"TRIED" }, \
  295 	{ FAULT_FLAG_USER,		"USER" }, \
  296 	{ FAULT_FLAG_REMOTE,		"REMOTE" }, \
  297 	{ FAULT_FLAG_INSTRUCTION,	"INSTRUCTION" }
  298 
  299 /*
  300  * vm_fault is filled by the the pagefault handler and passed to the vma's
  301  * ->fault function. The vma's ->fault is responsible for returning a bitmask
  302  * of VM_FAULT_xxx flags that give details about how the fault was handled.
  303  *
  304  * MM layer fills up gfp_mask for page allocations but fault handler might
  305  * alter it if its implementation requires a different allocation context.
  306  *
  307  * pgoff should be used in favour of virtual_address, if possible.
  308  */
  309 struct vm_fault {
  310 	struct vm_area_struct *vma;	/* Target VMA */
  311 	unsigned int flags;		/* FAULT_FLAG_xxx flags */
  312 	gfp_t gfp_mask;			/* gfp mask to be used for allocations */
  313 	pgoff_t pgoff;			/* Logical page offset based on vma */
  314 	unsigned long address;		/* Faulting virtual address */
  315 	pmd_t *pmd;			/* Pointer to pmd entry matching
  316 					 * the 'address' */
  317 	pud_t *pud;			/* Pointer to pud entry matching
  318 					 * the 'address'
  319 					 */
  320 	pte_t orig_pte;			/* Value of PTE at the time of fault */
  321 
  322 	struct page *cow_page;		/* Page handler may use for COW fault */
  323 	struct mem_cgroup *memcg;	/* Cgroup cow_page belongs to */
  324 	struct page *page;		/* ->fault handlers should return a
  325 					 * page here, unless VM_FAULT_NOPAGE
  326 					 * is set (which is also implied by
  327 					 * VM_FAULT_ERROR).
  328 					 */
  329 	/* These three entries are valid only while holding ptl lock */
  330 	pte_t *pte;			/* Pointer to pte entry matching
  331 					 * the 'address'. NULL if the page
  332 					 * table hasn't been allocated.
  333 					 */
  334 	spinlock_t *ptl;		/* Page table lock.
  335 					 * Protects pte page table if 'pte'
  336 					 * is not NULL, otherwise pmd.
  337 					 */
  338 	pgtable_t prealloc_pte;		/* Pre-allocated pte page table.
  339 					 * vm_ops->map_pages() calls
  340 					 * alloc_set_pte() from atomic context.
  341 					 * do_fault_around() pre-allocates
  342 					 * page table to avoid allocation from
  343 					 * atomic context.
  344 					 */
  345 };
  346 
  347 /* page entry size for vm->huge_fault() */
  348 enum page_entry_size {
  349 	PE_SIZE_PTE = 0,
  350 	PE_SIZE_PMD,
  351 	PE_SIZE_PUD,
  352 };
  353 
  354 /*
  355  * These are the virtual MM functions - opening of an area, closing and
  356  * unmapping it (needed to keep files on disk up-to-date etc), pointer
  357  * to the functions called when a no-page or a wp-page exception occurs. 
  358  */
  359 struct vm_operations_struct {
  360 	void (*open)(struct vm_area_struct * area);
  361 	void (*close)(struct vm_area_struct * area);
  362 	int (*mremap)(struct vm_area_struct * area);
  363 	int (*fault)(struct vm_fault *vmf);
  364 	int (*huge_fault)(struct vm_fault *vmf, enum page_entry_size pe_size);
  365 	void (*map_pages)(struct vm_fault *vmf,
  366 			pgoff_t start_pgoff, pgoff_t end_pgoff);
  367 
  368 	/* notification that a previously read-only page is about to become
  369 	 * writable, if an error is returned it will cause a SIGBUS */
  370 	int (*page_mkwrite)(struct vm_fault *vmf);
  371 
  372 	/* same as page_mkwrite when using VM_PFNMAP|VM_MIXEDMAP */
  373 	int (*pfn_mkwrite)(struct vm_fault *vmf);
  374 
  375 	/* called by access_process_vm when get_user_pages() fails, typically
  376 	 * for use by special VMAs that can switch between memory and hardware
  377 	 */
  378 	int (*access)(struct vm_area_struct *vma, unsigned long addr,
  379 		      void *buf, int len, int write);
  380 
  381 	/* Called by the /proc/PID/maps code to ask the vma whether it
  382 	 * has a special name.  Returning non-NULL will also cause this
  383 	 * vma to be dumped unconditionally. */
  384 	const char *(*name)(struct vm_area_struct *vma);
  385 
  386 #ifdef CONFIG_NUMA
  387 	/*
  388 	 * set_policy() op must add a reference to any non-NULL @new mempolicy
  389 	 * to hold the policy upon return.  Caller should pass NULL @new to
  390 	 * remove a policy and fall back to surrounding context--i.e. do not
  391 	 * install a MPOL_DEFAULT policy, nor the task or system default
  392 	 * mempolicy.
  393 	 */
  394 	int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new);
  395 
  396 	/*
  397 	 * get_policy() op must add reference [mpol_get()] to any policy at
  398 	 * (vma,addr) marked as MPOL_SHARED.  The shared policy infrastructure
  399 	 * in mm/mempolicy.c will do this automatically.
  400 	 * get_policy() must NOT add a ref if the policy at (vma,addr) is not
  401 	 * marked as MPOL_SHARED. vma policies are protected by the mmap_sem.
  402 	 * If no [shared/vma] mempolicy exists at the addr, get_policy() op
  403 	 * must return NULL--i.e., do not "fallback" to task or system default
  404 	 * policy.
  405 	 */
  406 	struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
  407 					unsigned long addr);
  408 #endif
  409 	/*
  410 	 * Called by vm_normal_page() for special PTEs to find the
  411 	 * page for @addr.  This is useful if the default behavior
  412 	 * (using pte_page()) would not find the correct page.
  413 	 */
  414 	struct page *(*find_special_page)(struct vm_area_struct *vma,
  415 					  unsigned long addr);
  416 };
  417 
  418 struct mmu_gather;
  419 struct inode;
  420 
  421 #define page_private(page)		((page)->private)
  422 #define set_page_private(page, v)	((page)->private = (v))
  423 
  424 #if !defined(__HAVE_ARCH_PTE_DEVMAP) || !defined(CONFIG_TRANSPARENT_HUGEPAGE)
  425 static inline int pmd_devmap(pmd_t pmd)
  426 {
  427 	return 0;
  428 }
  429 static inline int pud_devmap(pud_t pud)
  430 {
  431 	return 0;
  432 }
  433 #endif
  434 
  435 /*
  436  * FIXME: take this include out, include page-flags.h in
  437  * files which need it (119 of them)
  438  */
  439 #include <linux/page-flags.h>
  440 #include <linux/huge_mm.h>
  441 
  442 /*
  443  * Methods to modify the page usage count.
  444  *
  445  * What counts for a page usage:
  446  * - cache mapping   (page->mapping)
  447  * - private data    (page->private)
  448  * - page mapped in a task's page tables, each mapping
  449  *   is counted separately
  450  *
  451  * Also, many kernel routines increase the page count before a critical
  452  * routine so they can be sure the page doesn't go away from under them.
  453  */
  454 
  455 /*
  456  * Drop a ref, return true if the refcount fell to zero (the page has no users)
  457  */
  458 static inline int put_page_testzero(struct page *page)
  459 {
  460 	VM_BUG_ON_PAGE(page_ref_count(page) == 0, page);
  461 	return page_ref_dec_and_test(page);
  462 }
  463 
  464 /*
  465  * Try to grab a ref unless the page has a refcount of zero, return false if
  466  * that is the case.
  467  * This can be called when MMU is off so it must not access
  468  * any of the virtual mappings.
  469  */
  470 static inline int get_page_unless_zero(struct page *page)
  471 {
  472 	return page_ref_add_unless(page, 1, 0);
  473 }
  474 
  475 extern int page_is_ram(unsigned long pfn);
  476 
  477 enum {
  478 	REGION_INTERSECTS,
  479 	REGION_DISJOINT,
  480 	REGION_MIXED,
  481 };
  482 
  483 int region_intersects(resource_size_t offset, size_t size, unsigned long flags,
  484 		      unsigned long desc);
  485 
  486 /* Support for virtually mapped pages */
  487 struct page *vmalloc_to_page(const void *addr);
  488 unsigned long vmalloc_to_pfn(const void *addr);
  489 
  490 /*
  491  * Determine if an address is within the vmalloc range
  492  *
  493  * On nommu, vmalloc/vfree wrap through kmalloc/kfree directly, so there
  494  * is no special casing required.
  495  */
  496 static inline bool is_vmalloc_addr(const void *x)
  497 {
  498 #ifdef CONFIG_MMU
  499 	unsigned long addr = (unsigned long)x;
  500 
  501 	return addr >= VMALLOC_START && addr < VMALLOC_END;
  502 #else
  503 	return false;
  504 #endif
  505 }
  506 #ifdef CONFIG_MMU
  507 extern int is_vmalloc_or_module_addr(const void *x);
  508 #else
  509 static inline int is_vmalloc_or_module_addr(const void *x)
  510 {
  511 	return 0;
  512 }
  513 #endif
  514 
  515 extern void kvfree(const void *addr);
  516 
  517 static inline atomic_t *compound_mapcount_ptr(struct page *page)
  518 {
  519 	return &page[1].compound_mapcount;
  520 }
  521 
  522 static inline int compound_mapcount(struct page *page)
  523 {
  524 	VM_BUG_ON_PAGE(!PageCompound(page), page);
  525 	page = compound_head(page);
  526 	return atomic_read(compound_mapcount_ptr(page)) + 1;
  527 }
  528 
  529 /*
  530  * The atomic page->_mapcount, starts from -1: so that transitions
  531  * both from it and to it can be tracked, using atomic_inc_and_test
  532  * and atomic_add_negative(-1).
  533  */
  534 static inline void page_mapcount_reset(struct page *page)
  535 {
  536 	atomic_set(&(page)->_mapcount, -1);
  537 }
  538 
  539 int __page_mapcount(struct page *page);
  540 
  541 static inline int page_mapcount(struct page *page)
  542 {
  543 	VM_BUG_ON_PAGE(PageSlab(page), page);
  544 
  545 	if (unlikely(PageCompound(page)))
  546 		return __page_mapcount(page);
  547 	return atomic_read(&page->_mapcount) + 1;
  548 }
  549 
  550 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  551 int total_mapcount(struct page *page);
  552 int page_trans_huge_mapcount(struct page *page, int *total_mapcount);
  553 #else
  554 static inline int total_mapcount(struct page *page)
  555 {
  556 	return page_mapcount(page);
  557 }
  558 static inline int page_trans_huge_mapcount(struct page *page,
  559 					   int *total_mapcount)
  560 {
  561 	int mapcount = page_mapcount(page);
  562 	if (total_mapcount)
  563 		*total_mapcount = mapcount;
  564 	return mapcount;
  565 }
  566 #endif
  567 
  568 static inline struct page *virt_to_head_page(const void *x)
  569 {
  570 	struct page *page = virt_to_page(x);
  571 
  572 	return compound_head(page);
  573 }
  574 
  575 void __put_page(struct page *page);
  576 
  577 void put_pages_list(struct list_head *pages);
  578 
  579 void split_page(struct page *page, unsigned int order);
  580 
  581 /*
  582  * Compound pages have a destructor function.  Provide a
  583  * prototype for that function and accessor functions.
  584  * These are _only_ valid on the head of a compound page.
  585  */
  586 typedef void compound_page_dtor(struct page *);
  587 
  588 /* Keep the enum in sync with compound_page_dtors array in mm/page_alloc.c */
  589 enum compound_dtor_id {
  590 	NULL_COMPOUND_DTOR,
  591 	COMPOUND_PAGE_DTOR,
  592 #ifdef CONFIG_HUGETLB_PAGE
  593 	HUGETLB_PAGE_DTOR,
  594 #endif
  595 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  596 	TRANSHUGE_PAGE_DTOR,
  597 #endif
  598 	NR_COMPOUND_DTORS,
  599 };
  600 extern compound_page_dtor * const compound_page_dtors[];
  601 
  602 static inline void set_compound_page_dtor(struct page *page,
  603 		enum compound_dtor_id compound_dtor)
  604 {
  605 	VM_BUG_ON_PAGE(compound_dtor >= NR_COMPOUND_DTORS, page);
  606 	page[1].compound_dtor = compound_dtor;
  607 }
  608 
  609 static inline compound_page_dtor *get_compound_page_dtor(struct page *page)
  610 {
  611 	VM_BUG_ON_PAGE(page[1].compound_dtor >= NR_COMPOUND_DTORS, page);
  612 	return compound_page_dtors[page[1].compound_dtor];
  613 }
  614 
  615 static inline unsigned int compound_order(struct page *page)
  616 {
  617 	if (!PageHead(page))
  618 		return 0;
  619 	return page[1].compound_order;
  620 }
  621 
  622 static inline void set_compound_order(struct page *page, unsigned int order)
  623 {
  624 	page[1].compound_order = order;
  625 }
  626 
  627 void free_compound_page(struct page *page);
  628 
  629 #ifdef CONFIG_MMU
  630 /*
  631  * Do pte_mkwrite, but only if the vma says VM_WRITE.  We do this when
  632  * servicing faults for write access.  In the normal case, do always want
  633  * pte_mkwrite.  But get_user_pages can cause write faults for mappings
  634  * that do not have writing enabled, when used by access_process_vm.
  635  */
  636 static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)
  637 {
  638 	if (likely(vma->vm_flags & VM_WRITE))
  639 		pte = pte_mkwrite(pte);
  640 	return pte;
  641 }
  642 
  643 int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg,
  644 		struct page *page);
  645 int finish_fault(struct vm_fault *vmf);
  646 int finish_mkwrite_fault(struct vm_fault *vmf);
  647 #endif
  648 
  649 /*
  650  * Multiple processes may "see" the same page. E.g. for untouched
  651  * mappings of /dev/null, all processes see the same page full of
  652  * zeroes, and text pages of executables and shared libraries have
  653  * only one copy in memory, at most, normally.
  654  *
  655  * For the non-reserved pages, page_count(page) denotes a reference count.
  656  *   page_count() == 0 means the page is free. page->lru is then used for
  657  *   freelist management in the buddy allocator.
  658  *   page_count() > 0  means the page has been allocated.
  659  *
  660  * Pages are allocated by the slab allocator in order to provide memory
  661  * to kmalloc and kmem_cache_alloc. In this case, the management of the
  662  * page, and the fields in 'struct page' are the responsibility of mm/slab.c
  663  * unless a particular usage is carefully commented. (the responsibility of
  664  * freeing the kmalloc memory is the caller's, of course).
  665  *
  666  * A page may be used by anyone else who does a __get_free_page().
  667  * In this case, page_count still tracks the references, and should only
  668  * be used through the normal accessor functions. The top bits of page->flags
  669  * and page->virtual store page management information, but all other fields
  670  * are unused and could be used privately, carefully. The management of this
  671  * page is the responsibility of the one who allocated it, and those who have
  672  * subsequently been given references to it.
  673  *
  674  * The other pages (we may call them "pagecache pages") are completely
  675  * managed by the Linux memory manager: I/O, buffers, swapping etc.
  676  * The following discussion applies only to them.
  677  *
  678  * A pagecache page contains an opaque `private' member, which belongs to the
  679  * page's address_space. Usually, this is the address of a circular list of
  680  * the page's disk buffers. PG_private must be set to tell the VM to call
  681  * into the filesystem to release these pages.
  682  *
  683  * A page may belong to an inode's memory mapping. In this case, page->mapping
  684  * is the pointer to the inode, and page->index is the file offset of the page,
  685  * in units of PAGE_SIZE.
  686  *
  687  * If pagecache pages are not associated with an inode, they are said to be
  688  * anonymous pages. These may become associated with the swapcache, and in that
  689  * case PG_swapcache is set, and page->private is an offset into the swapcache.
  690  *
  691  * In either case (swapcache or inode backed), the pagecache itself holds one
  692  * reference to the page. Setting PG_private should also increment the
  693  * refcount. The each user mapping also has a reference to the page.
  694  *
  695  * The pagecache pages are stored in a per-mapping radix tree, which is
  696  * rooted at mapping->page_tree, and indexed by offset.
  697  * Where 2.4 and early 2.6 kernels kept dirty/clean pages in per-address_space
  698  * lists, we instead now tag pages as dirty/writeback in the radix tree.
  699  *
  700  * All pagecache pages may be subject to I/O:
  701  * - inode pages may need to be read from disk,
  702  * - inode pages which have been modified and are MAP_SHARED may need
  703  *   to be written back to the inode on disk,
  704  * - anonymous pages (including MAP_PRIVATE file mappings) which have been
  705  *   modified may need to be swapped out to swap space and (later) to be read
  706  *   back into memory.
  707  */
  708 
  709 /*
  710  * The zone field is never updated after free_area_init_core()
  711  * sets it, so none of the operations on it need to be atomic.
  712  */
  713 
  714 /* Page flags: | [SECTION] | [NODE] | ZONE | [LAST_CPUPID] | ... | FLAGS | */
  715 #define SECTIONS_PGOFF		((sizeof(unsigned long)*8) - SECTIONS_WIDTH)
  716 #define NODES_PGOFF		(SECTIONS_PGOFF - NODES_WIDTH)
  717 #define ZONES_PGOFF		(NODES_PGOFF - ZONES_WIDTH)
  718 #define LAST_CPUPID_PGOFF	(ZONES_PGOFF - LAST_CPUPID_WIDTH)
  719 
  720 /*
  721  * Define the bit shifts to access each section.  For non-existent
  722  * sections we define the shift as 0; that plus a 0 mask ensures
  723  * the compiler will optimise away reference to them.
  724  */
  725 #define SECTIONS_PGSHIFT	(SECTIONS_PGOFF * (SECTIONS_WIDTH != 0))
  726 #define NODES_PGSHIFT		(NODES_PGOFF * (NODES_WIDTH != 0))
  727 #define ZONES_PGSHIFT		(ZONES_PGOFF * (ZONES_WIDTH != 0))
  728 #define LAST_CPUPID_PGSHIFT	(LAST_CPUPID_PGOFF * (LAST_CPUPID_WIDTH != 0))
  729 
  730 /* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allocator */
  731 #ifdef NODE_NOT_IN_PAGE_FLAGS
  732 #define ZONEID_SHIFT		(SECTIONS_SHIFT + ZONES_SHIFT)
  733 #define ZONEID_PGOFF		((SECTIONS_PGOFF < ZONES_PGOFF)? \
  734 						SECTIONS_PGOFF : ZONES_PGOFF)
  735 #else
  736 #define ZONEID_SHIFT		(NODES_SHIFT + ZONES_SHIFT)
  737 #define ZONEID_PGOFF		((NODES_PGOFF < ZONES_PGOFF)? \
  738 						NODES_PGOFF : ZONES_PGOFF)
  739 #endif
  740 
  741 #define ZONEID_PGSHIFT		(ZONEID_PGOFF * (ZONEID_SHIFT != 0))
  742 
  743 #if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > BITS_PER_LONG - NR_PAGEFLAGS
  744 #error SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > BITS_PER_LONG - NR_PAGEFLAGS
  745 #endif
  746 
  747 #define ZONES_MASK		((1UL << ZONES_WIDTH) - 1)
  748 #define NODES_MASK		((1UL << NODES_WIDTH) - 1)
  749 #define SECTIONS_MASK		((1UL << SECTIONS_WIDTH) - 1)
  750 #define LAST_CPUPID_MASK	((1UL << LAST_CPUPID_SHIFT) - 1)
  751 #define ZONEID_MASK		((1UL << ZONEID_SHIFT) - 1)
  752 
  753 static inline enum zone_type page_zonenum(const struct page *page)
  754 {
  755 	return (page->flags >> ZONES_PGSHIFT) & ZONES_MASK;
  756 }
  757 
  758 #ifdef CONFIG_ZONE_DEVICE
  759 void get_zone_device_page(struct page *page);
  760 void put_zone_device_page(struct page *page);
  761 static inline bool is_zone_device_page(const struct page *page)
  762 {
  763 	return page_zonenum(page) == ZONE_DEVICE;
  764 }
  765 #else
  766 static inline void get_zone_device_page(struct page *page)
  767 {
  768 }
  769 static inline void put_zone_device_page(struct page *page)
  770 {
  771 }
  772 static inline bool is_zone_device_page(const struct page *page)
  773 {
  774 	return false;
  775 }
  776 #endif
  777 
  778 static inline void get_page(struct page *page)
  779 {
  780 	page = compound_head(page);
  781 	/*
  782 	 * Getting a normal page or the head of a compound page
  783 	 * requires to already have an elevated page->_refcount.
  784 	 */
  785 	VM_BUG_ON_PAGE(page_ref_count(page) <= 0, page);
  786 	page_ref_inc(page);
  787 
  788 	if (unlikely(is_zone_device_page(page)))
  789 		get_zone_device_page(page);
  790 }
  791 
  792 static inline void put_page(struct page *page)
  793 {
  794 	page = compound_head(page);
  795 
  796 	if (put_page_testzero(page))
  797 		__put_page(page);
  798 
  799 	if (unlikely(is_zone_device_page(page)))
  800 		put_zone_device_page(page);
  801 }
  802 
  803 #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
  804 #define SECTION_IN_PAGE_FLAGS
  805 #endif
  806 
  807 /*
  808  * The identification function is mainly used by the buddy allocator for
  809  * determining if two pages could be buddies. We are not really identifying
  810  * the zone since we could be using the section number id if we do not have
  811  * node id available in page flags.
  812  * We only guarantee that it will return the same value for two combinable
  813  * pages in a zone.
  814  */
  815 static inline int page_zone_id(struct page *page)
  816 {
  817 	return (page->flags >> ZONEID_PGSHIFT) & ZONEID_MASK;
  818 }
  819 
  820 static inline int zone_to_nid(struct zone *zone)
  821 {
  822 #ifdef CONFIG_NUMA
  823 	return zone->node;
  824 #else
  825 	return 0;
  826 #endif
  827 }
  828 
  829 #ifdef NODE_NOT_IN_PAGE_FLAGS
  830 extern int page_to_nid(const struct page *page);
  831 #else
  832 static inline int page_to_nid(const struct page *page)
  833 {
  834 	return (page->flags >> NODES_PGSHIFT) & NODES_MASK;
  835 }
  836 #endif
  837 
  838 #ifdef CONFIG_NUMA_BALANCING
  839 static inline int cpu_pid_to_cpupid(int cpu, int pid)
  840 {
  841 	return ((cpu & LAST__CPU_MASK) << LAST__PID_SHIFT) | (pid & LAST__PID_MASK);
  842 }
  843 
  844 static inline int cpupid_to_pid(int cpupid)
  845 {
  846 	return cpupid & LAST__PID_MASK;
  847 }
  848 
  849 static inline int cpupid_to_cpu(int cpupid)
  850 {
  851 	return (cpupid >> LAST__PID_SHIFT) & LAST__CPU_MASK;
  852 }
  853 
  854 static inline int cpupid_to_nid(int cpupid)
  855 {
  856 	return cpu_to_node(cpupid_to_cpu(cpupid));
  857 }
  858 
  859 static inline bool cpupid_pid_unset(int cpupid)
  860 {
  861 	return cpupid_to_pid(cpupid) == (-1 & LAST__PID_MASK);
  862 }
  863 
  864 static inline bool cpupid_cpu_unset(int cpupid)
  865 {
  866 	return cpupid_to_cpu(cpupid) == (-1 & LAST__CPU_MASK);
  867 }
  868 
  869 static inline bool __cpupid_match_pid(pid_t task_pid, int cpupid)
  870 {
  871 	return (task_pid & LAST__PID_MASK) == cpupid_to_pid(cpupid);
  872 }
  873 
  874 #define cpupid_match_pid(task, cpupid) __cpupid_match_pid(task->pid, cpupid)
  875 #ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS
  876 static inline int page_cpupid_xchg_last(struct page *page, int cpupid)
  877 {
  878 	return xchg(&page->_last_cpupid, cpupid & LAST_CPUPID_MASK);
  879 }
  880 
  881 static inline int page_cpupid_last(struct page *page)
  882 {
  883 	return page->_last_cpupid;
  884 }
  885 static inline void page_cpupid_reset_last(struct page *page)
  886 {
  887 	page->_last_cpupid = -1 & LAST_CPUPID_MASK;
  888 }
  889 #else
  890 static inline int page_cpupid_last(struct page *page)
  891 {
  892 	return (page->flags >> LAST_CPUPID_PGSHIFT) & LAST_CPUPID_MASK;
  893 }
  894 
  895 extern int page_cpupid_xchg_last(struct page *page, int cpupid);
  896 
  897 static inline void page_cpupid_reset_last(struct page *page)
  898 {
  899 	page->flags |= LAST_CPUPID_MASK << LAST_CPUPID_PGSHIFT;
  900 }
  901 #endif /* LAST_CPUPID_NOT_IN_PAGE_FLAGS */
  902 #else /* !CONFIG_NUMA_BALANCING */
  903 static inline int page_cpupid_xchg_last(struct page *page, int cpupid)
  904 {
  905 	return page_to_nid(page); /* XXX */
  906 }
  907 
  908 static inline int page_cpupid_last(struct page *page)
  909 {
  910 	return page_to_nid(page); /* XXX */
  911 }
  912 
  913 static inline int cpupid_to_nid(int cpupid)
  914 {
  915 	return -1;
  916 }
  917 
  918 static inline int cpupid_to_pid(int cpupid)
  919 {
  920 	return -1;
  921 }
  922 
  923 static inline int cpupid_to_cpu(int cpupid)
  924 {
  925 	return -1;
  926 }
  927 
  928 static inline int cpu_pid_to_cpupid(int nid, int pid)
  929 {
  930 	return -1;
  931 }
  932 
  933 static inline bool cpupid_pid_unset(int cpupid)
  934 {
  935 	return 1;
  936 }
  937 
  938 static inline void page_cpupid_reset_last(struct page *page)
  939 {
  940 }
  941 
  942 static inline bool cpupid_match_pid(struct task_struct *task, int cpupid)
  943 {
  944 	return false;
  945 }
  946 #endif /* CONFIG_NUMA_BALANCING */
  947 
  948 static inline struct zone *page_zone(const struct page *page)
  949 {
  950 	return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)];
  951 }
  952 
  953 static inline pg_data_t *page_pgdat(const struct page *page)
  954 {
  955 	return NODE_DATA(page_to_nid(page));
  956 }
  957 
  958 #ifdef SECTION_IN_PAGE_FLAGS
  959 static inline void set_page_section(struct page *page, unsigned long section)
  960 {
  961 	page->flags &= ~(SECTIONS_MASK << SECTIONS_PGSHIFT);
  962 	page->flags |= (section & SECTIONS_MASK) << SECTIONS_PGSHIFT;
  963 }
  964 
  965 static inline unsigned long page_to_section(const struct page *page)
  966 {
  967 	return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK;
  968 }
  969 #endif
  970 
  971 static inline void set_page_zone(struct page *page, enum zone_type zone)
  972 {
  973 	page->flags &= ~(ZONES_MASK << ZONES_PGSHIFT);
  974 	page->flags |= (zone & ZONES_MASK) << ZONES_PGSHIFT;
  975 }
  976 
  977 static inline void set_page_node(struct page *page, unsigned long node)
  978 {
  979 	page->flags &= ~(NODES_MASK << NODES_PGSHIFT);
  980 	page->flags |= (node & NODES_MASK) << NODES_PGSHIFT;
  981 }
  982 
  983 static inline void set_page_links(struct page *page, enum zone_type zone,
  984 	unsigned long node, unsigned long pfn)
  985 {
  986 	set_page_zone(page, zone);
  987 	set_page_node(page, node);
  988 #ifdef SECTION_IN_PAGE_FLAGS
  989 	set_page_section(page, pfn_to_section_nr(pfn));
  990 #endif
  991 }
  992 
  993 #ifdef CONFIG_MEMCG
  994 static inline struct mem_cgroup *page_memcg(struct page *page)
  995 {
  996 	return page->mem_cgroup;
  997 }
  998 static inline struct mem_cgroup *page_memcg_rcu(struct page *page)
  999 {
 1000 	WARN_ON_ONCE(!rcu_read_lock_held());
 1001 	return READ_ONCE(page->mem_cgroup);
 1002 }
 1003 #else
 1004 static inline struct mem_cgroup *page_memcg(struct page *page)
 1005 {
 1006 	return NULL;
 1007 }
 1008 static inline struct mem_cgroup *page_memcg_rcu(struct page *page)
 1009 {
 1010 	WARN_ON_ONCE(!rcu_read_lock_held());
 1011 	return NULL;
 1012 }
 1013 #endif
 1014 
 1015 /*
 1016  * Some inline functions in vmstat.h depend on page_zone()
 1017  */
 1018 #include <linux/vmstat.h>
 1019 
 1020 static __always_inline void *lowmem_page_address(const struct page *page)
 1021 {
 1022 	return page_to_virt(page);
 1023 }
 1024 
 1025 #if defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL)
 1026 #define HASHED_PAGE_VIRTUAL
 1027 #endif
 1028 
 1029 #if defined(WANT_PAGE_VIRTUAL)
 1030 static inline void *page_address(const struct page *page)
 1031 {
 1032 	return page->virtual;
 1033 }
 1034 static inline void set_page_address(struct page *page, void *address)
 1035 {
 1036 	page->virtual = address;
 1037 }
 1038 #define page_address_init()  do { } while(0)
 1039 #endif
 1040 
 1041 #if defined(HASHED_PAGE_VIRTUAL)
 1042 void *page_address(const struct page *page);
 1043 void set_page_address(struct page *page, void *virtual);
 1044 void page_address_init(void);
 1045 #endif
 1046 
 1047 #if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL)
 1048 #define page_address(page) lowmem_page_address(page)
 1049 #define set_page_address(page, address)  do { } while(0)
 1050 #define page_address_init()  do { } while(0)
 1051 #endif
 1052 
 1053 extern void *page_rmapping(struct page *page);
 1054 extern struct anon_vma *page_anon_vma(struct page *page);
 1055 extern struct address_space *page_mapping(struct page *page);
 1056 
 1057 extern struct address_space *__page_file_mapping(struct page *);
 1058 
 1059 static inline
 1060 struct address_space *page_file_mapping(struct page *page)
 1061 {
 1062 	if (unlikely(PageSwapCache(page)))
 1063 		return __page_file_mapping(page);
 1064 
 1065 	return page->mapping;
 1066 }
 1067 
 1068 extern pgoff_t __page_file_index(struct page *page);
 1069 
 1070 /*
 1071  * Return the pagecache index of the passed page.  Regular pagecache pages
 1072  * use ->index whereas swapcache pages use swp_offset(->private)
 1073  */
 1074 static inline pgoff_t page_index(struct page *page)
 1075 {
 1076 	if (unlikely(PageSwapCache(page)))
 1077 		return __page_file_index(page);
 1078 	return page->index;
 1079 }
 1080 
 1081 bool page_mapped(struct page *page);
 1082 struct address_space *page_mapping(struct page *page);
 1083 
 1084 /*
 1085  * Return true only if the page has been allocated with
 1086  * ALLOC_NO_WATERMARKS and the low watermark was not
 1087  * met implying that the system is under some pressure.
 1088  */
 1089 static inline bool page_is_pfmemalloc(struct page *page)
 1090 {
 1091 	/*
 1092 	 * Page index cannot be this large so this must be
 1093 	 * a pfmemalloc page.
 1094 	 */
 1095 	return page->index == -1UL;
 1096 }
 1097 
 1098 /*
 1099  * Only to be called by the page allocator on a freshly allocated
 1100  * page.
 1101  */
 1102 static inline void set_page_pfmemalloc(struct page *page)
 1103 {
 1104 	page->index = -1UL;
 1105 }
 1106 
 1107 static inline void clear_page_pfmemalloc(struct page *page)
 1108 {
 1109 	page->index = 0;
 1110 }
 1111 
 1112 /*
 1113  * Different kinds of faults, as returned by handle_mm_fault().
 1114  * Used to decide whether a process gets delivered SIGBUS or
 1115  * just gets major/minor fault counters bumped up.
 1116  */
 1117 
 1118 #define VM_FAULT_OOM	0x0001
 1119 #define VM_FAULT_SIGBUS	0x0002
 1120 #define VM_FAULT_MAJOR	0x0004
 1121 #define VM_FAULT_WRITE	0x0008	/* Special case for get_user_pages */
 1122 #define VM_FAULT_HWPOISON 0x0010	/* Hit poisoned small page */
 1123 #define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index encoded in upper bits */
 1124 #define VM_FAULT_SIGSEGV 0x0040
 1125 
 1126 #define VM_FAULT_NOPAGE	0x0100	/* ->fault installed the pte, not return page */
 1127 #define VM_FAULT_LOCKED	0x0200	/* ->fault locked the returned page */
 1128 #define VM_FAULT_RETRY	0x0400	/* ->fault blocked, must retry */
 1129 #define VM_FAULT_FALLBACK 0x0800	/* huge page fault failed, fall back to small */
 1130 #define VM_FAULT_DONE_COW   0x1000	/* ->fault has fully handled COW */
 1131 
 1132 #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */
 1133 
 1134 #define VM_FAULT_ERROR	(VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \
 1135 			 VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
 1136 			 VM_FAULT_FALLBACK)
 1137 
 1138 #define VM_FAULT_RESULT_TRACE \
 1139 	{ VM_FAULT_OOM,			"OOM" }, \
 1140 	{ VM_FAULT_SIGBUS,		"SIGBUS" }, \
 1141 	{ VM_FAULT_MAJOR,		"MAJOR" }, \
 1142 	{ VM_FAULT_WRITE,		"WRITE" }, \
 1143 	{ VM_FAULT_HWPOISON,		"HWPOISON" }, \
 1144 	{ VM_FAULT_HWPOISON_LARGE,	"HWPOISON_LARGE" }, \
 1145 	{ VM_FAULT_SIGSEGV,		"SIGSEGV" }, \
 1146 	{ VM_FAULT_NOPAGE,		"NOPAGE" }, \
 1147 	{ VM_FAULT_LOCKED,		"LOCKED" }, \
 1148 	{ VM_FAULT_RETRY,		"RETRY" }, \
 1149 	{ VM_FAULT_FALLBACK,		"FALLBACK" }, \
 1150 	{ VM_FAULT_DONE_COW,		"DONE_COW" }
 1151 
 1152 /* Encode hstate index for a hwpoisoned large page */
 1153 #define VM_FAULT_SET_HINDEX(x) ((x) << 12)
 1154 #define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
 1155 
 1156 /*
 1157  * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
 1158  */
 1159 extern void pagefault_out_of_memory(void);
 1160 
 1161 #define offset_in_page(p)	((unsigned long)(p) & ~PAGE_MASK)
 1162 
 1163 /*
 1164  * Flags passed to show_mem() and show_free_areas() to suppress output in
 1165  * various contexts.
 1166  */
 1167 #define SHOW_MEM_FILTER_NODES		(0x0001u)	/* disallowed nodes */
 1168 
 1169 extern void show_free_areas(unsigned int flags, nodemask_t *nodemask);
 1170 
 1171 extern bool can_do_mlock(void);
 1172 extern int user_shm_lock(size_t, struct user_struct *);
 1173 extern void user_shm_unlock(size_t, struct user_struct *);
 1174 
 1175 /*
 1176  * Parameter block passed down to zap_pte_range in exceptional cases.
 1177  */
 1178 struct zap_details {
 1179 	struct address_space *check_mapping;	/* Check page->mapping if set */
 1180 	pgoff_t	first_index;			/* Lowest page->index to unmap */
 1181 	pgoff_t last_index;			/* Highest page->index to unmap */
 1182 };
 1183 
 1184 struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
 1185 		pte_t pte);
 1186 struct page *vm_normal_page_pmd(struct vm_area_struct *vma, unsigned long addr,
 1187 				pmd_t pmd);
 1188 
 1189 int zap_vma_ptes(struct vm_area_struct *vma, unsigned long address,
 1190 		unsigned long size);
 1191 void zap_page_range(struct vm_area_struct *vma, unsigned long address,
 1192 		unsigned long size);
 1193 void unmap_vmas(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
 1194 		unsigned long start, unsigned long end);
 1195 
 1196 /**
 1197  * mm_walk - callbacks for walk_page_range
 1198  * @pud_entry: if set, called for each non-empty PUD (2nd-level) entry
 1199  *	       this handler should only handle pud_trans_huge() puds.
 1200  *	       the pmd_entry or pte_entry callbacks will be used for
 1201  *	       regular PUDs.
 1202  * @pmd_entry: if set, called for each non-empty PMD (3rd-level) entry
 1203  *	       this handler is required to be able to handle
 1204  *	       pmd_trans_huge() pmds.  They may simply choose to
 1205  *	       split_huge_page() instead of handling it explicitly.
 1206  * @pte_entry: if set, called for each non-empty PTE (4th-level) entry
 1207  * @pte_hole: if set, called for each hole at all levels
 1208  * @hugetlb_entry: if set, called for each hugetlb entry
 1209  * @test_walk: caller specific callback function to determine whether
 1210  *             we walk over the current vma or not. Returning 0
 1211  *             value means "do page table walk over the current vma,"
 1212  *             and a negative one means "abort current page table walk
 1213  *             right now." 1 means "skip the current vma."
 1214  * @mm:        mm_struct representing the target process of page table walk
 1215  * @vma:       vma currently walked (NULL if walking outside vmas)
 1216  * @private:   private data for callbacks' usage
 1217  *
 1218  * (see the comment on walk_page_range() for more details)
 1219  */
 1220 struct mm_walk {
 1221 	int (*pud_entry)(pud_t *pud, unsigned long addr,
 1222 			 unsigned long next, struct mm_walk *walk);
 1223 	int (*pmd_entry)(pmd_t *pmd, unsigned long addr,
 1224 			 unsigned long next, struct mm_walk *walk);
 1225 	int (*pte_entry)(pte_t *pte, unsigned long addr,
 1226 			 unsigned long next, struct mm_walk *walk);
 1227 	int (*pte_hole)(unsigned long addr, unsigned long next,
 1228 			struct mm_walk *walk);
 1229 	int (*hugetlb_entry)(pte_t *pte, unsigned long hmask,
 1230 			     unsigned long addr, unsigned long next,
 1231 			     struct mm_walk *walk);
 1232 	int (*test_walk)(unsigned long addr, unsigned long next,
 1233 			struct mm_walk *walk);
 1234 	struct mm_struct *mm;
 1235 	struct vm_area_struct *vma;
 1236 	void *private;
 1237 };
 1238 
 1239 int walk_page_range(unsigned long addr, unsigned long end,
 1240 		struct mm_walk *walk);
 1241 int walk_page_vma(struct vm_area_struct *vma, struct mm_walk *walk);
 1242 void free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
 1243 		unsigned long end, unsigned long floor, unsigned long ceiling);
 1244 int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
 1245 			struct vm_area_struct *vma);
 1246 void unmap_mapping_range(struct address_space *mapping,
 1247 		loff_t const holebegin, loff_t const holelen, int even_cows);
 1248 int follow_pte_pmd(struct mm_struct *mm, unsigned long address,
 1249 			     pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp);
 1250 int follow_pfn(struct vm_area_struct *vma, unsigned long address,
 1251 	unsigned long *pfn);
 1252 int follow_phys(struct vm_area_struct *vma, unsigned long address,
 1253 		unsigned int flags, unsigned long *prot, resource_size_t *phys);
 1254 int generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
 1255 			void *buf, int len, int write);
 1256 
 1257 static inline void unmap_shared_mapping_range(struct address_space *mapping,
 1258 		loff_t const holebegin, loff_t const holelen)
 1259 {
 1260 	unmap_mapping_range(mapping, holebegin, holelen, 0);
 1261 }
 1262 
 1263 extern void truncate_pagecache(struct inode *inode, loff_t new);
 1264 extern void truncate_setsize(struct inode *inode, loff_t newsize);
 1265 void pagecache_isize_extended(struct inode *inode, loff_t from, loff_t to);
 1266 void truncate_pagecache_range(struct inode *inode, loff_t offset, loff_t end);
 1267 int truncate_inode_page(struct address_space *mapping, struct page *page);
 1268 int generic_error_remove_page(struct address_space *mapping, struct page *page);
 1269 int invalidate_inode_page(struct page *page);
 1270 
 1271 #ifdef CONFIG_MMU
 1272 extern int handle_mm_fault(struct vm_area_struct *vma, unsigned long address,
 1273 		unsigned int flags);
 1274 extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm,
 1275 			    unsigned long address, unsigned int fault_flags,
 1276 			    bool *unlocked);
 1277 #else
 1278 static inline int handle_mm_fault(struct vm_area_struct *vma,
 1279 		unsigned long address, unsigned int flags)
 1280 {
 1281 	/* should never happen if there's no MMU */
 1282 	BUG();
 1283 	return VM_FAULT_SIGBUS;
 1284 }
 1285 static inline int fixup_user_fault(struct task_struct *tsk,
 1286 		struct mm_struct *mm, unsigned long address,
 1287 		unsigned int fault_flags, bool *unlocked)
 1288 {
 1289 	/* should never happen if there's no MMU */
 1290 	BUG();
 1291 	return -EFAULT;
 1292 }
 1293 #endif
 1294 
 1295 extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len,
 1296 		unsigned int gup_flags);
 1297 extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
 1298 		void *buf, int len, unsigned int gup_flags);
 1299 extern int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
 1300 		unsigned long addr, void *buf, int len, unsigned int gup_flags);
 1301 
 1302 long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm,
 1303 			    unsigned long start, unsigned long nr_pages,
 1304 			    unsigned int gup_flags, struct page **pages,
 1305 			    struct vm_area_struct **vmas, int *locked);
 1306 long get_user_pages(unsigned long start, unsigned long nr_pages,
 1307 			    unsigned int gup_flags, struct page **pages,
 1308 			    struct vm_area_struct **vmas);
 1309 long get_user_pages_locked(unsigned long start, unsigned long nr_pages,
 1310 		    unsigned int gup_flags, struct page **pages, int *locked);
 1311 long get_user_pages_unlocked(unsigned long start, unsigned long nr_pages,
 1312 		    struct page **pages, unsigned int gup_flags);
 1313 int get_user_pages_fast(unsigned long start, int nr_pages, int write,
 1314 			struct page **pages);
 1315 
 1316 /* Container for pinned pfns / pages */
 1317 struct frame_vector {
 1318 	unsigned int nr_allocated;	/* Number of frames we have space for */
 1319 	unsigned int nr_frames;	/* Number of frames stored in ptrs array */
 1320 	bool got_ref;		/* Did we pin pages by getting page ref? */
 1321 	bool is_pfns;		/* Does array contain pages or pfns? */
 1322 	void *ptrs[0];		/* Array of pinned pfns / pages. Use
 1323 				 * pfns_vector_pages() or pfns_vector_pfns()
 1324 				 * for access */
 1325 };
 1326 
 1327 struct frame_vector *frame_vector_create(unsigned int nr_frames);
 1328 void frame_vector_destroy(struct frame_vector *vec);
 1329 int get_vaddr_frames(unsigned long start, unsigned int nr_pfns,
 1330 		     unsigned int gup_flags, struct frame_vector *vec);
 1331 void put_vaddr_frames(struct frame_vector *vec);
 1332 int frame_vector_to_pages(struct frame_vector *vec);
 1333 void frame_vector_to_pfns(struct frame_vector *vec);
 1334 
 1335 static inline unsigned int frame_vector_count(struct frame_vector *vec)
 1336 {
 1337 	return vec->nr_frames;
 1338 }
 1339 
 1340 static inline struct page **frame_vector_pages(struct frame_vector *vec)
 1341 {
 1342 	if (vec->is_pfns) {
 1343 		int err = frame_vector_to_pages(vec);
 1344 
 1345 		if (err)
 1346 			return ERR_PTR(err);
 1347 	}
 1348 	return (struct page **)(vec->ptrs);
 1349 }
 1350 
 1351 static inline unsigned long *frame_vector_pfns(struct frame_vector *vec)
 1352 {
 1353 	if (!vec->is_pfns)
 1354 		frame_vector_to_pfns(vec);
 1355 	return (unsigned long *)(vec->ptrs);
 1356 }
 1357 
 1358 struct kvec;
 1359 int get_kernel_pages(const struct kvec *iov, int nr_pages, int write,
 1360 			struct page **pages);
 1361 int get_kernel_page(unsigned long start, int write, struct page **pages);
 1362 struct page *get_dump_page(unsigned long addr);
 1363 
 1364 extern int try_to_release_page(struct page * page, gfp_t gfp_mask);
 1365 extern void do_invalidatepage(struct page *page, unsigned int offset,
 1366 			      unsigned int length);
 1367 
 1368 int __set_page_dirty_nobuffers(struct page *page);
 1369 int __set_page_dirty_no_writeback(struct page *page);
 1370 int redirty_page_for_writepage(struct writeback_control *wbc,
 1371 				struct page *page);
 1372 void account_page_dirtied(struct page *page, struct address_space *mapping);
 1373 void account_page_cleaned(struct page *page, struct address_space *mapping,
 1374 			  struct bdi_writeback *wb);
 1375 int set_page_dirty(struct page *page);
 1376 int set_page_dirty_lock(struct page *page);
 1377 void cancel_dirty_page(struct page *page);
 1378 int clear_page_dirty_for_io(struct page *page);
 1379 
 1380 int get_cmdline(struct task_struct *task, char *buffer, int buflen);
 1381 
 1382 /* Is the vma a continuation of the stack vma above it? */
 1383 static inline int vma_growsdown(struct vm_area_struct *vma, unsigned long addr)
 1384 {
 1385 	return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN);
 1386 }
 1387 
 1388 static inline bool vma_is_anonymous(struct vm_area_struct *vma)
 1389 {
 1390 	return !vma->vm_ops;
 1391 }
 1392 
 1393 #ifdef CONFIG_SHMEM
 1394 /*
 1395  * The vma_is_shmem is not inline because it is used only by slow
 1396  * paths in userfault.
 1397  */
 1398 bool vma_is_shmem(struct vm_area_struct *vma);
 1399 #else
 1400 static inline bool vma_is_shmem(struct vm_area_struct *vma) { return false; }
 1401 #endif
 1402 
 1403 static inline int stack_guard_page_start(struct vm_area_struct *vma,
 1404 					     unsigned long addr)
 1405 {
 1406 	return (vma->vm_flags & VM_GROWSDOWN) &&
 1407 		(vma->vm_start == addr) &&
 1408 		!vma_growsdown(vma->vm_prev, addr);
 1409 }
 1410 
 1411 /* Is the vma a continuation of the stack vma below it? */
 1412 static inline int vma_growsup(struct vm_area_struct *vma, unsigned long addr)
 1413 {
 1414 	return vma && (vma->vm_start == addr) && (vma->vm_flags & VM_GROWSUP);
 1415 }
 1416 
 1417 static inline int stack_guard_page_end(struct vm_area_struct *vma,
 1418 					   unsigned long addr)
 1419 {
 1420 	return (vma->vm_flags & VM_GROWSUP) &&
 1421 		(vma->vm_end == addr) &&
 1422 		!vma_growsup(vma->vm_next, addr);
 1423 }
 1424 
 1425 int vma_is_stack_for_current(struct vm_area_struct *vma);
 1426 
 1427 extern unsigned long move_page_tables(struct vm_area_struct *vma,
 1428 		unsigned long old_addr, struct vm_area_struct *new_vma,
 1429 		unsigned long new_addr, unsigned long len,
 1430 		bool need_rmap_locks);
 1431 extern unsigned long change_protection(struct vm_area_struct *vma, unsigned long start,
 1432 			      unsigned long end, pgprot_t newprot,
 1433 			      int dirty_accountable, int prot_numa);
 1434 extern int mprotect_fixup(struct vm_area_struct *vma,
 1435 			  struct vm_area_struct **pprev, unsigned long start,
 1436 			  unsigned long end, unsigned long newflags);
 1437 
 1438 /*
 1439  * doesn't attempt to fault and will return short.
 1440  */
 1441 int __get_user_pages_fast(unsigned long start, int nr_pages, int write,
 1442 			  struct page **pages);
 1443 /*
 1444  * per-process(per-mm_struct) statistics.
 1445  */
 1446 static inline unsigned long get_mm_counter(struct mm_struct *mm, int member)
 1447 {
 1448 	long val = atomic_long_read(&mm->rss_stat.count[member]);
 1449 
 1450 #ifdef SPLIT_RSS_COUNTING
 1451 	/*
 1452 	 * counter is updated in asynchronous manner and may go to minus.
 1453 	 * But it's never be expected number for users.
 1454 	 */
 1455 	if (val < 0)
 1456 		val = 0;
 1457 #endif
 1458 	return (unsigned long)val;
 1459 }
 1460 
 1461 static inline void add_mm_counter(struct mm_struct *mm, int member, long value)
 1462 {
 1463 	atomic_long_add(value, &mm->rss_stat.count[member]);
 1464 }
 1465 
 1466 static inline void inc_mm_counter(struct mm_struct *mm, int member)
 1467 {
 1468 	atomic_long_inc(&mm->rss_stat.count[member]);
 1469 }
 1470 
 1471 static inline void dec_mm_counter(struct mm_struct *mm, int member)
 1472 {
 1473 	atomic_long_dec(&mm->rss_stat.count[member]);
 1474 }
 1475 
 1476 /* Optimized variant when page is already known not to be PageAnon */
 1477 static inline int mm_counter_file(struct page *page)
 1478 {
 1479 	if (PageSwapBacked(page))
 1480 		return MM_SHMEMPAGES;
 1481 	return MM_FILEPAGES;
 1482 }
 1483 
 1484 static inline int mm_counter(struct page *page)
 1485 {
 1486 	if (PageAnon(page))
 1487 		return MM_ANONPAGES;
 1488 	return mm_counter_file(page);
 1489 }
 1490 
 1491 static inline unsigned long get_mm_rss(struct mm_struct *mm)
 1492 {
 1493 	return get_mm_counter(mm, MM_FILEPAGES) +
 1494 		get_mm_counter(mm, MM_ANONPAGES) +
 1495 		get_mm_counter(mm, MM_SHMEMPAGES);
 1496 }
 1497 
 1498 static inline unsigned long get_mm_hiwater_rss(struct mm_struct *mm)
 1499 {
 1500 	return max(mm->hiwater_rss, get_mm_rss(mm));
 1501 }
 1502 
 1503 static inline unsigned long get_mm_hiwater_vm(struct mm_struct *mm)
 1504 {
 1505 	return max(mm->hiwater_vm, mm->total_vm);
 1506 }
 1507 
 1508 static inline void update_hiwater_rss(struct mm_struct *mm)
 1509 {
 1510 	unsigned long _rss = get_mm_rss(mm);
 1511 
 1512 	if ((mm)->hiwater_rss < _rss)
 1513 		(mm)->hiwater_rss = _rss;
 1514 }
 1515 
 1516 static inline void update_hiwater_vm(struct mm_struct *mm)
 1517 {
 1518 	if (mm->hiwater_vm < mm->total_vm)
 1519 		mm->hiwater_vm = mm->total_vm;
 1520 }
 1521 
 1522 static inline void reset_mm_hiwater_rss(struct mm_struct *mm)
 1523 {
 1524 	mm->hiwater_rss = get_mm_rss(mm);
 1525 }
 1526 
 1527 static inline void setmax_mm_hiwater_rss(unsigned long *maxrss,
 1528 					 struct mm_struct *mm)
 1529 {
 1530 	unsigned long hiwater_rss = get_mm_hiwater_rss(mm);
 1531 
 1532 	if (*maxrss < hiwater_rss)
 1533 		*maxrss = hiwater_rss;
 1534 }
 1535 
 1536 #if defined(SPLIT_RSS_COUNTING)
 1537 void sync_mm_rss(struct mm_struct *mm);
 1538 #else
 1539 static inline void sync_mm_rss(struct mm_struct *mm)
 1540 {
 1541 }
 1542 #endif
 1543 
 1544 #ifndef __HAVE_ARCH_PTE_DEVMAP
 1545 static inline int pte_devmap(pte_t pte)
 1546 {
 1547 	return 0;
 1548 }
 1549 #endif
 1550 
 1551 int vma_wants_writenotify(struct vm_area_struct *vma, pgprot_t vm_page_prot);
 1552 
 1553 extern pte_t *__get_locked_pte(struct mm_struct *mm, unsigned long addr,
 1554 			       spinlock_t **ptl);
 1555 static inline pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr,
 1556 				    spinlock_t **ptl)
 1557 {
 1558 	pte_t *ptep;
 1559 	__cond_lock(*ptl, ptep = __get_locked_pte(mm, addr, ptl));
 1560 	return ptep;
 1561 }
 1562 
 1563 #ifdef __PAGETABLE_PUD_FOLDED
 1564 static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd,
 1565 						unsigned long address)
 1566 {
 1567 	return 0;
 1568 }
 1569 #else
 1570 int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
 1571 #endif
 1572 
 1573 #if defined(__PAGETABLE_PMD_FOLDED) || !defined(CONFIG_MMU)
 1574 static inline int __pmd_alloc(struct mm_struct *mm, pud_t *pud,
 1575 						unsigned long address)
 1576 {
 1577 	return 0;
 1578 }
 1579 
 1580 static inline void mm_nr_pmds_init(struct mm_struct *mm) {}
 1581 
 1582 static inline unsigned long mm_nr_pmds(struct mm_struct *mm)
 1583 {
 1584 	return 0;
 1585 }
 1586 
 1587 static inline void mm_inc_nr_pmds(struct mm_struct *mm) {}
 1588 static inline void mm_dec_nr_pmds(struct mm_struct *mm) {}
 1589 
 1590 #else
 1591 int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address);
 1592 
 1593 static inline void mm_nr_pmds_init(struct mm_struct *mm)
 1594 {
 1595 	atomic_long_set(&mm->nr_pmds, 0);
 1596 }
 1597 
 1598 static inline unsigned long mm_nr_pmds(struct mm_struct *mm)
 1599 {
 1600 	return atomic_long_read(&mm->nr_pmds);
 1601 }
 1602 
 1603 static inline void mm_inc_nr_pmds(struct mm_struct *mm)
 1604 {
 1605 	atomic_long_inc(&mm->nr_pmds);
 1606 }
 1607 
 1608 static inline void mm_dec_nr_pmds(struct mm_struct *mm)
 1609 {
 1610 	atomic_long_dec(&mm->nr_pmds);
 1611 }
 1612 #endif
 1613 
 1614 int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address);
 1615 int __pte_alloc_kernel(pmd_t *pmd, unsigned long address);
 1616 
 1617 /*
 1618  * The following ifdef needed to get the 4level-fixup.h header to work.
 1619  * Remove it when 4level-fixup.h has been removed.
 1620  */
 1621 #if defined(CONFIG_MMU) && !defined(__ARCH_HAS_4LEVEL_HACK)
 1622 static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
 1623 {
 1624 	return (unlikely(pgd_none(*pgd)) && __pud_alloc(mm, pgd, address))?
 1625 		NULL: pud_offset(pgd, address);
 1626 }
 1627 
 1628 static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
 1629 {
 1630 	return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))?
 1631 		NULL: pmd_offset(pud, address);
 1632 }
 1633 #endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */
 1634 
 1635 #if USE_SPLIT_PTE_PTLOCKS
 1636 #if ALLOC_SPLIT_PTLOCKS
 1637 void __init ptlock_cache_init(void);
 1638 extern bool ptlock_alloc(struct page *page);
 1639 extern void ptlock_free(struct page *page);
 1640 
 1641 static inline spinlock_t *ptlock_ptr(struct page *page)
 1642 {
 1643 	return page->ptl;
 1644 }
 1645 #else /* ALLOC_SPLIT_PTLOCKS */
 1646 static inline void ptlock_cache_init(void)
 1647 {
 1648 }
 1649 
 1650 static inline bool ptlock_alloc(struct page *page)
 1651 {
 1652 	return true;
 1653 }
 1654 
 1655 static inline void ptlock_free(struct page *page)
 1656 {
 1657 }
 1658 
 1659 static inline spinlock_t *ptlock_ptr(struct page *page)
 1660 {
 1661 	return &page->ptl;
 1662 }
 1663 #endif /* ALLOC_SPLIT_PTLOCKS */
 1664 
 1665 static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd)
 1666 {
 1667 	return ptlock_ptr(pmd_page(*pmd));
 1668 }
 1669 
 1670 static inline bool ptlock_init(struct page *page)
 1671 {
 1672 	/*
 1673 	 * prep_new_page() initialize page->private (and therefore page->ptl)
 1674 	 * with 0. Make sure nobody took it in use in between.
 1675 	 *
 1676 	 * It can happen if arch try to use slab for page table allocation:
 1677 	 * slab code uses page->slab_cache, which share storage with page->ptl.
 1678 	 */
 1679 	VM_BUG_ON_PAGE(*(unsigned long *)&page->ptl, page);
 1680 	if (!ptlock_alloc(page))
 1681 		return false;
 1682 	spin_lock_init(ptlock_ptr(page));
 1683 	return true;
 1684 }
 1685 
 1686 /* Reset page->mapping so free_pages_check won't complain. */
 1687 static inline void pte_lock_deinit(struct page *page)
 1688 {
 1689 	page->mapping = NULL;
 1690 	ptlock_free(page);
 1691 }
 1692 
 1693 #else	/* !USE_SPLIT_PTE_PTLOCKS */
 1694 /*
 1695  * We use mm->page_table_lock to guard all pagetable pages of the mm.
 1696  */
 1697 static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd)
 1698 {
 1699 	return &mm->page_table_lock;
 1700 }
 1701 static inline void ptlock_cache_init(void) {}
 1702 static inline bool ptlock_init(struct page *page) { return true; }
 1703 static inline void pte_lock_deinit(struct page *page) {}
 1704 #endif /* USE_SPLIT_PTE_PTLOCKS */
 1705 
 1706 static inline void pgtable_init(void)
 1707 {
 1708 	ptlock_cache_init();
 1709 	pgtable_cache_init();
 1710 }
 1711 
 1712 static inline bool pgtable_page_ctor(struct page *page)
 1713 {
 1714 	if (!ptlock_init(page))
 1715 		return false;
 1716 	inc_zone_page_state(page, NR_PAGETABLE);
 1717 	return true;
 1718 }
 1719 
 1720 static inline void pgtable_page_dtor(struct page *page)
 1721 {
 1722 	pte_lock_deinit(page);
 1723 	dec_zone_page_state(page, NR_PAGETABLE);
 1724 }
 1725 
 1726 #define pte_offset_map_lock(mm, pmd, address, ptlp)	\
 1727 ({							\
 1728 	spinlock_t *__ptl = pte_lockptr(mm, pmd);	\
 1729 	pte_t *__pte = pte_offset_map(pmd, address);	\
 1730 	*(ptlp) = __ptl;				\
 1731 	spin_lock(__ptl);				\
 1732 	__pte;						\
 1733 })
 1734 
 1735 #define pte_unmap_unlock(pte, ptl)	do {		\
 1736 	spin_unlock(ptl);				\
 1737 	pte_unmap(pte);					\
 1738 } while (0)
 1739 
 1740 #define pte_alloc(mm, pmd, address)			\
 1741 	(unlikely(pmd_none(*(pmd))) && __pte_alloc(mm, pmd, address))
 1742 
 1743 #define pte_alloc_map(mm, pmd, address)			\
 1744 	(pte_alloc(mm, pmd, address) ? NULL : pte_offset_map(pmd, address))
 1745 
 1746 #define pte_alloc_map_lock(mm, pmd, address, ptlp)	\
 1747 	(pte_alloc(mm, pmd, address) ?			\
 1748 		 NULL : pte_offset_map_lock(mm, pmd, address, ptlp))
 1749 
 1750 #define pte_alloc_kernel(pmd, address)			\
 1751 	((unlikely(pmd_none(*(pmd))) && __pte_alloc_kernel(pmd, address))? \
 1752 		NULL: pte_offset_kernel(pmd, address))
 1753 
 1754 #if USE_SPLIT_PMD_PTLOCKS
 1755 
 1756 static struct page *pmd_to_page(pmd_t *pmd)
 1757 {
 1758 	unsigned long mask = ~(PTRS_PER_PMD * sizeof(pmd_t) - 1);
 1759 	return virt_to_page((void *)((unsigned long) pmd & mask));
 1760 }
 1761 
 1762 static inline spinlock_t *pmd_lockptr(struct mm_struct *mm, pmd_t *pmd)
 1763 {
 1764 	return ptlock_ptr(pmd_to_page(pmd));
 1765 }
 1766 
 1767 static inline bool pgtable_pmd_page_ctor(struct page *page)
 1768 {
 1769 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 1770 	page->pmd_huge_pte = NULL;
 1771 #endif
 1772 	return ptlock_init(page);
 1773 }
 1774 
 1775 static inline void pgtable_pmd_page_dtor(struct page *page)
 1776 {
 1777 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 1778 	VM_BUG_ON_PAGE(page->pmd_huge_pte, page);
 1779 #endif
 1780 	ptlock_free(page);
 1781 }
 1782 
 1783 #define pmd_huge_pte(mm, pmd) (pmd_to_page(pmd)->pmd_huge_pte)
 1784 
 1785 #else
 1786 
 1787 static inline spinlock_t *pmd_lockptr(struct mm_struct *mm, pmd_t *pmd)
 1788 {
 1789 	return &mm->page_table_lock;
 1790 }
 1791 
 1792 static inline bool pgtable_pmd_page_ctor(struct page *page) { return true; }
 1793 static inline void pgtable_pmd_page_dtor(struct page *page) {}
 1794 
 1795 #define pmd_huge_pte(mm, pmd) ((mm)->pmd_huge_pte)
 1796 
 1797 #endif
 1798 
 1799 static inline spinlock_t *pmd_lock(struct mm_struct *mm, pmd_t *pmd)
 1800 {
 1801 	spinlock_t *ptl = pmd_lockptr(mm, pmd);
 1802 	spin_lock(ptl);
 1803 	return ptl;
 1804 }
 1805 
 1806 /*
 1807  * No scalability reason to split PUD locks yet, but follow the same pattern
 1808  * as the PMD locks to make it easier if we decide to.  The VM should not be
 1809  * considered ready to switch to split PUD locks yet; there may be places
 1810  * which need to be converted from page_table_lock.
 1811  */
 1812 static inline spinlock_t *pud_lockptr(struct mm_struct *mm, pud_t *pud)
 1813 {
 1814 	return &mm->page_table_lock;
 1815 }
 1816 
 1817 static inline spinlock_t *pud_lock(struct mm_struct *mm, pud_t *pud)
 1818 {
 1819 	spinlock_t *ptl = pud_lockptr(mm, pud);
 1820 
 1821 	spin_lock(ptl);
 1822 	return ptl;
 1823 }
 1824 
 1825 extern void __init pagecache_init(void);
 1826 extern void free_area_init(unsigned long * zones_size);
 1827 extern void free_area_init_node(int nid, unsigned long * zones_size,
 1828 		unsigned long zone_start_pfn, unsigned long *zholes_size);
 1829 extern void free_initmem(void);
 1830 
 1831 /*
 1832  * Free reserved pages within range [PAGE_ALIGN(start), end & PAGE_MASK)
 1833  * into the buddy system. The freed pages will be poisoned with pattern
 1834  * "poison" if it's within range [0, UCHAR_MAX].
 1835  * Return pages freed into the buddy system.
 1836  */
 1837 extern unsigned long free_reserved_area(void *start, void *end,
 1838 					int poison, char *s);
 1839 
 1840 #ifdef	CONFIG_HIGHMEM
 1841 /*
 1842  * Free a highmem page into the buddy system, adjusting totalhigh_pages
 1843  * and totalram_pages.
 1844  */
 1845 extern void free_highmem_page(struct page *page);
 1846 #endif
 1847 
 1848 extern void adjust_managed_page_count(struct page *page, long count);
 1849 extern void mem_init_print_info(const char *str);
 1850 
 1851 extern void reserve_bootmem_region(phys_addr_t start, phys_addr_t end);
 1852 
 1853 /* Free the reserved page into the buddy system, so it gets managed. */
 1854 static inline void __free_reserved_page(struct page *page)
 1855 {
 1856 	ClearPageReserved(page);
 1857 	init_page_count(page);
 1858 	__free_page(page);
 1859 }
 1860 
 1861 static inline void free_reserved_page(struct page *page)
 1862 {
 1863 	__free_reserved_page(page);
 1864 	adjust_managed_page_count(page, 1);
 1865 }
 1866 
 1867 static inline void mark_page_reserved(struct page *page)
 1868 {
 1869 	SetPageReserved(page);
 1870 	adjust_managed_page_count(page, -1);
 1871 }
 1872 
 1873 /*
 1874  * Default method to free all the __init memory into the buddy system.
 1875  * The freed pages will be poisoned with pattern "poison" if it's within
 1876  * range [0, UCHAR_MAX].
 1877  * Return pages freed into the buddy system.
 1878  */
 1879 static inline unsigned long free_initmem_default(int poison)
 1880 {
 1881 	extern char __init_begin[], __init_end[];
 1882 
 1883 	return free_reserved_area(&__init_begin, &__init_end,
 1884 				  poison, "unused kernel");
 1885 }
 1886 
 1887 static inline unsigned long get_num_physpages(void)
 1888 {
 1889 	int nid;
 1890 	unsigned long phys_pages = 0;
 1891 
 1892 	for_each_online_node(nid)
 1893 		phys_pages += node_present_pages(nid);
 1894 
 1895 	return phys_pages;
 1896 }
 1897 
 1898 #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
 1899 /*
 1900  * With CONFIG_HAVE_MEMBLOCK_NODE_MAP set, an architecture may initialise its
 1901  * zones, allocate the backing mem_map and account for memory holes in a more
 1902  * architecture independent manner. This is a substitute for creating the
 1903  * zone_sizes[] and zholes_size[] arrays and passing them to
 1904  * free_area_init_node()
 1905  *
 1906  * An architecture is expected to register range of page frames backed by
 1907  * physical memory with memblock_add[_node]() before calling
 1908  * free_area_init_nodes() passing in the PFN each zone ends at. At a basic
 1909  * usage, an architecture is expected to do something like
 1910  *
 1911  * unsigned long max_zone_pfns[MAX_NR_ZONES] = {max_dma, max_normal_pfn,
 1912  * 							 max_highmem_pfn};
 1913  * for_each_valid_physical_page_range()
 1914  * 	memblock_add_node(base, size, nid)
 1915  * free_area_init_nodes(max_zone_pfns);
 1916  *
 1917  * free_bootmem_with_active_regions() calls free_bootmem_node() for each
 1918  * registered physical page range.  Similarly
 1919  * sparse_memory_present_with_active_regions() calls memory_present() for
 1920  * each range when SPARSEMEM is enabled.
 1921  *
 1922  * See mm/page_alloc.c for more information on each function exposed by
 1923  * CONFIG_HAVE_MEMBLOCK_NODE_MAP.
 1924  */
 1925 extern void free_area_init_nodes(unsigned long *max_zone_pfn);
 1926 unsigned long node_map_pfn_alignment(void);
 1927 unsigned long __absent_pages_in_range(int nid, unsigned long start_pfn,
 1928 						unsigned long end_pfn);
 1929 extern unsigned long absent_pages_in_range(unsigned long start_pfn,
 1930 						unsigned long end_pfn);
 1931 extern void get_pfn_range_for_nid(unsigned int nid,
 1932 			unsigned long *start_pfn, unsigned long *end_pfn);
 1933 extern unsigned long find_min_pfn_with_active_regions(void);
 1934 extern void free_bootmem_with_active_regions(int nid,
 1935 						unsigned long max_low_pfn);
 1936 extern void sparse_memory_present_with_active_regions(int nid);
 1937 
 1938 #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */
 1939 
 1940 #if !defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) && \
 1941     !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID)
 1942 static inline int __early_pfn_to_nid(unsigned long pfn,
 1943 					struct mminit_pfnnid_cache *state)
 1944 {
 1945 	return 0;
 1946 }
 1947 #else
 1948 /* please see mm/page_alloc.c */
 1949 extern int __meminit early_pfn_to_nid(unsigned long pfn);
 1950 /* there is a per-arch backend function. */
 1951 extern int __meminit __early_pfn_to_nid(unsigned long pfn,
 1952 					struct mminit_pfnnid_cache *state);
 1953 #endif
 1954 
 1955 extern void set_dma_reserve(unsigned long new_dma_reserve);
 1956 extern void memmap_init_zone(unsigned long, int, unsigned long,
 1957 				unsigned long, enum memmap_context);
 1958 extern void setup_per_zone_wmarks(void);
 1959 extern int __meminit init_per_zone_wmark_min(void);
 1960 extern void mem_init(void);
 1961 extern void __init mmap_init(void);
 1962 extern void show_mem(unsigned int flags, nodemask_t *nodemask);
 1963 extern long si_mem_available(void);
 1964 extern void si_meminfo(struct sysinfo * val);
 1965 extern void si_meminfo_node(struct sysinfo *val, int nid);
 1966 #ifdef __HAVE_ARCH_RESERVED_KERNEL_PAGES
 1967 extern unsigned long arch_reserved_kernel_pages(void);
 1968 #endif
 1969 
 1970 extern __printf(3, 4)
 1971 void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...);
 1972 
 1973 extern void setup_per_cpu_pageset(void);
 1974 
 1975 extern void zone_pcp_update(struct zone *zone);
 1976 extern void zone_pcp_reset(struct zone *zone);
 1977 
 1978 /* page_alloc.c */
 1979 extern int min_free_kbytes;
 1980 extern int watermark_scale_factor;
 1981 
 1982 /* nommu.c */
 1983 extern atomic_long_t mmap_pages_allocated;
 1984 extern int nommu_shrink_inode_mappings(struct inode *, size_t, size_t);
 1985 
 1986 /* interval_tree.c */
 1987 void vma_interval_tree_insert(struct vm_area_struct *node,
 1988 			      struct rb_root *root);
 1989 void vma_interval_tree_insert_after(struct vm_area_struct *node,
 1990 				    struct vm_area_struct *prev,
 1991 				    struct rb_root *root);
 1992 void vma_interval_tree_remove(struct vm_area_struct *node,
 1993 			      struct rb_root *root);
 1994 struct vm_area_struct *vma_interval_tree_iter_first(struct rb_root *root,
 1995 				unsigned long start, unsigned long last);
 1996 struct vm_area_struct *vma_interval_tree_iter_next(struct vm_area_struct *node,
 1997 				unsigned long start, unsigned long last);
 1998 
 1999 #define vma_interval_tree_foreach(vma, root, start, last)		\
 2000 	for (vma = vma_interval_tree_iter_first(root, start, last);	\
 2001 	     vma; vma = vma_interval_tree_iter_next(vma, start, last))
 2002 
 2003 void anon_vma_interval_tree_insert(struct anon_vma_chain *node,
 2004 				   struct rb_root *root);
 2005 void anon_vma_interval_tree_remove(struct anon_vma_chain *node,
 2006 				   struct rb_root *root);
 2007 struct anon_vma_chain *anon_vma_interval_tree_iter_first(
 2008 	struct rb_root *root, unsigned long start, unsigned long last);
 2009 struct anon_vma_chain *anon_vma_interval_tree_iter_next(
 2010 	struct anon_vma_chain *node, unsigned long start, unsigned long last);
 2011 #ifdef CONFIG_DEBUG_VM_RB
 2012 void anon_vma_interval_tree_verify(struct anon_vma_chain *node);
 2013 #endif
 2014 
 2015 #define anon_vma_interval_tree_foreach(avc, root, start, last)		 \
 2016 	for (avc = anon_vma_interval_tree_iter_first(root, start, last); \
 2017 	     avc; avc = anon_vma_interval_tree_iter_next(avc, start, last))
 2018 
 2019 /* mmap.c */
 2020 extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin);
 2021 extern int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
 2022 	unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert,
 2023 	struct vm_area_struct *expand);
 2024 static inline int vma_adjust(struct vm_area_struct *vma, unsigned long start,
 2025 	unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert)
 2026 {
 2027 	return __vma_adjust(vma, start, end, pgoff, insert, NULL);
 2028 }
 2029 extern struct vm_area_struct *vma_merge(struct mm_struct *,
 2030 	struct vm_area_struct *prev, unsigned long addr, unsigned long end,
 2031 	unsigned long vm_flags, struct anon_vma *, struct file *, pgoff_t,
 2032 	struct mempolicy *, struct vm_userfaultfd_ctx);
 2033 extern struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *);
 2034 extern int __split_vma(struct mm_struct *, struct vm_area_struct *,
 2035 	unsigned long addr, int new_below);
 2036 extern int split_vma(struct mm_struct *, struct vm_area_struct *,
 2037 	unsigned long addr, int new_below);
 2038 extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
 2039 extern void __vma_link_rb(struct mm_struct *, struct vm_area_struct *,
 2040 	struct rb_node **, struct rb_node *);
 2041 extern void unlink_file_vma(struct vm_area_struct *);
 2042 extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
 2043 	unsigned long addr, unsigned long len, pgoff_t pgoff,
 2044 	bool *need_rmap_locks);
 2045 extern void exit_mmap(struct mm_struct *);
 2046 
 2047 static inline int check_data_rlimit(unsigned long rlim,
 2048 				    unsigned long new,
 2049 				    unsigned long start,
 2050 				    unsigned long end_data,
 2051 				    unsigned long start_data)
 2052 {
 2053 	if (rlim < RLIM_INFINITY) {
 2054 		if (((new - start) + (end_data - start_data)) > rlim)
 2055 			return -ENOSPC;
 2056 	}
 2057 
 2058 	return 0;
 2059 }
 2060 
 2061 extern int mm_take_all_locks(struct mm_struct *mm);
 2062 extern void mm_drop_all_locks(struct mm_struct *mm);
 2063 
 2064 extern void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file);
 2065 extern struct file *get_mm_exe_file(struct mm_struct *mm);
 2066 extern struct file *get_task_exe_file(struct task_struct *task);
 2067 
 2068 extern bool may_expand_vm(struct mm_struct *, vm_flags_t, unsigned long npages);
 2069 extern void vm_stat_account(struct mm_struct *, vm_flags_t, long npages);
 2070 
 2071 extern bool vma_is_special_mapping(const struct vm_area_struct *vma,
 2072 				   const struct vm_special_mapping *sm);
 2073 extern struct vm_area_struct *_install_special_mapping(struct mm_struct *mm,
 2074 				   unsigned long addr, unsigned long len,
 2075 				   unsigned long flags,
 2076 				   const struct vm_special_mapping *spec);
 2077 /* This is an obsolete alternative to _install_special_mapping. */
 2078 extern int install_special_mapping(struct mm_struct *mm,
 2079 				   unsigned long addr, unsigned long len,
 2080 				   unsigned long flags, struct page **pages);
 2081 
 2082 extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
 2083 
 2084 extern unsigned long mmap_region(struct file *file, unsigned long addr,
 2085 	unsigned long len, vm_flags_t vm_flags, unsigned long pgoff,
 2086 	struct list_head *uf);
 2087 extern unsigned long do_mmap(struct file *file, unsigned long addr,
 2088 	unsigned long len, unsigned long prot, unsigned long flags,
 2089 	vm_flags_t vm_flags, unsigned long pgoff, unsigned long *populate,
 2090 	struct list_head *uf);
 2091 extern int do_munmap(struct mm_struct *, unsigned long, size_t,
 2092 		     struct list_head *uf);
 2093 
 2094 static inline unsigned long
 2095 do_mmap_pgoff(struct file *file, unsigned long addr,
 2096 	unsigned long len, unsigned long prot, unsigned long flags,
 2097 	unsigned long pgoff, unsigned long *populate,
 2098 	struct list_head *uf)
 2099 {
 2100 	return do_mmap(file, addr, len, prot, flags, 0, pgoff, populate, uf);
 2101 }
 2102 
 2103 #ifdef CONFIG_MMU
 2104 extern int __mm_populate(unsigned long addr, unsigned long len,
 2105 			 int ignore_errors);
 2106 static inline void mm_populate(unsigned long addr, unsigned long len)
 2107 {
 2108 	/* Ignore errors */
 2109 	(void) __mm_populate(addr, len, 1);
 2110 }
 2111 #else
 2112 static inline void mm_populate(unsigned long addr, unsigned long len) {}
 2113 #endif
 2114 
 2115 /* These take the mm semaphore themselves */
 2116 extern int __must_check vm_brk(unsigned long, unsigned long);
 2117 extern int __must_check vm_brk_flags(unsigned long, unsigned long, unsigned long);
 2118 extern int vm_munmap(unsigned long, size_t);
 2119 extern unsigned long __must_check vm_mmap(struct file *, unsigned long,
 2120         unsigned long, unsigned long,
 2121         unsigned long, unsigned long);
 2122 
 2123 struct vm_unmapped_area_info {
 2124 #define VM_UNMAPPED_AREA_TOPDOWN 1
 2125 	unsigned long flags;
 2126 	unsigned long length;
 2127 	unsigned long low_limit;
 2128 	unsigned long high_limit;
 2129 	unsigned long align_mask;
 2130 	unsigned long align_offset;
 2131 };
 2132 
 2133 extern unsigned long unmapped_area(struct vm_unmapped_area_info *info);
 2134 extern unsigned long unmapped_area_topdown(struct vm_unmapped_area_info *info);
 2135 
 2136 /*
 2137  * Search for an unmapped address range.
 2138  *
 2139  * We are looking for a range that:
 2140  * - does not intersect with any VMA;
 2141  * - is contained within the [low_limit, high_limit) interval;
 2142  * - is at least the desired size.
 2143  * - satisfies (begin_addr & align_mask) == (align_offset & align_mask)
 2144  */
 2145 static inline unsigned long
 2146 vm_unmapped_area(struct vm_unmapped_area_info *info)
 2147 {
 2148 	if (info->flags & VM_UNMAPPED_AREA_TOPDOWN)
 2149 		return unmapped_area_topdown(info);
 2150 	else
 2151 		return unmapped_area(info);
 2152 }
 2153 
 2154 /* truncate.c */
 2155 extern void truncate_inode_pages(struct address_space *, loff_t);
 2156 extern void truncate_inode_pages_range(struct address_space *,
 2157 				       loff_t lstart, loff_t lend);
 2158 extern void truncate_inode_pages_final(struct address_space *);
 2159 
 2160 /* generic vm_area_ops exported for stackable file systems */
 2161 extern int filemap_fault(struct vm_fault *vmf);
 2162 extern void filemap_map_pages(struct vm_fault *vmf,
 2163 		pgoff_t start_pgoff, pgoff_t end_pgoff);
 2164 extern int filemap_page_mkwrite(struct vm_fault *vmf);
 2165 
 2166 /* mm/page-writeback.c */
 2167 int write_one_page(struct page *page, int wait);
 2168 void task_dirty_inc(struct task_struct *tsk);
 2169 
 2170 /* readahead.c */
 2171 #define VM_MAX_READAHEAD	128	/* kbytes */
 2172 #define VM_MIN_READAHEAD	16	/* kbytes (includes current page) */
 2173 
 2174 int force_page_cache_readahead(struct address_space *mapping, struct file *filp,
 2175 			pgoff_t offset, unsigned long nr_to_read);
 2176 
 2177 void page_cache_sync_readahead(struct address_space *mapping,
 2178 			       struct file_ra_state *ra,
 2179 			       struct file *filp,
 2180 			       pgoff_t offset,
 2181 			       unsigned long size);
 2182 
 2183 void page_cache_async_readahead(struct address_space *mapping,
 2184 				struct file_ra_state *ra,
 2185 				struct file *filp,
 2186 				struct page *pg,
 2187 				pgoff_t offset,
 2188 				unsigned long size);
 2189 
 2190 /* Generic expand stack which grows the stack according to GROWS{UP,DOWN} */
 2191 extern int expand_stack(struct vm_area_struct *vma, unsigned long address);
 2192 
 2193 /* CONFIG_STACK_GROWSUP still needs to to grow downwards at some places */
 2194 extern int expand_downwards(struct vm_area_struct *vma,
 2195 		unsigned long address);
 2196 #if VM_GROWSUP
 2197 extern int expand_upwards(struct vm_area_struct *vma, unsigned long address);
 2198 #else
 2199   #define expand_upwards(vma, address) (0)
 2200 #endif
 2201 
 2202 /* Look up the first VMA which satisfies  addr < vm_end,  NULL if none. */
 2203 extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
 2204 extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
 2205 					     struct vm_area_struct **pprev);
 2206 
 2207 /* Look up the first VMA which intersects the interval start_addr..end_addr-1,
 2208    NULL if none.  Assume start_addr < end_addr. */
 2209 static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
 2210 {
 2211 	struct vm_area_struct * vma = find_vma(mm,start_addr);
 2212 
 2213 	if (vma && end_addr <= vma->vm_start)
 2214 		vma = NULL;
 2215 	return vma;
 2216 }
 2217 
 2218 static inline unsigned long vma_pages(struct vm_area_struct *vma)
 2219 {
 2220 	return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
 2221 }
 2222 
 2223 /* Look up the first VMA which exactly match the interval vm_start ... vm_end */
 2224 static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm,
 2225 				unsigned long vm_start, unsigned long vm_end)
 2226 {
 2227 	struct vm_area_struct *vma = find_vma(mm, vm_start);
 2228 
 2229 	if (vma && (vma->vm_start != vm_start || vma->vm_end != vm_end))
 2230 		vma = NULL;
 2231 
 2232 	return vma;
 2233 }
 2234 
 2235 #ifdef CONFIG_MMU
 2236 pgprot_t vm_get_page_prot(unsigned long vm_flags);
 2237 void vma_set_page_prot(struct vm_area_struct *vma);
 2238 #else
 2239 static inline pgprot_t vm_get_page_prot(unsigned long vm_flags)
 2240 {
 2241 	return __pgprot(0);
 2242 }
 2243 static inline void vma_set_page_prot(struct vm_area_struct *vma)
 2244 {
 2245 	vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
 2246 }
 2247 #endif
 2248 
 2249 #ifdef CONFIG_NUMA_BALANCING
 2250 unsigned long change_prot_numa(struct vm_area_struct *vma,
 2251 			unsigned long start, unsigned long end);
 2252 #endif
 2253 
 2254 struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
 2255 int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
 2256 			unsigned long pfn, unsigned long size, pgprot_t);
 2257 int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *);
 2258 int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
 2259 			unsigned long pfn);
 2260 int vm_insert_pfn_prot(struct vm_area_struct *vma, unsigned long addr,
 2261 			unsigned long pfn, pgprot_t pgprot);
 2262 int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,
 2263 			pfn_t pfn);
 2264 int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len);
 2265 
 2266 
 2267 struct page *follow_page_mask(struct vm_area_struct *vma,
 2268 			      unsigned long address, unsigned int foll_flags,
 2269 			      unsigned int *page_mask);
 2270 
 2271 static inline struct page *follow_page(struct vm_area_struct *vma,
 2272 		unsigned long address, unsigned int foll_flags)
 2273 {
 2274 	unsigned int unused_page_mask;
 2275 	return follow_page_mask(vma, address, foll_flags, &unused_page_mask);
 2276 }
 2277 
 2278 #define FOLL_WRITE	0x01	/* check pte is writable */
 2279 #define FOLL_TOUCH	0x02	/* mark page accessed */
 2280 #define FOLL_GET	0x04	/* do get_page on page */
 2281 #define FOLL_DUMP	0x08	/* give error on hole if it would be zero */
 2282 #define FOLL_FORCE	0x10	/* get_user_pages read/write w/o permission */
 2283 #define FOLL_NOWAIT	0x20	/* if a disk transfer is needed, start the IO
 2284 				 * and return without waiting upon it */
 2285 #define FOLL_POPULATE	0x40	/* fault in page */
 2286 #define FOLL_SPLIT	0x80	/* don't return transhuge pages, split them */
 2287 #define FOLL_HWPOISON	0x100	/* check page is hwpoisoned */
 2288 #define FOLL_NUMA	0x200	/* force NUMA hinting page fault */
 2289 #define FOLL_MIGRATION	0x400	/* wait for page to replace migration entry */
 2290 #define FOLL_TRIED	0x800	/* a retry, previous pass started an IO */
 2291 #define FOLL_MLOCK	0x1000	/* lock present pages */
 2292 #define FOLL_REMOTE	0x2000	/* we are working on non-current tsk/mm */
 2293 #define FOLL_COW	0x4000	/* internal GUP flag */
 2294 
 2295 typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr,
 2296 			void *data);
 2297 extern int apply_to_page_range(struct mm_struct *mm, unsigned long address,
 2298 			       unsigned long size, pte_fn_t fn, void *data);
 2299 
 2300 
 2301 #ifdef CONFIG_PAGE_POISONING
 2302 extern bool page_poisoning_enabled(void);
 2303 extern void kernel_poison_pages(struct page *page, int numpages, int enable);
 2304 extern bool page_is_poisoned(struct page *page);
 2305 #else
 2306 static inline bool page_poisoning_enabled(void) { return false; }
 2307 static inline void kernel_poison_pages(struct page *page, int numpages,
 2308 					int enable) { }
 2309 static inline bool page_is_poisoned(struct page *page) { return false; }
 2310 #endif
 2311 
 2312 #ifdef CONFIG_DEBUG_PAGEALLOC
 2313 extern bool _debug_pagealloc_enabled;
 2314 extern void __kernel_map_pages(struct page *page, int numpages, int enable);
 2315 
 2316 static inline bool debug_pagealloc_enabled(void)
 2317 {
 2318 	return _debug_pagealloc_enabled;
 2319 }
 2320 
 2321 static inline void
 2322 kernel_map_pages(struct page *page, int numpages, int enable)
 2323 {
 2324 	if (!debug_pagealloc_enabled())
 2325 		return;
 2326 
 2327 	__kernel_map_pages(page, numpages, enable);
 2328 }
 2329 #ifdef CONFIG_HIBERNATION
 2330 extern bool kernel_page_present(struct page *page);
 2331 #endif	/* CONFIG_HIBERNATION */
 2332 #else	/* CONFIG_DEBUG_PAGEALLOC */
 2333 static inline void
 2334 kernel_map_pages(struct page *page, int numpages, int enable) {}
 2335 #ifdef CONFIG_HIBERNATION
 2336 static inline bool kernel_page_present(struct page *page) { return true; }
 2337 #endif	/* CONFIG_HIBERNATION */
 2338 static inline bool debug_pagealloc_enabled(void)
 2339 {
 2340 	return false;
 2341 }
 2342 #endif	/* CONFIG_DEBUG_PAGEALLOC */
 2343 
 2344 #ifdef __HAVE_ARCH_GATE_AREA
 2345 extern struct vm_area_struct *get_gate_vma(struct mm_struct *mm);
 2346 extern int in_gate_area_no_mm(unsigned long addr);
 2347 extern int in_gate_area(struct mm_struct *mm, unsigned long addr);
 2348 #else
 2349 static inline struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
 2350 {
 2351 	return NULL;
 2352 }
 2353 static inline int in_gate_area_no_mm(unsigned long addr) { return 0; }
 2354 static inline int in_gate_area(struct mm_struct *mm, unsigned long addr)
 2355 {
 2356 	return 0;
 2357 }
 2358 #endif	/* __HAVE_ARCH_GATE_AREA */
 2359 
 2360 extern bool process_shares_mm(struct task_struct *p, struct mm_struct *mm);
 2361 
 2362 #ifdef CONFIG_SYSCTL
 2363 extern int sysctl_drop_caches;
 2364 int drop_caches_sysctl_handler(struct ctl_table *, int,
 2365 					void __user *, size_t *, loff_t *);
 2366 #endif
 2367 
 2368 void drop_slab(void);
 2369 void drop_slab_node(int nid);
 2370 
 2371 #ifndef CONFIG_MMU
 2372 #define randomize_va_space 0
 2373 #else
 2374 extern int randomize_va_space;
 2375 #endif
 2376 
 2377 const char * arch_vma_name(struct vm_area_struct *vma);
 2378 void print_vma_addr(char *prefix, unsigned long rip);
 2379 
 2380 void sparse_mem_maps_populate_node(struct page **map_map,
 2381 				   unsigned long pnum_begin,
 2382 				   unsigned long pnum_end,
 2383 				   unsigned long map_count,
 2384 				   int nodeid);
 2385 
 2386 struct page *sparse_mem_map_populate(unsigned long pnum, int nid);
 2387 pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);
 2388 pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node);
 2389 pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node);
 2390 pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node);
 2391 void *vmemmap_alloc_block(unsigned long size, int node);
 2392 struct vmem_altmap;
 2393 void *__vmemmap_alloc_block_buf(unsigned long size, int node,
 2394 		struct vmem_altmap *altmap);
 2395 static inline void *vmemmap_alloc_block_buf(unsigned long size, int node)
 2396 {
 2397 	return __vmemmap_alloc_block_buf(size, node, NULL);
 2398 }
 2399 
 2400 void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
 2401 int vmemmap_populate_basepages(unsigned long start, unsigned long end,
 2402 			       int node);
 2403 int vmemmap_populate(unsigned long start, unsigned long end, int node);
 2404 void vmemmap_populate_print_last(void);
 2405 #ifdef CONFIG_MEMORY_HOTPLUG
 2406 void vmemmap_free(unsigned long start, unsigned long end);
 2407 #endif
 2408 void register_page_bootmem_memmap(unsigned long section_nr, struct page *map,
 2409 				  unsigned long size);
 2410 
 2411 enum mf_flags {
 2412 	MF_COUNT_INCREASED = 1 << 0,
 2413 	MF_ACTION_REQUIRED = 1 << 1,
 2414 	MF_MUST_KILL = 1 << 2,
 2415 	MF_SOFT_OFFLINE = 1 << 3,
 2416 };
 2417 extern int memory_failure(unsigned long pfn, int trapno, int flags);
 2418 extern void memory_failure_queue(unsigned long pfn, int trapno, int flags);
 2419 extern int unpoison_memory(unsigned long pfn);
 2420 extern int get_hwpoison_page(struct page *page);
 2421 #define put_hwpoison_page(page)	put_page(page)
 2422 extern int sysctl_memory_failure_early_kill;
 2423 extern int sysctl_memory_failure_recovery;
 2424 extern void shake_page(struct page *p, int access);
 2425 extern atomic_long_t num_poisoned_pages;
 2426 extern int soft_offline_page(struct page *page, int flags);
 2427 
 2428 
 2429 /*
 2430  * Error handlers for various types of pages.
 2431  */
 2432 enum mf_result {
 2433 	MF_IGNORED,	/* Error: cannot be handled */
 2434 	MF_FAILED,	/* Error: handling failed */
 2435 	MF_DELAYED,	/* Will be handled later */
 2436 	MF_RECOVERED,	/* Successfully recovered */
 2437 };
 2438 
 2439 enum mf_action_page_type {
 2440 	MF_MSG_KERNEL,
 2441 	MF_MSG_KERNEL_HIGH_ORDER,
 2442 	MF_MSG_SLAB,
 2443 	MF_MSG_DIFFERENT_COMPOUND,
 2444 	MF_MSG_POISONED_HUGE,
 2445 	MF_MSG_HUGE,
 2446 	MF_MSG_FREE_HUGE,
 2447 	MF_MSG_UNMAP_FAILED,
 2448 	MF_MSG_DIRTY_SWAPCACHE,
 2449 	MF_MSG_CLEAN_SWAPCACHE,
 2450 	MF_MSG_DIRTY_MLOCKED_LRU,
 2451 	MF_MSG_CLEAN_MLOCKED_LRU,
 2452 	MF_MSG_DIRTY_UNEVICTABLE_LRU,
 2453 	MF_MSG_CLEAN_UNEVICTABLE_LRU,
 2454 	MF_MSG_DIRTY_LRU,
 2455 	MF_MSG_CLEAN_LRU,
 2456 	MF_MSG_TRUNCATED_LRU,
 2457 	MF_MSG_BUDDY,
 2458 	MF_MSG_BUDDY_2ND,
 2459 	MF_MSG_UNKNOWN,
 2460 };
 2461 
 2462 #if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_HUGETLBFS)
 2463 extern void clear_huge_page(struct page *page,
 2464 			    unsigned long addr,
 2465 			    unsigned int pages_per_huge_page);
 2466 extern void copy_user_huge_page(struct page *dst, struct page *src,
 2467 				unsigned long addr, struct vm_area_struct *vma,
 2468 				unsigned int pages_per_huge_page);
 2469 extern long copy_huge_page_from_user(struct page *dst_page,
 2470 				const void __user *usr_src,
 2471 				unsigned int pages_per_huge_page,
 2472 				bool allow_pagefault);
 2473 #endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */
 2474 
 2475 extern struct page_ext_operations debug_guardpage_ops;
 2476 extern struct page_ext_operations page_poisoning_ops;
 2477 
 2478 #ifdef CONFIG_DEBUG_PAGEALLOC
 2479 extern unsigned int _debug_guardpage_minorder;
 2480 extern bool _debug_guardpage_enabled;
 2481 
 2482 static inline unsigned int debug_guardpage_minorder(void)
 2483 {
 2484 	return _debug_guardpage_minorder;
 2485 }
 2486 
 2487 static inline bool debug_guardpage_enabled(void)
 2488 {
 2489 	return _debug_guardpage_enabled;
 2490 }
 2491 
 2492 static inline bool page_is_guard(struct page *page)
 2493 {
 2494 	struct page_ext *page_ext;
 2495 
 2496 	if (!debug_guardpage_enabled())
 2497 		return false;
 2498 
 2499 	page_ext = lookup_page_ext(page);
 2500 	if (unlikely(!page_ext))
 2501 		return false;
 2502 
 2503 	return test_bit(PAGE_EXT_DEBUG_GUARD, &page_ext->flags);
 2504 }
 2505 #else
 2506 static inline unsigned int debug_guardpage_minorder(void) { return 0; }
 2507 static inline bool debug_guardpage_enabled(void) { return false; }
 2508 static inline bool page_is_guard(struct page *page) { return false; }
 2509 #endif /* CONFIG_DEBUG_PAGEALLOC */
 2510 
 2511 #if MAX_NUMNODES > 1
 2512 void __init setup_nr_node_ids(void);
 2513 #else
 2514 static inline void setup_nr_node_ids(void) {}
 2515 #endif
 2516 
 2517 #endif /* __KERNEL__ */
 2518 #endif /* _LINUX_MM_H */                 1 #ifndef __LINUX_SPINLOCK_H
    2 #define __LINUX_SPINLOCK_H
    3 
    4 /*
    5  * include/linux/spinlock.h - generic spinlock/rwlock declarations
    6  *
    7  * here's the role of the various spinlock/rwlock related include files:
    8  *
    9  * on SMP builds:
   10  *
   11  *  asm/spinlock_types.h: contains the arch_spinlock_t/arch_rwlock_t and the
   12  *                        initializers
   13  *
   14  *  linux/spinlock_types.h:
   15  *                        defines the generic type and initializers
   16  *
   17  *  asm/spinlock.h:       contains the arch_spin_*()/etc. lowlevel
   18  *                        implementations, mostly inline assembly code
   19  *
   20  *   (also included on UP-debug builds:)
   21  *
   22  *  linux/spinlock_api_smp.h:
   23  *                        contains the prototypes for the _spin_*() APIs.
   24  *
   25  *  linux/spinlock.h:     builds the final spin_*() APIs.
   26  *
   27  * on UP builds:
   28  *
   29  *  linux/spinlock_type_up.h:
   30  *                        contains the generic, simplified UP spinlock type.
   31  *                        (which is an empty structure on non-debug builds)
   32  *
   33  *  linux/spinlock_types.h:
   34  *                        defines the generic type and initializers
   35  *
   36  *  linux/spinlock_up.h:
   37  *                        contains the arch_spin_*()/etc. version of UP
   38  *                        builds. (which are NOPs on non-debug, non-preempt
   39  *                        builds)
   40  *
   41  *   (included on UP-non-debug builds:)
   42  *
   43  *  linux/spinlock_api_up.h:
   44  *                        builds the _spin_*() APIs.
   45  *
   46  *  linux/spinlock.h:     builds the final spin_*() APIs.
   47  */
   48 
   49 #include <linux/typecheck.h>
   50 #include <linux/preempt.h>
   51 #include <linux/linkage.h>
   52 #include <linux/compiler.h>
   53 #include <linux/irqflags.h>
   54 #include <linux/thread_info.h>
   55 #include <linux/kernel.h>
   56 #include <linux/stringify.h>
   57 #include <linux/bottom_half.h>
   58 #include <asm/barrier.h>
   59 
   60 
   61 /*
   62  * Must define these before including other files, inline functions need them
   63  */
   64 #define LOCK_SECTION_NAME ".text..lock."KBUILD_BASENAME
   65 
   66 #define LOCK_SECTION_START(extra)               \
   67         ".subsection 1\n\t"                     \
   68         extra                                   \
   69         ".ifndef " LOCK_SECTION_NAME "\n\t"     \
   70         LOCK_SECTION_NAME ":\n\t"               \
   71         ".endif\n"
   72 
   73 #define LOCK_SECTION_END                        \
   74         ".previous\n\t"
   75 
   76 #define __lockfunc __attribute__((section(".spinlock.text")))
   77 
   78 /*
   79  * Pull the arch_spinlock_t and arch_rwlock_t definitions:
   80  */
   81 #include <linux/spinlock_types.h>
   82 
   83 /*
   84  * Pull the arch_spin*() functions/declarations (UP-nondebug doesn't need them):
   85  */
   86 #ifdef CONFIG_SMP
   87 # include <asm/spinlock.h>
   88 #else
   89 # include <linux/spinlock_up.h>
   90 #endif
   91 
   92 #ifdef CONFIG_DEBUG_SPINLOCK
   93   extern void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
   94 				   struct lock_class_key *key);
   95 # define raw_spin_lock_init(lock)				\
   96 do {								\
   97 	static struct lock_class_key __key;			\
   98 								\
   99 	__raw_spin_lock_init((lock), #lock, &__key);		\
  100 } while (0)
  101 
  102 #else
  103 # define raw_spin_lock_init(lock)				\
  104 	do { *(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock); } while (0)
  105 #endif
  106 
  107 #define raw_spin_is_locked(lock)	arch_spin_is_locked(&(lock)->raw_lock)
  108 
  109 #ifdef CONFIG_GENERIC_LOCKBREAK
  110 #define raw_spin_is_contended(lock) ((lock)->break_lock)
  111 #else
  112 
  113 #ifdef arch_spin_is_contended
  114 #define raw_spin_is_contended(lock)	arch_spin_is_contended(&(lock)->raw_lock)
  115 #else
  116 #define raw_spin_is_contended(lock)	(((void)(lock), 0))
  117 #endif /*arch_spin_is_contended*/
  118 #endif
  119 
  120 /*
  121  * Despite its name it doesn't necessarily has to be a full barrier.
  122  * It should only guarantee that a STORE before the critical section
  123  * can not be reordered with LOADs and STOREs inside this section.
  124  * spin_lock() is the one-way barrier, this LOAD can not escape out
  125  * of the region. So the default implementation simply ensures that
  126  * a STORE can not move into the critical section, smp_wmb() should
  127  * serialize it with another STORE done by spin_lock().
  128  */
  129 #ifndef smp_mb__before_spinlock
  130 #define smp_mb__before_spinlock()	smp_wmb()
  131 #endif
  132 
  133 /**
  134  * raw_spin_unlock_wait - wait until the spinlock gets unlocked
  135  * @lock: the spinlock in question.
  136  */
  137 #define raw_spin_unlock_wait(lock)	arch_spin_unlock_wait(&(lock)->raw_lock)
  138 
  139 #ifdef CONFIG_DEBUG_SPINLOCK
  140  extern void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock);
  141 #define do_raw_spin_lock_flags(lock, flags) do_raw_spin_lock(lock)
  142  extern int do_raw_spin_trylock(raw_spinlock_t *lock);
  143  extern void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock);
  144 #else
  145 static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock)
  146 {
  147 	__acquire(lock);
  148 	arch_spin_lock(&lock->raw_lock);
  149 }
  150 
  151 static inline void
  152 do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) __acquires(lock)
  153 {
  154 	__acquire(lock);
  155 	arch_spin_lock_flags(&lock->raw_lock, *flags);
  156 }
  157 
  158 static inline int do_raw_spin_trylock(raw_spinlock_t *lock)
  159 {
  160 	return arch_spin_trylock(&(lock)->raw_lock);
  161 }
  162 
  163 static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock)
  164 {
  165 	arch_spin_unlock(&lock->raw_lock);
  166 	__release(lock);
  167 }
  168 #endif
  169 
  170 /*
  171  * Define the various spin_lock methods.  Note we define these
  172  * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The
  173  * various methods are defined as nops in the case they are not
  174  * required.
  175  */
  176 #define raw_spin_trylock(lock)	__cond_lock(lock, _raw_spin_trylock(lock))
  177 
  178 #define raw_spin_lock(lock)	_raw_spin_lock(lock)
  179 
  180 #ifdef CONFIG_DEBUG_LOCK_ALLOC
  181 # define raw_spin_lock_nested(lock, subclass) \
  182 	_raw_spin_lock_nested(lock, subclass)
  183 
  184 # define raw_spin_lock_nest_lock(lock, nest_lock)			\
  185 	 do {								\
  186 		 typecheck(struct lockdep_map *, &(nest_lock)->dep_map);\
  187 		 _raw_spin_lock_nest_lock(lock, &(nest_lock)->dep_map);	\
  188 	 } while (0)
  189 #else
  190 /*
  191  * Always evaluate the 'subclass' argument to avoid that the compiler
  192  * warns about set-but-not-used variables when building with
  193  * CONFIG_DEBUG_LOCK_ALLOC=n and with W=1.
  194  */
  195 # define raw_spin_lock_nested(lock, subclass)		\
  196 	_raw_spin_lock(((void)(subclass), (lock)))
  197 # define raw_spin_lock_nest_lock(lock, nest_lock)	_raw_spin_lock(lock)
  198 #endif
  199 
  200 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  201 
  202 #define raw_spin_lock_irqsave(lock, flags)			\
  203 	do {						\
  204 		typecheck(unsigned long, flags);	\
  205 		flags = _raw_spin_lock_irqsave(lock);	\
  206 	} while (0)
  207 
  208 #ifdef CONFIG_DEBUG_LOCK_ALLOC
  209 #define raw_spin_lock_irqsave_nested(lock, flags, subclass)		\
  210 	do {								\
  211 		typecheck(unsigned long, flags);			\
  212 		flags = _raw_spin_lock_irqsave_nested(lock, subclass);	\
  213 	} while (0)
  214 #else
  215 #define raw_spin_lock_irqsave_nested(lock, flags, subclass)		\
  216 	do {								\
  217 		typecheck(unsigned long, flags);			\
  218 		flags = _raw_spin_lock_irqsave(lock);			\
  219 	} while (0)
  220 #endif
  221 
  222 #else
  223 
  224 #define raw_spin_lock_irqsave(lock, flags)		\
  225 	do {						\
  226 		typecheck(unsigned long, flags);	\
  227 		_raw_spin_lock_irqsave(lock, flags);	\
  228 	} while (0)
  229 
  230 #define raw_spin_lock_irqsave_nested(lock, flags, subclass)	\
  231 	raw_spin_lock_irqsave(lock, flags)
  232 
  233 #endif
  234 
  235 #define raw_spin_lock_irq(lock)		_raw_spin_lock_irq(lock)
  236 #define raw_spin_lock_bh(lock)		_raw_spin_lock_bh(lock)
  237 #define raw_spin_unlock(lock)		_raw_spin_unlock(lock)
  238 #define raw_spin_unlock_irq(lock)	_raw_spin_unlock_irq(lock)
  239 
  240 #define raw_spin_unlock_irqrestore(lock, flags)		\
  241 	do {							\
  242 		typecheck(unsigned long, flags);		\
  243 		_raw_spin_unlock_irqrestore(lock, flags);	\
  244 	} while (0)
  245 #define raw_spin_unlock_bh(lock)	_raw_spin_unlock_bh(lock)
  246 
  247 #define raw_spin_trylock_bh(lock) \
  248 	__cond_lock(lock, _raw_spin_trylock_bh(lock))
  249 
  250 #define raw_spin_trylock_irq(lock) \
  251 ({ \
  252 	local_irq_disable(); \
  253 	raw_spin_trylock(lock) ? \
  254 	1 : ({ local_irq_enable(); 0;  }); \
  255 })
  256 
  257 #define raw_spin_trylock_irqsave(lock, flags) \
  258 ({ \
  259 	local_irq_save(flags); \
  260 	raw_spin_trylock(lock) ? \
  261 	1 : ({ local_irq_restore(flags); 0; }); \
  262 })
  263 
  264 /**
  265  * raw_spin_can_lock - would raw_spin_trylock() succeed?
  266  * @lock: the spinlock in question.
  267  */
  268 #define raw_spin_can_lock(lock)	(!raw_spin_is_locked(lock))
  269 
  270 /* Include rwlock functions */
  271 #include <linux/rwlock.h>
  272 
  273 /*
  274  * Pull the _spin_*()/_read_*()/_write_*() functions/declarations:
  275  */
  276 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  277 # include <linux/spinlock_api_smp.h>
  278 #else
  279 # include <linux/spinlock_api_up.h>
  280 #endif
  281 
  282 /*
  283  * Map the spin_lock functions to the raw variants for PREEMPT_RT=n
  284  */
  285 
  286 static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
  287 {
  288 	return &lock->rlock;
  289 }
  290 
  291 #define spin_lock_init(_lock)				\
  292 do {							\
  293 	spinlock_check(_lock);				\
  294 	raw_spin_lock_init(&(_lock)->rlock);		\
  295 } while (0)
  296 
  297 static __always_inline void spin_lock(spinlock_t *lock)
  298 {
  299 	raw_spin_lock(&lock->rlock);
  300 }
  301 
  302 static __always_inline void spin_lock_bh(spinlock_t *lock)
  303 {
  304 	raw_spin_lock_bh(&lock->rlock);
  305 }
  306 
  307 static __always_inline int spin_trylock(spinlock_t *lock)
  308 {
  309 	return raw_spin_trylock(&lock->rlock);
  310 }
  311 
  312 #define spin_lock_nested(lock, subclass)			\
  313 do {								\
  314 	raw_spin_lock_nested(spinlock_check(lock), subclass);	\
  315 } while (0)
  316 
  317 #define spin_lock_nest_lock(lock, nest_lock)				\
  318 do {									\
  319 	raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock);	\
  320 } while (0)
  321 
  322 static __always_inline void spin_lock_irq(spinlock_t *lock)
  323 {
  324 	raw_spin_lock_irq(&lock->rlock);
  325 }
  326 
  327 #define spin_lock_irqsave(lock, flags)				\
  328 do {								\
  329 	raw_spin_lock_irqsave(spinlock_check(lock), flags);	\
  330 } while (0)
  331 
  332 #define spin_lock_irqsave_nested(lock, flags, subclass)			\
  333 do {									\
  334 	raw_spin_lock_irqsave_nested(spinlock_check(lock), flags, subclass); \
  335 } while (0)
  336 
  337 static __always_inline void spin_unlock(spinlock_t *lock)
  338 {
  339 	raw_spin_unlock(&lock->rlock);
  340 }
  341 
  342 static __always_inline void spin_unlock_bh(spinlock_t *lock)
  343 {
  344 	raw_spin_unlock_bh(&lock->rlock);
  345 }
  346 
  347 static __always_inline void spin_unlock_irq(spinlock_t *lock)
  348 {
  349 	raw_spin_unlock_irq(&lock->rlock);
  350 }
  351 
  352 static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
  353 {
  354 	raw_spin_unlock_irqrestore(&lock->rlock, flags);
  355 }
  356 
  357 static __always_inline int spin_trylock_bh(spinlock_t *lock)
  358 {
  359 	return raw_spin_trylock_bh(&lock->rlock);
  360 }
  361 
  362 static __always_inline int spin_trylock_irq(spinlock_t *lock)
  363 {
  364 	return raw_spin_trylock_irq(&lock->rlock);
  365 }
  366 
  367 #define spin_trylock_irqsave(lock, flags)			\
  368 ({								\
  369 	raw_spin_trylock_irqsave(spinlock_check(lock), flags); \
  370 })
  371 
  372 static __always_inline void spin_unlock_wait(spinlock_t *lock)
  373 {
  374 	raw_spin_unlock_wait(&lock->rlock);
  375 }
  376 
  377 static __always_inline int spin_is_locked(spinlock_t *lock)
  378 {
  379 	return raw_spin_is_locked(&lock->rlock);
  380 }
  381 
  382 static __always_inline int spin_is_contended(spinlock_t *lock)
  383 {
  384 	return raw_spin_is_contended(&lock->rlock);
  385 }
  386 
  387 static __always_inline int spin_can_lock(spinlock_t *lock)
  388 {
  389 	return raw_spin_can_lock(&lock->rlock);
  390 }
  391 
  392 #define assert_spin_locked(lock)	assert_raw_spin_locked(&(lock)->rlock)
  393 
  394 /*
  395  * Pull the atomic_t declaration:
  396  * (asm-mips/atomic.h needs above definitions)
  397  */
  398 #include <linux/atomic.h>
  399 /**
  400  * atomic_dec_and_lock - lock on reaching reference count zero
  401  * @atomic: the atomic counter
  402  * @lock: the spinlock in question
  403  *
  404  * Decrements @atomic by 1.  If the result is 0, returns true and locks
  405  * @lock.  Returns false for all other cases.
  406  */
  407 extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
  408 #define atomic_dec_and_lock(atomic, lock) \
  409 		__cond_lock(lock, _atomic_dec_and_lock(atomic, lock))
  410 
  411 #endif /* __LINUX_SPINLOCK_H */            | 
Here is an explanation of a rule violation arisen while checking your driver against a corresponding kernel.
Note that it may be false positive, i.e. there isn't a real error indeed. Please analyze a given error trace and related source code to understand whether there is an error in your driver.
Error trace column contains a path on which the given rule is violated. You can expand/collapse some entity classes by clicking on corresponding checkboxes in a main menu or in an advanced Others menu. Also you can expand/collapse each particular entity by clicking on +/-. In hovering on some entities you can see some tips. Also the error trace is bound with related source code. Line numbers may be shown as links on the left. You can click on them to open corresponding lines in source code.
Source code column contains a content of files related with the error trace. There is source code of your driver (note that there are some LDV modifications at the end), kernel headers and rule model. Tabs show a currently opened file and other available files. In hovering on them you can see full file names. On clicking a corresponding file content will be shown.
| Ядро | Модуль | Правило | Верификатор | Вердикт | Статус | Время создания | Описание проблемы | 
| linux-4.11-rc1.tar.xz | mm/z3fold.ko | 39_7a | CPAchecker | Bug | Fixed | 2017-03-11 00:23:38 | L0264 | 
Комментарий
11 Mar 2017
[В начало]