/usr/src/kernels/4.18.0-553.121.1.el8_10.x86_64/include/linux
NameSizeModeActions
amba/-0755rm
avf/-0755rm
bcma/-0755rm
byteorder/-0755rm
can/-0755rm
ceph/-0755rm
clk/-0755rm
crush/-0755rm
decompress/-0755rm
dma/-0755rm
dsa/-0755rm
extcon/-0755rm
firmware/-0755rm
fpga/-0755rm
fsl/-0755rm
gpio/-0755rm
hsi/-0755rm
iio/-0755rm
input/-0755rm
irqchip/-0755rm
isdn/-0755rm
lockd/-0755rm
mailbox/-0755rm
mfd/-0755rm
mlx4/-0755rm
mlx5/-0755rm
mmc/-0755rm
mtd/-0755rm
mux/-0755rm
net/-0755rm
netfilter/-0755rm
netfilter_arp/-0755rm
netfilter_bridge/-0755rm
netfilter_ipv4/-0755rm
netfilter_ipv6/-0755rm
pcs/-0755rm
perf/-0755rm
phy/-0755rm
pinctrl/-0755rm
platform_data/-0755rm
power/-0755rm
qed/-0755rm
raid/-0755rm
regulator/-0755rm
remoteproc/-0755rm
reset/-0755rm
rpmsg/-0755rm
rtc/-0755rm
sched/-0755rm
soc/-0755rm
soundwire/-0755rm
spi/-0755rm
ssb/-0755rm
sunrpc/-0755rm
ulpi/-0755rm
unaligned/-0755rm
usb/-0755rm
uwb/-0755rm
wimax/-0755rm
8250_pci.h10380644editdlrm
a.out.h3540644editdlrm
acct.h25510644editdlrm
acpi.h431300644editdlrm
acpi_apmt.h3670644editdlrm
acpi_dma.h33000644editdlrm
acpi_iort.h32350644editdlrm
acpi_pmtmr.h6740644editdlrm
adb.h18320644editdlrm
adfs_fs.h5740644editdlrm
adxl.h3100644editdlrm
aer.h18220644editdlrm
agpgart.h39080644editdlrm
agp_backend.h35340644editdlrm
ahci-remap.h6070644editdlrm
ahci_platform.h17720644editdlrm
aio.h6510644editdlrm
alarmtimer.h18750644editdlrm
altera_jtaguart.h3790644editdlrm
altera_uart.h3970644editdlrm
amd-iommu.h69310644editdlrm
amd-pstate.h33560644editdlrm
anon_inodes.h4940644editdlrm
aperture.h16190644editdlrm
apm-emulation.h15750644editdlrm
apm_bios.h27460644editdlrm
apple-gmux.h14590644editdlrm
apple_bl.h4980644editdlrm
arch_topology.h19830644editdlrm
arm-cci.h20580644editdlrm
arm-smccc.h160660644editdlrm
arm_sdei.h26410644editdlrm
ascii85.h5320644editdlrm
asn1.h20390644editdlrm
asn1_ber_bytecode.h27830644editdlrm
asn1_decoder.h6750644editdlrm
assoc_array.h31560644editdlrm
assoc_array_priv.h56300644editdlrm
async.h45910644editdlrm
async_tx.h74870644editdlrm
ata.h339800644editdlrm
atalk.h45500644editdlrm
ata_platform.h7290644editdlrm
ath9k_platform.h14770644editdlrm
atm.h2870644editdlrm
atmdev.h104570644editdlrm
atmel-mci.h14290644editdlrm
atmel-ssc.h99710644editdlrm
atmel_pdc.h15020644editdlrm
atmel_tc.h116000644editdlrm
atm_suni.h2530644editdlrm
atm_tcp.h5110644editdlrm
atomic.h375460644editdlrm
attribute_container.h27990644editdlrm
audit.h203320644editdlrm
audit_arch.h5590644editdlrm
auto_dev-ioctl.h4540644editdlrm
auto_fs.h4360644editdlrm
auxiliary_bus.h27870644editdlrm
auxvec.h3040644editdlrm
average.h24810644editdlrm
b1pcmcia.h6660644editdlrm
backing-dev-defs.h103270644editdlrm
backing-dev.h122600644editdlrm
backlight.h134470644editdlrm
badblocks.h21880644editdlrm
balloon_compaction.h67450644editdlrm
bcd.h5590644editdlrm
bch.h26600644editdlrm
bcm47xx_nvram.h12470644editdlrm
bcm47xx_sprom.h6000644editdlrm
bcm47xx_wdt.h5550644editdlrm
bcm963xx_nvram.h30360644editdlrm
bcm963xx_tag.h36850644editdlrm
binfmts.h54430644editdlrm
bio.h206900644editdlrm
bitfield.h58990644editdlrm
bitmap.h214960644editdlrm
bitops.h88700644editdlrm
bitrev.h25410644editdlrm
bits.h15120644editdlrm
bit_spinlock.h23600644editdlrm
blk-cgroup.h227280644editdlrm
blk-mq-pci.h2690644editdlrm
blk-mq-rdma.h2340644editdlrm
blk-mq-virtio.h2930644editdlrm
blk-mq.h160740644editdlrm
blk-pm.h7170644editdlrm
blkdev.h588980644editdlrm
blkpg.h4360644editdlrm
blktrace_api.h37770644editdlrm
blk_types.h153420644editdlrm
blockgroup_lock.h8100644editdlrm
bma150.h19380644editdlrm
bottom_half.h8030644editdlrm
bpf-cgroup.h198180644editdlrm
bpf-netns.h15590644editdlrm
bpf.h728240644editdlrm
bpfilter.h7910644editdlrm
bpfptr.h17330644editdlrm
bpf_lirc.h6980644editdlrm
bpf_local_storage.h53490644editdlrm
bpf_lsm.h14310644editdlrm
bpf_trace.h1660644editdlrm
bpf_types.h53950644editdlrm
bpf_verifier.h187910644editdlrm
brcmphy.h140230644editdlrm
bsearch.h2750644editdlrm
bsg-lib.h24550644editdlrm
bsg.h10940644editdlrm
btf.h73630644editdlrm
btf_ids.h51740644editdlrm
btree-128.h27370644editdlrm
btree-type.h39910644editdlrm
btree.h69990644editdlrm
btrfs.h1450644editdlrm
buffer_head.h143790644editdlrm
bug.h19670644editdlrm
buildid.h2480644editdlrm
build_bug.h30660644editdlrm
bvec.h41190644editdlrm
c2port.h15290644editdlrm
cache.h21820644editdlrm
cacheinfo.h47960644editdlrm
capability.h81790644editdlrm
cb710.h58270644editdlrm
cciss_ioctl.h10530644editdlrm
ccp.h186970644editdlrm
cc_platform.h31400644editdlrm
cdev.h8450644editdlrm
cdrom.h91930644editdlrm
cfag12864b.h14990644editdlrm
cgroup-defs.h272420644editdlrm
cgroup.h288800644editdlrm
cgroup_rdma.h13580644editdlrm
cgroup_subsys.h12590644editdlrm
circ_buf.h11200644editdlrm
cleancache.h39820644editdlrm
cleanup.h142150644editdlrm
clk-provider.h375420644editdlrm
clk.h251570644editdlrm
clkdev.h16980644editdlrm
clockchips.h74450644editdlrm
clocksource.h91880644editdlrm
clock_cooling.h21060644editdlrm
cm4000_cs.h1990644editdlrm
cma.h12120644editdlrm
cmdline-parser.h12380644editdlrm
cnt32_to_63.h36910644editdlrm
cn_proc.h18900644editdlrm
coda.h22440644editdlrm
coda_psdev.h26920644editdlrm
compaction.h76540644editdlrm
compat.h357390644editdlrm
compat_time.h4990644editdlrm
compiler-clang.h24460644editdlrm
compiler-gcc.h57560644editdlrm
compiler-intel.h9490644editdlrm
compiler.h157180644editdlrm
compiler_attributes.h106000644editdlrm
compiler_types.h69310644editdlrm
completion.h42010644editdlrm
component.h44590644editdlrm
concap.h37780644editdlrm
configfs.h94410644editdlrm
connector.h24900644editdlrm
console.h75040644editdlrm
consolemap.h10680644editdlrm
console_struct.h69660644editdlrm
const.h4210644editdlrm
container.h6680644editdlrm
container_of.h12780644editdlrm
context_tracking.h51680644editdlrm
context_tracking_state.h15290644editdlrm
cookie.h12540644editdlrm
cordic.h17940644editdlrm
coredump.h7970644editdlrm
coresight-pmu.h9890644editdlrm
coresight-stm.h1520644editdlrm
coresight.h96760644editdlrm
counter.h154970644editdlrm
counter_enum.h14630644editdlrm
count_zeros.h16600644editdlrm
cper.h168260644editdlrm
cpu.h79590644editdlrm
cpufeature.h18820644editdlrm
cpufreq.h342480644editdlrm
cpuhotplug.h142690644editdlrm
cpuidle.h130610644editdlrm
cpuidle_haltpoll.h3120644editdlrm
cpumask.h297210644editdlrm
cpuset.h82970644editdlrm
cpu_cooling.h23890644editdlrm
cpu_pm.h28500644editdlrm
cpu_rmap.h19020644editdlrm
crash_core.h32920644editdlrm
crash_dump.h51930644editdlrm
crc-ccitt.h6090644editdlrm
crc-itu-t.h6130644editdlrm
crc-t10dif.h4530644editdlrm
crc4.h1920644editdlrm
crc7.h3160644editdlrm
crc8.h37470644editdlrm
crc16.h6220644editdlrm
crc32.h28940644editdlrm
crc32c.h3310644editdlrm
crc32poly.h6100644editdlrm
cred.h127490644editdlrm
crypto.h593930644editdlrm
cryptohash.h5460644editdlrm
cs5535.h64260644editdlrm
ctype.h17910644editdlrm
cuda.h5010644editdlrm
cxl_err.h4680644editdlrm
cyclades.h106070644editdlrm
damon.h196160644editdlrm
davinci_emac.h11500644editdlrm
dax.h75530644editdlrm
dca.h26980644editdlrm
dcache.h196210644editdlrm
dccp.h109890644editdlrm
dcookies.h13290644editdlrm
debugfs.h119210644editdlrm
debugobjects.h39880644editdlrm
debug_locks.h16270644editdlrm
delay.h23350644editdlrm
delayacct.h62850644editdlrm
delayed_call.h7090644editdlrm
dell-led.h1280644editdlrm
devcoredump.h28490644editdlrm
devfreq-event.h57780644editdlrm
devfreq.h129870644editdlrm
devfreq_cooling.h36080644editdlrm
device-mapper.h195290644editdlrm
device.h672750644editdlrm
device_cgroup.h16800644editdlrm
devm-helpers.h27400644editdlrm
devpts_fs.h13140644editdlrm
dev_printk.h77310644editdlrm
digsig.h13790644editdlrm
dim.h89510644editdlrm
dio.h112290644editdlrm
dirent.h2160644editdlrm
dlm.h72400644editdlrm
dlm_plock.h6780644editdlrm
dm-bufio.h45740644editdlrm
dm-dirty-log.h40380644editdlrm
dm-io.h19800644editdlrm
dm-kcopyd.h30130644editdlrm
dm-region-hash.h31820644editdlrm
dm9000.h11360644editdlrm
dma-buf.h215470644editdlrm
dma-contiguous.h50700644editdlrm
dma-direct.h36810644editdlrm
dma-direction.h4070644editdlrm
dma-fence-array.h29830644editdlrm
dma-fence-chain.h35760644editdlrm
dma-fence-unwrap.h22980644editdlrm
dma-fence.h211620644editdlrm
dma-iommu.h30200644editdlrm
dma-map-ops.h108630644editdlrm
dma-mapping.h231700644editdlrm
dma-resv.h172450644editdlrm
dmaengine.h548910644editdlrm
dmapool.h18320644editdlrm
dmar.h87910644editdlrm
dmi.h43750644editdlrm
dnotify.h10470644editdlrm
dns_resolver.h13390644editdlrm
dqblk_qtree.h22380644editdlrm
dqblk_v1.h3270644editdlrm
dqblk_v2.h4060644editdlrm
drbd.h109230644editdlrm
drbd_genl.h220100644editdlrm
drbd_genl_api.h18080644editdlrm
drbd_limits.h80030644editdlrm
ds2782_battery.h1580644editdlrm
dtlk.h35840644editdlrm
dw_apb_timer.h17430644editdlrm
dynamic_debug.h58310644editdlrm
dynamic_queue_limits.h38120644editdlrm
earlycpio.h3590644editdlrm
ecryptfs.h39150644editdlrm
edac.h207180644editdlrm
edd.h14690644editdlrm
edma.h8070644editdlrm
eeprom_93cx6.h30080644editdlrm
eeprom_93xx46.h7760644editdlrm
efi-bgrt.h6440644editdlrm
efi.h628130644editdlrm
efs_vh.h15850644editdlrm
eisa.h30310644editdlrm
elevator.h60590644editdlrm
elf-fdpic.h22370644editdlrm
elf-randomize.h5830644editdlrm
elf.h15650644editdlrm
elfcore-compat.h12670644editdlrm
elfcore.h21600644editdlrm
elfnote.h36250644editdlrm
enclosure.h47110644editdlrm
energy_model.h59940644editdlrm
err.h15830644editdlrm
errname.h2830644editdlrm
errno.h14240644editdlrm
error-injection.h6070644editdlrm
errqueue.h5240644editdlrm
errseq.h3820644editdlrm
etherdevice.h169170644editdlrm
ethtool.h355800644editdlrm
ethtool_netlink.h19200644editdlrm
eventfd.h21670644editdlrm
eventpoll.h24570644editdlrm
evm.h29850644editdlrm
export.h36970644editdlrm
exportfs.h76920644editdlrm
ext2_fs.h9670644editdlrm
extable.h13090644editdlrm
extcon-provider.h44310644editdlrm
extcon.h102700644editdlrm
f2fs_fs.h185260644editdlrm
f75375s.h5410644editdlrm
falloc.h17190644editdlrm
fanotify.h23360644editdlrm
fault-inject.h19750644editdlrm
fb.h287120644editdlrm
fbcon.h21360644editdlrm
fcdevice.h9880644editdlrm
fcntl.h18080644editdlrm
fd.h4900644editdlrm
fddidevice.h10440644editdlrm
fdtable.h36160644editdlrm
fec.h6090644editdlrm
file.h31470644editdlrm
filter.h427810644editdlrm
fips.h1670644editdlrm
firewire.h138680644editdlrm
firmware-map.h13510644editdlrm
firmware.h58740644editdlrm
fixp-arith.h45160644editdlrm
flat.h16530644editdlrm
flex_array.h44120644editdlrm
flex_proportions.h28810644editdlrm
fmc-sdb.h13190644editdlrm
fmc.h98770644editdlrm
font.h15980644editdlrm
fortify-string.h165500644editdlrm
freezer.h92570644editdlrm
frontswap.h31210644editdlrm
fs.h1177400644editdlrm
fscache-cache.h192540644editdlrm
fscache.h295770644editdlrm
fscrypt.h94410644editdlrm
fscrypt_notsupp.h50770644editdlrm
fscrypt_supp.h74210644editdlrm
fsi.h24240644editdlrm
fsl-diu-fb.h41790644editdlrm
fsldma.h3980644editdlrm
fsl_devices.h44300644editdlrm
fsl_hypervisor.h28240644editdlrm
fsl_ifc.h256580644editdlrm
fsnotify.h77960644editdlrm
fsnotify_backend.h205950644editdlrm
fs_context.h90970644editdlrm
fs_enet_pd.h34570644editdlrm
fs_parser.h47500644editdlrm
fs_pin.h6190644editdlrm
fs_stack.h8110644editdlrm
fs_struct.h17510644editdlrm
fs_uart_pd.h15230644editdlrm
ftrace.h336190644editdlrm
ftrace_irq.h11630644editdlrm
futex.h24970644editdlrm
fwnode.h75790644editdlrm
gameport.h56950644editdlrm
gcd.h1930644editdlrm
genalloc.h79500644editdlrm
generic-radix-tree.h66710644editdlrm
genetlink.h13790644editdlrm
genhd.h160760644editdlrm
genl_magic_func.h118690644editdlrm
genl_magic_struct.h78050644editdlrm
getcpu.h6410644editdlrm
gfp.h242080644editdlrm
glob.h2560644editdlrm
goldfish.h6050644editdlrm
gpio-pxa.h5710644editdlrm
gpio.h54780644editdlrm
gpio_keys.h17820644editdlrm
hardirq.h32640644editdlrm
hash.h29980644editdlrm
hashtable.h68050644editdlrm
hdlc.h34130644editdlrm
hdlcdrv.h64700644editdlrm
hdmi.h128510644editdlrm
hid-debug.h14580644editdlrm
hid-roccat.h4840644editdlrm
hid-sensor-hub.h91900644editdlrm
hid-sensor-ids.h76170644editdlrm
hid.h383390644editdlrm
hidden.h9660644editdlrm
hiddev.h14580644editdlrm
hidraw.h11460644editdlrm
highmem-internal.h49520644editdlrm
highmem.h82350644editdlrm
highuid.h31940644editdlrm
hil.h188570644editdlrm
hil_mlc.h52490644editdlrm
hippidevice.h12630644editdlrm
hmm.h46560644editdlrm
host1x.h86180644editdlrm
hpet.h26150644editdlrm
hp_sdc.h143520644editdlrm
hrtimer.h166510644editdlrm
hrtimer_defs.h6600644editdlrm
htcpld.h6170644editdlrm
hugetlb.h274960644editdlrm
hugetlb_cgroup.h70560644editdlrm
hugetlb_inline.h3740644editdlrm
huge_mm.h157430644editdlrm
hwmon-sysfs.h20240644editdlrm
hwmon-vid.h15180644editdlrm
hwmon.h140840644editdlrm
hwspinlock.h130440644editdlrm
hw_breakpoint.h44050644editdlrm
hw_random.h23770644editdlrm
hyperv.h500100644editdlrm
hypervisor.h7480644editdlrm
i2c-algo-bit.h23220644editdlrm
i2c-algo-pca.h25990644editdlrm
i2c-algo-pcf.h19260644editdlrm
i2c-dev.h3710644editdlrm
i2c-mux.h16680644editdlrm
i2c-pxa.h4380644editdlrm
i2c-smbus.h19910644editdlrm
i2c.h378740644editdlrm
i8042.h21910644editdlrm
i8253.h8090644editdlrm
icmp.h10850644editdlrm
icmpv6.h17320644editdlrm
ide.h474030644editdlrm
idr.h97150644editdlrm
ieee80211.h1530580644editdlrm
ieee802154.h117800644editdlrm
if_arp.h19000644editdlrm
if_bridge.h53800644editdlrm
if_eql.h11000644editdlrm
if_ether.h15060644editdlrm
if_fddi.h35260644editdlrm
if_frad.h29370644editdlrm
if_link.h5920644editdlrm
if_ltalk.h1880644editdlrm
if_macvlan.h27570644editdlrm
if_phonet.h3190644editdlrm
if_pppol2tp.h7270644editdlrm
if_pppox.h29790644editdlrm
if_tap.h22880644editdlrm
if_team.h82970644editdlrm
if_tun.h20500644editdlrm
if_tunnel.h4090644editdlrm
if_vlan.h211240644editdlrm
igmp.h47530644editdlrm
ihex.h20010644editdlrm
ima.h34960644editdlrm
imx-media.h8110644editdlrm
in.h25920644editdlrm
in6.h18930644editdlrm
indirect_call_wrapper.h21910644editdlrm
inet.h29180644editdlrm
inetdevice.h86580644editdlrm
inet_diag.h26060644editdlrm
init.h97780644editdlrm
initrd.h7890644editdlrm
init_ohci1394_dma.h1960644editdlrm
init_task.h14070644editdlrm
inotify.h7130644editdlrm
input-polldev.h20740644editdlrm
input.h190020644editdlrm
instrumented.h28680644editdlrm
integrity.h10740644editdlrm
intel-iommu.h320630644editdlrm
intel-ish-client-if.h40910644editdlrm
intel-pti.h16000644editdlrm
intel_rapl.h42650644editdlrm
intel_th.h25010644editdlrm
interrupt.h247770644editdlrm
interval_tree.h8310644editdlrm
interval_tree_generic.h75130644editdlrm
io-64-nonatomic-hi-lo.h24560644editdlrm
io-64-nonatomic-lo-hi.h24560644editdlrm
io-mapping.h52220644editdlrm
io-pgtable.h84980644editdlrm
io.h62010644editdlrm
ioasid.h21740644editdlrm
ioc3.h32140644editdlrm
ioc4.h59200644editdlrm
iocontext.h48780644editdlrm
iomap.h138930644editdlrm
iommu-helper.h11460644editdlrm
iommu.h370000644editdlrm
iopoll.h81750644editdlrm
ioport.h126860644editdlrm
ioprio.h24640644editdlrm
iosys-map.h153110644editdlrm
iova.h42650644editdlrm
ip.h12350644editdlrm
ipack.h90620644editdlrm
ipc.h6130644editdlrm
ipc_namespace.h46820644editdlrm
ipmi-fru.h36940644editdlrm
ipmi.h116330644editdlrm
ipmi_smi.h110220644editdlrm
ipv6.h92830644editdlrm
ipv6_route.h5940644editdlrm
irq.h417830644editdlrm
irqbypass.h36810644editdlrm
irqchip.h15970644editdlrm
irqdesc.h84600644editdlrm
irqdomain.h206450644editdlrm
irqflags.h81050644editdlrm
irqhandler.h3620644editdlrm
irqnr.h8560644editdlrm
irqreturn.h5030644editdlrm
irq_cpustat.h8450644editdlrm
irq_poll.h5750644editdlrm
irq_sim.h9710644editdlrm
irq_work.h19240644editdlrm
isa.h21660644editdlrm
isapnp.h38960644editdlrm
iscsi_boot_sysfs.h41850644editdlrm
iscsi_ibft.h13060644editdlrm
isdn.h235450644editdlrm
isdnif.h197230644editdlrm
isdn_divertif.h13010644editdlrm
isdn_ppp.h67970644editdlrm
isicom.h15280644editdlrm
ism.h22730644editdlrm
iversion.h126700644editdlrm
jbd2.h479710644editdlrm
jhash.h47350644editdlrm
jiffies.h163400644editdlrm
journal-head.h29340644editdlrm
joystick.h4370644editdlrm
jump_label.h153760644editdlrm
jump_label_ratelimit.h28670644editdlrm
jz4740-adc.h10230644editdlrm
jz4780-nemc.h11850644editdlrm
kallsyms.h43350644editdlrm
kasan-checks.h14950644editdlrm
kasan.h126780644editdlrm
kbd_diacr.h1980644editdlrm
kbd_kern.h39310644editdlrm
kbuild.h3800644editdlrm
kconfig.h24810644editdlrm
kcore.h8910644editdlrm
kcov.h24630644editdlrm
kcsan-checks.h88590644editdlrm
kcsan.h19480644editdlrm
kdb.h74780644editdlrm
kdebug.h4870644editdlrm
kdev_t.h17440644editdlrm
kernel-page-flags.h5050644editdlrm
kernel.h207590644editdlrm
kernelcapi.h45520644editdlrm
kernel_stat.h30310644editdlrm
kernfs.h193360644editdlrm
kern_levels.h16110644editdlrm
kexec.h108960644editdlrm
key-type.h65830644editdlrm
key.h131490644editdlrm
keyboard.h6650644editdlrm
kfifo.h254310644editdlrm
kgdb.h115690644editdlrm
khugepaged.h28320644editdlrm
klist.h19260644editdlrm
kmemleak.h39540644editdlrm
kmod.h17520644editdlrm
kmsg_dump.h26270644editdlrm
kobject.h77270644editdlrm
kobject_ns.h19340644editdlrm
kobj_map.h5450644editdlrm
kprobes.h132220644editdlrm
kref.h33610644editdlrm
ks0108.h9600644editdlrm
ks8842.h12230644editdlrm
ks8851_mll.h10630644editdlrm
ksm.h27530644editdlrm
kstrtox.h67510644editdlrm
kthread.h79240644editdlrm
ktime.h66070644editdlrm
kvm_dirty_ring.h26330644editdlrm
kvm_host.h655830644editdlrm
kvm_irqfd.h24580644editdlrm
kvm_para.h4020644editdlrm
kvm_types.h32640644editdlrm
l2tp.h2610644editdlrm
lapb.h17520644editdlrm
latencytop.h12070644editdlrm
lcd.h38670644editdlrm
lcm.h2750644editdlrm
led-class-flash.h56190644editdlrm
led-lm3530.h37930644editdlrm
leds-bd2802.h6420644editdlrm
leds-lp3944.h10990644editdlrm
leds-lp3952.h25590644editdlrm
leds-pca9532.h10310644editdlrm
leds-regulator.h13170644editdlrm
leds-tca6507.h10420644editdlrm
leds.h156230644editdlrm
leds_pwm.h4070644editdlrm
libata.h685400644editdlrm
libfdt.h2020644editdlrm
libfdt_env.h4910644editdlrm
libgcc.h10990644editdlrm
libnvdimm.h98730644editdlrm
libps2.h20770644editdlrm
license.h3740644editdlrm
lightnvm.h119800644editdlrm
limits.h7150644editdlrm
linear_range.h16450644editdlrm
linkage.h93310644editdlrm
linkmode.h25590644editdlrm
linux_logo.h19560644editdlrm
lis3lv02d.h51250644editdlrm
list.h321050644editdlrm
list_bl.h49050644editdlrm
list_lru.h81930644editdlrm
list_nulls.h43220644editdlrm
list_sort.h3070644editdlrm
livepatch.h91090644editdlrm
llc.h7490644editdlrm
llist.h93680644editdlrm
local_lock.h13620644editdlrm
local_lock_internal.h34990644editdlrm
lockdep.h215850644editdlrm
lockdep_types.h53080644editdlrm
lockref.h14400644editdlrm
log2.h65420644editdlrm
logic_pio.h32570644editdlrm
lp.h28270644editdlrm
lru_cache.h127220644editdlrm
lsm_audit.h27850644editdlrm
lsm_hooks.h707950644editdlrm
lsm_hook_defs.h201670644editdlrm
lz4.h270720644editdlrm
lzo.h14040644editdlrm
mailbox_client.h18370644editdlrm
mailbox_controller.h55020644editdlrm
maple.h27750644editdlrm
marvell_phy.h16910644editdlrm
math.h51850644editdlrm
math64.h76620644editdlrm
max17040_battery.h4740644editdlrm
mbcache.h22080644editdlrm
mbus.h31680644editdlrm
mc6821.h12090644editdlrm
mc146818rtc.h45670644editdlrm
mcb.h39750644editdlrm
mdev.h58590644editdlrm
mdio-bitbang.h11490644editdlrm
mdio-gpio.h1770644editdlrm
mdio-mux.h10210644editdlrm
mdio.h137300644editdlrm
mei_aux.h9290644editdlrm
mei_cl_bus.h41960644editdlrm
memblock.h210090644editdlrm
memcontrol.h462430644editdlrm
memfd.h3650644editdlrm
memory.h40800644editdlrm
memory_hotplug.h109810644editdlrm
mempolicy.h80840644editdlrm
mempool.h34300644editdlrm
memregion.h4170644editdlrm
memremap.h78180644editdlrm
memstick.h99820644editdlrm
mem_encrypt.h9260644editdlrm
mhi.h269080644editdlrm
mhi_ep.h98660644editdlrm
micrel_phy.h15220644editdlrm
microchipphy.h33100644editdlrm
mic_bus.h32720644editdlrm
migrate.h62780644editdlrm
migrate_mode.h7580644editdlrm
mii.h162830644editdlrm
mii_timestamper.h36530644editdlrm
minmax.h63730644editdlrm
min_heap.h33770644editdlrm
miscdevice.h28640644editdlrm
misc_cgroup.h30070644editdlrm
mISDNdsp.h12170644editdlrm
mISDNhw.h59210644editdlrm
mISDNif.h152760644editdlrm
mm-arch-hooks.h6790644editdlrm
mm.h1015570644editdlrm
mman.h33570644editdlrm
mmap_lock.h20860644editdlrm
mmdebug.h23790644editdlrm
mmiotrace.h31220644editdlrm
mmu_context.h4650644editdlrm
mmu_notifier.h284620644editdlrm
mmzone.h516150644editdlrm
mm_inline.h30590644editdlrm
mm_types.h268440644editdlrm
mm_types_task.h24570644editdlrm
mnt_namespace.h5470644editdlrm
module.h236590644editdlrm
moduleloader.h31700644editdlrm
moduleparam.h202750644editdlrm
module_signature.h12500644editdlrm
mod_devicetable.h225130644editdlrm
mount.h37080644editdlrm
mpage.h7370644editdlrm
mpi.h33810644editdlrm
mpls.h3940644editdlrm
mpls_iptunnel.h1780644editdlrm
mroute.h19980644editdlrm
mroute6.h24490644editdlrm
mroute_base.h124330644editdlrm
msdos_fs.h2730644editdlrm
msdos_partition.h16550644editdlrm
msg.h3950644editdlrm
msi.h156650644editdlrm
mutex.h78370644editdlrm
mv643xx.h536570644editdlrm
mv643xx_eth.h20010644editdlrm
mv643xx_i2c.h5450644editdlrm
mvebu-pmsu.h5200644editdlrm
mxm-wmi.h10780644editdlrm
namei.h39460644editdlrm
nd.h76010644editdlrm
net.h124050644editdlrm
netdevice.h1695260644editdlrm
netdev_features.h105190644editdlrm
netfilter.h126770644editdlrm
netfilter_bridge.h19770644editdlrm
netfilter_defs.h4860644editdlrm
netfilter_ingress.h14720644editdlrm
netfilter_ipv4.h10770644editdlrm
netfilter_ipv6.h36980644editdlrm
netlink.h91700644editdlrm
netpoll.h26010644editdlrm
nfs.h11450644editdlrm
nfs3.h2600644editdlrm
nfs4.h195270644editdlrm
nfsacl.h14350644editdlrm
nfs_fs.h185780644editdlrm
nfs_fs_i.h3080644editdlrm
nfs_fs_sb.h105370644editdlrm
nfs_iostat.h42850644editdlrm
nfs_page.h69910644editdlrm
nfs_xdr.h425020644editdlrm
nitro_enclaves.h2670644editdlrm
nl802154.h43360644editdlrm
nls.h31620644editdlrm
nmi.h67580644editdlrm
node.h43990644editdlrm
nodemask.h174400644editdlrm
nospec.h21870644editdlrm
notifier.h84180644editdlrm
nsc_gpio.h14590644editdlrm
nsproxy.h26760644editdlrm
ns_common.h3010644editdlrm
ntb.h536910644editdlrm
ntb_transport.h38920644editdlrm
nubus.h56740644editdlrm
numa.h10040644editdlrm
nvme-fc-driver.h472160644editdlrm
nvme-fc.h99550644editdlrm
nvme-rdma.h25350644editdlrm
nvme-tcp.h45380644editdlrm
nvme.h391280644editdlrm
nvmem-consumer.h44540644editdlrm
nvmem-provider.h32670644editdlrm
nvram.h4950644editdlrm
n_r3964.h41550644editdlrm
objagg.h19830644editdlrm
objtool.h11550644editdlrm
of.h433070644editdlrm
of_address.h46030644editdlrm
of_clk.h7530644editdlrm
of_device.h32270644editdlrm
of_dma.h23530644editdlrm
of_fdt.h41880644editdlrm
of_gpio.h40530644editdlrm
of_graph.h36360644editdlrm
of_iommu.h5050644editdlrm
of_irq.h36910644editdlrm
of_mdio.h32130644editdlrm
of_net.h8870644editdlrm
of_pci.h9150644editdlrm
of_pdt.h12220644editdlrm
of_platform.h39740644editdlrm
of_reserved_mem.h24030644editdlrm
oid_registry.h39660644editdlrm
olpc-ec.h11040644editdlrm
omap-dma.h107540644editdlrm
omap-dmaengine.h5830644editdlrm
omap-gpmc.h30110644editdlrm
omap-iommu.h6850644editdlrm
omap-mailbox.h7770644editdlrm
omapfb.h12460644editdlrm
once.h18800644editdlrm
oom.h33410644editdlrm
openvswitch.h10190644editdlrm
oprofile.h62460644editdlrm
osq_lock.h10660644editdlrm
overflow.h122690644editdlrm
padata.h74310644editdlrm
page-flags-layout.h35010644editdlrm
page-flags.h281560644editdlrm
page-isolation.h21240644editdlrm
pageblock-flags.h33570644editdlrm
pagemap.h246490644editdlrm
pagevec.h23830644editdlrm
pagewalk.h41670644editdlrm
page_counter.h34470644editdlrm
page_ext.h17220644editdlrm
page_idle.h26830644editdlrm
page_owner.h23610644editdlrm
page_ref.h53610644editdlrm
page_reporting.h8340644editdlrm
parman.h29340644editdlrm
parport.h182730644editdlrm
parport_pc.h67130644editdlrm
parser.h11410644editdlrm
pata_arasan_cf_data.h12500644editdlrm
patchkey.h7570644editdlrm
path.h5720644editdlrm
pch_dma.h9990644editdlrm
pci-acpi.h42800644editdlrm
pci-ats.h18020644editdlrm
pci-dma-compat.h37500644editdlrm
pci-ecam.h33580644editdlrm
pci-ep-cfs.h9570644editdlrm
pci-epc.h73360644editdlrm
pci-epf.h48680644editdlrm
pci-p2pdma.h40490644editdlrm
pci.h917980644editdlrm
pci_hotplug.h47520644editdlrm
pci_ids.h1282480644editdlrm
pda_power.h11510644editdlrm
pe.h162040644editdlrm
percpu-defs.h186090644editdlrm
percpu-refcount.h111690644editdlrm
percpu-rwsem.h45730644editdlrm
percpu.h48490644editdlrm
percpu_counter.h43720644editdlrm
perf_event.h507870644editdlrm
perf_regs.h10760644editdlrm
personality.h3930644editdlrm
pfn.h6660644editdlrm
pfn_t.h33100644editdlrm
phonet.h11460644editdlrm
phy.h563860644editdlrm
phylink.h237070644editdlrm
phy_fixed.h18140644editdlrm
phy_led_triggers.h14910644editdlrm
pid.h60590644editdlrm
pid_namespace.h23860644editdlrm
pim.h27370644editdlrm
pipe_fs_i.h64710644editdlrm
pkeys.h9610644editdlrm
pktcdvd.h60110644editdlrm
pl320-ipc.h7580644editdlrm
platform_device.h141600644editdlrm
platform_profile.h11550644editdlrm
pldmfw.h48790644editdlrm
plist.h88940644editdlrm
pm-trace.h9400644editdlrm
pm.h374800644editdlrm
pm2301_charger.h17230644editdlrm
pmbus.h16210644editdlrm
pmu.h23920644editdlrm
pm_clock.h26380644editdlrm
pm_domain.h132930644editdlrm
pm_opp.h115360644editdlrm
pm_qos.h106620644editdlrm
pm_runtime.h103290644editdlrm
pm_wakeirq.h15180644editdlrm
pm_wakeup.h73540644editdlrm
pnfs_osd_xdr.h94900644editdlrm
pnp.h157650644editdlrm
poison.h26510644editdlrm
poll.h41090644editdlrm
posix-clock.h46600644editdlrm
posix-timers.h64600644editdlrm
posix_acl.h31670644editdlrm
posix_acl_xattr.h16210644editdlrm
powercap.h128890644editdlrm
power_supply.h150250644editdlrm
ppp-comp.h31720644editdlrm
ppp_channel.h31460644editdlrm
ppp_defs.h8120644editdlrm
pps-gpio.h10330644editdlrm
pps_kernel.h36200644editdlrm
pr.h5660644editdlrm
prandom.h38860644editdlrm
preempt.h122320644editdlrm
prefetch.h17400644editdlrm
prime_numbers.h13840644editdlrm
printk.h169080644editdlrm
prmt.h1430644editdlrm
processor.h18890644editdlrm
proc_fs.h61380644editdlrm
proc_ns.h28970644editdlrm
profile.h27430644editdlrm
projid.h22690644editdlrm
property.h174100644editdlrm
psci.h19510644editdlrm
pseudo_fs.h3550644editdlrm
psi.h17060644editdlrm
psi_types.h39940644editdlrm
psp-platform-access.h17220644editdlrm
psp-sev.h189210644editdlrm
psp-tee.h23160644editdlrm
psp.h6970644editdlrm
pstore.h77640644editdlrm
pstore_ram.h29800644editdlrm
pti.h1980644editdlrm
ptp_classify.h50070644editdlrm
ptp_clock_kernel.h124310644editdlrm
ptrace.h152100644editdlrm
ptr_ring.h168900644editdlrm
purgatory.h5890644editdlrm
pvclock_gtod.h5480644editdlrm
pwm.h173410644editdlrm
pwm_backlight.h8020644editdlrm
pxa2xx_ssp.h104700644editdlrm
pxa168_eth.h7280644editdlrm
qcom-geni-se.h124710644editdlrm
qcom_scm.h43810644editdlrm
qnx6_fs.h33490644editdlrm
quicklist.h21860644editdlrm
quota.h192310644editdlrm
quotaops.h105530644editdlrm
radix-tree.h179780644editdlrm
raid_class.h21490644editdlrm
ramfs.h6950644editdlrm
random.h38550644editdlrm
range.h7750644editdlrm
ras.h12110644editdlrm
ratelimit.h17610644editdlrm
ratelimit_types.h11700644editdlrm
rational.h6390644editdlrm
rbtree.h97890644editdlrm
rbtree_augmented.h104850644editdlrm
rbtree_latch.h68150644editdlrm
rbtree_types.h9460644editdlrm
rculist.h284440644editdlrm
rculist_bl.h33740644editdlrm
rculist_nulls.h55130644editdlrm
rcupdate.h385480644editdlrm
rcupdate_trace.h28820644editdlrm
rcupdate_wait.h17690644editdlrm
rcutiny.h42320644editdlrm
rcutree.h30770644editdlrm
rcuwait.h19000644editdlrm
rcu_node_tree.h44680644editdlrm
rcu_segcblist.h112920644editdlrm
rcu_sync.h23120644editdlrm
reboot-mode.h6000644editdlrm
reboot.h20980644editdlrm
reciprocal_div.h33560644editdlrm
refcount.h27990644editdlrm
regmap.h544470644editdlrm
regset.h155270644editdlrm
relay.h89080644editdlrm
remoteproc.h200780644editdlrm
resctrl.h88910644editdlrm
reservation.h92260644editdlrm
reset-controller.h30670644editdlrm
reset.h137390644editdlrm
resource.h3390644editdlrm
resource_ext.h25420644editdlrm
restart_block.h11140644editdlrm
rfkill.h110400644editdlrm
rhashtable-types.h37420644editdlrm
rhashtable.h352780644editdlrm
rh_flags.h9050644editdlrm
rh_kabi.h226330644editdlrm
rh_kabi_attributes.h5010644editdlrm
rh_kabi_aux.h9170644editdlrm
rh_kabi_memcg.h37600644editdlrm
rh_tasklist_lock.h9590644editdlrm
rh_waived.h4410644editdlrm
ring_buffer.h73710644editdlrm
rio.h196870644editdlrm
rio_drv.h150610644editdlrm
rio_ids.h13170644editdlrm
rio_regs.h197370644editdlrm
rmap.h110370644editdlrm
rmi.h124790644editdlrm
rndis.h172690644editdlrm
rodata_test.h5590644editdlrm
root_dev.h6190644editdlrm
rpmsg.h71170644editdlrm
rslib.h37540644editdlrm
rtc.h94270644editdlrm
rtmutex.h31470644editdlrm
rtnetlink.h46040644editdlrm
rtsx_common.h14750644editdlrm
rtsx_pci.h411350644editdlrm
rtsx_usb.h163340644editdlrm
rwbase_rt.h8760644editdlrm
rwlock.h40540644editdlrm
rwlock_api_smp.h77360644editdlrm
rwlock_rt.h30530644editdlrm
rwlock_types.h18140644editdlrm
rwsem.h74050644editdlrm
s3c_adc_battery.h9710644editdlrm
sa11x0-dma.h5720644editdlrm
sbitmap.h202030644editdlrm
scatterlist.h180030644editdlrm
scc.h29050644editdlrm
sched.h644870644editdlrm
sched_clock.h16170644editdlrm
scif.h602800644editdlrm
scmi_protocol.h92840644editdlrm
scpi_protocol.h26420644editdlrm
screen_info.h1910644editdlrm
scs.h18280644editdlrm
sctp.h241240644editdlrm
scx200.h18630644editdlrm
scx200_gpio.h24380644editdlrm
sdb.h42700644editdlrm
sdla.h70660644editdlrm
seccomp.h29720644editdlrm
securebits.h2390644editdlrm
security.h515320644editdlrm
sed-opal.h19850644editdlrm
seg6.h1210644editdlrm
seg6_genl.h1360644editdlrm
seg6_hmac.h1360644editdlrm
seg6_iptunnel.h1480644editdlrm
seg6_local.h1000644editdlrm
selection.h15950644editdlrm
sem.h5990644editdlrm
semaphore.h14000644editdlrm
seqlock.h392440644editdlrm
seqno-fence.h40500644editdlrm
seq_buf.h34050644editdlrm
seq_file.h82910644editdlrm
seq_file_net.h7300644editdlrm
serdev.h101010644editdlrm
serial.h6300644editdlrm
serial_8250.h65810644editdlrm
serial_bcm63xx.h48430644editdlrm
serial_core.h180580644editdlrm
serial_max3100.h14230644editdlrm
serial_pnx8xxx.h26700644editdlrm
serial_s3c.h87840644editdlrm
serial_sci.h16110644editdlrm
serio.h45280644editdlrm
set_memory.h14970644editdlrm
sfi.h58900644editdlrm
sfi_acpi.h34720644editdlrm
sfp.h162160644editdlrm
shdma-base.h45200644editdlrm
shm.h9680644editdlrm
shmem_fs.h57790644editdlrm
shrinker.h33650644editdlrm
sh_clk.h60980644editdlrm
sh_dma.h36960644editdlrm
sh_eth.h3690644editdlrm
sh_intc.h35060644editdlrm
sh_timer.h1720644editdlrm
signal.h135130644editdlrm
signalfd.h8170644editdlrm
signal_types.h12410644editdlrm
siox.h20750644editdlrm
siphash.h47380644editdlrm
sirfsoc_dma.h1620644editdlrm
sizes.h14510644editdlrm
skbuff.h1388220644editdlrm
skb_array.h55120644editdlrm
skmsg.h135570644editdlrm
slab.h250990644editdlrm
slab_def.h30090644editdlrm
slimbus.h54100644editdlrm
slub_def.h65880644editdlrm
sm501-regs.h120460644editdlrm
sm501.h47430644editdlrm
smc91x.h16040644editdlrm
smc911x.h2940644editdlrm
smp.h70850644editdlrm
smpboot.h22150644editdlrm
smp_types.h13400644editdlrm
smsc911x.h23400644editdlrm
smscphy.h12830644editdlrm
socket.h144270644editdlrm
sockptr.h22790644editdlrm
sock_diag.h23700644editdlrm
sonet.h4690644editdlrm
sony-laptop.h14410644editdlrm
sonypi.h24100644editdlrm
sort.h2470644editdlrm
sound.h6850644editdlrm
soundcard.h16310644editdlrm
spinlock.h159330644editdlrm
spinlock_api_smp.h53460644editdlrm
spinlock_api_up.h33940644editdlrm
spinlock_rt.h42090644editdlrm
spinlock_types.h18260644editdlrm
spinlock_types_raw.h17260644editdlrm
spinlock_types_up.h7260644editdlrm
spinlock_up.h21260644editdlrm
splice.h29810644editdlrm
spmi.h60940644editdlrm
sram.h8440644editdlrm
srcu.h78580644editdlrm
srcutiny.h34110644editdlrm
srcutree.h54370644editdlrm
ssbi.h11400644editdlrm
stackdepot.h13090644editdlrm
stackprotector.h3610644editdlrm
stacktrace.h43010644editdlrm
start_kernel.h3340644editdlrm
stat.h12120644editdlrm
statfs.h13460644editdlrm
static_call.h70340644editdlrm
static_call_types.h5350644editdlrm
static_key.h300644editdlrm
stddef.h32750644editdlrm
stm.h44530644editdlrm
stmmac.h76070644editdlrm
stmp3xxx_rtc_wdt.h3320644editdlrm
stmp_device.h6190644editdlrm
stop_machine.h48420644editdlrm
string.h99090644editdlrm
stringhash.h27150644editdlrm
stringify.h3410644editdlrm
string_helpers.h30820644editdlrm
sudmac.h12690644editdlrm
sungem_phy.h40310644editdlrm
sunserialcore.h11020644editdlrm
sunxi-rsb.h29550644editdlrm
superhyway.h28780644editdlrm
suspend.h214830644editdlrm
svga.h38370644editdlrm
sw842.h3280644editdlrm
swab.h5690644editdlrm
swait.h102840644editdlrm
swap.h231090644editdlrm
swapfile.h5560644editdlrm
swapops.h88950644editdlrm
swap_cgroup.h9710644editdlrm
swap_slots.h8410644editdlrm
swiotlb.h54720644editdlrm
switchtec.h115300644editdlrm
sxgbe_platform.h13710644editdlrm
synclink.h9890644editdlrm
sync_core.h5810644editdlrm
sync_file.h16060644editdlrm
sys.h9600644editdlrm
syscalls.h519130644editdlrm
syscore_ops.h6350644editdlrm
sysctl.h77700644editdlrm
sysfs.h180900644editdlrm
syslog.h19310644editdlrm
sysrq.h18960644editdlrm
sysv_fs.h92500644editdlrm
sys_soc.h12630644editdlrm
t10-pi.h15380644editdlrm
taskstats_kern.h9570644editdlrm
task_io_accounting.h11590644editdlrm
task_io_accounting_ops.h26100644editdlrm
task_work.h7180644editdlrm
tboot.h40890644editdlrm
tc.h34890644editdlrm
tca6416_keypad.h8470644editdlrm
tcp.h180920644editdlrm
tee_drv.h166850644editdlrm
textsearch.h48420644editdlrm
textsearch_fsm.h12140644editdlrm
tfrc.h19330644editdlrm
thermal.h199280644editdlrm
thinkpad_acpi.h3200644editdlrm
threads.h13090644editdlrm
thread_info.h48690644editdlrm
thunderbolt.h214350644editdlrm
ti-emif-sram.h51500644editdlrm
tick.h96120644editdlrm
tifm.h49200644editdlrm
timb_dma.h17840644editdlrm
timb_gpio.h13080644editdlrm
time.h39160644editdlrm
time32.h60680644editdlrm
time64.h40550644editdlrm
timecounter.h46930644editdlrm
timekeeper_internal.h54550644editdlrm
timekeeping.h73810644editdlrm
timekeeping32.h20550644editdlrm
timer.h70920644editdlrm
timerfd.h5080644editdlrm
timeriomem-rng.h4750644editdlrm
timerqueue.h14980644editdlrm
timex.h64660644editdlrm
time_namespace.h32170644editdlrm
ti_wilink_st.h144040644editdlrm
tnum.h34670644editdlrm
topology.h62840644editdlrm
torture.h49530644editdlrm
toshiba.h9040644editdlrm
tpm.h113450644editdlrm
tpm_command.h8470644editdlrm
tpm_eventlog.h66860644editdlrm
trace.h13110644editdlrm
tracefs.h12210644editdlrm
tracehook.h72330644editdlrm
tracepoint-defs.h9050644editdlrm
tracepoint.h180030644editdlrm
trace_clock.h6670644editdlrm
trace_events.h210350644editdlrm
trace_seq.h41850644editdlrm
transport_class.h25700644editdlrm
ts-nbus.h5320644editdlrm
tsacct_kern.h12300644editdlrm
tty.h288220644editdlrm
tty_driver.h160170644editdlrm
tty_flip.h15450644editdlrm
tty_ldisc.h79370644editdlrm
typecheck.h7820644editdlrm
types.h56600644editdlrm
u64_stats_sync.h59570644editdlrm
uaccess.h137150644editdlrm
ucb1400.h43670644editdlrm
ucs2_string.h6620644editdlrm
udp.h55520644editdlrm
uidgid.h41710644editdlrm
uio.h97560644editdlrm
uio_driver.h41910644editdlrm
umh.h18370644editdlrm
units.h26850644editdlrm
uprobes.h67830644editdlrm
usb.h817210644editdlrm
usbdevice_fs.h22340644editdlrm
usb_usual.h36710644editdlrm
user-return-notifier.h12050644editdlrm
user.h220644editdlrm
userfaultfd_k.h46510644editdlrm
usermode_driver.h5150644editdlrm
user_namespace.h50840644editdlrm
util_macros.h11970644editdlrm
uts.h3880644editdlrm
utsname.h18280644editdlrm
uuid.h28330644editdlrm
uwb.h258270644editdlrm
vbox_utils.h16750644editdlrm
vdpa.h157560644editdlrm
verification.h19960644editdlrm
vermagic.h11590644editdlrm
vexpress.h14770644editdlrm
vfio.h73320644editdlrm
vfs.h1160644editdlrm
vgaarb.h39720644editdlrm
vga_switcheroo.h88280644editdlrm
vhost_iotlb.h13690644editdlrm
via-core.h74420644editdlrm
via-gpio.h3340644editdlrm
via.h9320644editdlrm
via_i2c.h15160644editdlrm
videodev2.h27690644editdlrm
virtio.h69150644editdlrm
virtio_byteorder.h14910644editdlrm
virtio_caif.h4920644editdlrm
virtio_config.h155170644editdlrm
virtio_console.h19740644editdlrm
virtio_dma_buf.h11470644editdlrm
virtio_net.h49640644editdlrm
virtio_pci_modern.h33790644editdlrm
virtio_ring.h30350644editdlrm
virtio_vsock.h46030644editdlrm
visorbus.h125250644editdlrm
vlynq.h39690644editdlrm
vmacache.h7220644editdlrm
vmalloc.h83670644editdlrm
vme.h57940644editdlrm
vmpressure.h17360644editdlrm
vmstat.h147390644editdlrm
vmw_vmci_api.h29540644editdlrm
vmw_vmci_defs.h309280644editdlrm
vm_event_item.h33850644editdlrm
vringh.h94860644editdlrm
vt.h6110644editdlrm
vtime.h41740644editdlrm
vt_buffer.h15240644editdlrm
vt_kern.h61790644editdlrm
w1-gpio.h6390644editdlrm
w1.h93450644editdlrm
wait.h432920644editdlrm
wait_bit.h115000644editdlrm
wanrouter.h2100644editdlrm
watchdog.h80020644editdlrm
win_minmax.h8320644editdlrm
wireless.h16070644editdlrm
wkup_m3_ipc.h15650644editdlrm
wl12xx.h14220644editdlrm
wm97xx.h108600644editdlrm
wmi.h19890644editdlrm
workqueue.h218560644editdlrm
writeback.h133740644editdlrm
ww_mutex.h130370644editdlrm
xarray.h591010644editdlrm
xattr.h35720644editdlrm
xxhash.h78290644editdlrm
xz.h114310644editdlrm
yam.h28880644editdlrm
z2_battery.h3180644editdlrm
zbud.h7400644editdlrm
zconf.h17700644editdlrm
zlib.h287840644editdlrm
zorro.h40300644editdlrm
zpool.h31020644editdlrm
zsmalloc.h17300644editdlrm
zstd.h498060644editdlrm
zutil.h27930644editdlrm
Edit: /usr/src/kernels/4.18.0-553.121.1.el8_10.x86_64/include/linux/mmzone.h (51615B)
/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_MMZONE_H #define _LINUX_MMZONE_H #ifndef __ASSEMBLY__ #ifndef __GENERATING_BOUNDS_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include RH_KABI_HIDE_INCLUDE() #include RH_KABI_HIDE_INCLUDE() #include /* Free memory management - zoned buddy allocator. */ #ifndef CONFIG_FORCE_MAX_ZONEORDER #define MAX_ORDER 11 #else #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER #endif #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1)) /* * PAGE_ALLOC_COSTLY_ORDER is the order at which allocations are deemed * costly to service. That is between allocation orders which should * coalesce naturally under reasonable reclaim pressure and those which * will not. */ #define PAGE_ALLOC_COSTLY_ORDER 3 enum migratetype { MIGRATE_UNMOVABLE, MIGRATE_MOVABLE, MIGRATE_RECLAIMABLE, MIGRATE_PCPTYPES, /* the number of types on the pcp lists */ MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES, #ifdef CONFIG_CMA /* * MIGRATE_CMA migration type is designed to mimic the way * ZONE_MOVABLE works. Only movable pages can be allocated * from MIGRATE_CMA pageblocks and page allocator never * implicitly change migration type of MIGRATE_CMA pageblock. * * The way to use it is to change migratetype of a range of * pageblocks to MIGRATE_CMA which can be done by * __free_pageblock_cma() function. What is important though * is that a range of pageblocks must be aligned to * MAX_ORDER_NR_PAGES should biggest page be bigger then * a single pageblock. */ MIGRATE_CMA, #endif #ifdef CONFIG_MEMORY_ISOLATION MIGRATE_ISOLATE, /* can't allocate from here */ #endif MIGRATE_TYPES }; /* In mm/page_alloc.c; keep in sync also with show_migration_types() there */ extern char * const migratetype_names[MIGRATE_TYPES]; #ifdef CONFIG_CMA # define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA) # define is_migrate_cma_page(_page) (get_pageblock_migratetype(_page) == MIGRATE_CMA) #else # define is_migrate_cma(migratetype) false # define is_migrate_cma_page(_page) false #endif static inline bool is_migrate_movable(int mt) { return is_migrate_cma(mt) || mt == MIGRATE_MOVABLE; } #define for_each_migratetype_order(order, type) \ for (order = 0; order < MAX_ORDER; order++) \ for (type = 0; type < MIGRATE_TYPES; type++) extern int page_group_by_mobility_disabled; #define NR_MIGRATETYPE_BITS (PB_migrate_end - PB_migrate + 1) #define MIGRATETYPE_MASK ((1UL << NR_MIGRATETYPE_BITS) - 1) #define get_pageblock_migratetype(page) \ get_pfnblock_flags_mask(page, page_to_pfn(page), \ PB_migrate_end, MIGRATETYPE_MASK) struct free_area { struct list_head free_list[MIGRATE_TYPES]; unsigned long nr_free; }; static inline struct page *get_page_from_free_area(struct free_area *area, int migratetype) { return list_first_entry_or_null(&area->free_list[migratetype], struct page, lru); } static inline bool free_area_empty(struct free_area *area, int migratetype) { return list_empty(&area->free_list[migratetype]); } struct pglist_data; /* * Add a wild amount of padding here to ensure datas fall into separate * cachelines. There are very few zone structures in the machine, so space * consumption is not a concern here. */ #if defined(CONFIG_SMP) struct zone_padding { char x[0]; } ____cacheline_internodealigned_in_smp; #define ZONE_PADDING(name) struct zone_padding name; #else #define ZONE_PADDING(name) #endif #ifdef CONFIG_NUMA enum numa_stat_item { NUMA_HIT, /* allocated in intended node */ NUMA_MISS, /* allocated in non intended node */ NUMA_FOREIGN, /* was intended here, hit elsewhere */ NUMA_INTERLEAVE_HIT, /* interleaver preferred this zone */ NUMA_LOCAL, /* allocation from local node */ NUMA_OTHER, /* allocation from other node */ NR_VM_NUMA_STAT_ITEMS }; #else #define NR_VM_NUMA_STAT_ITEMS 0 #endif enum zone_stat_item { /* First 128 byte cacheline (assuming 64 bit words) */ NR_FREE_PAGES, NR_ZONE_LRU_BASE, /* Used only for compaction and reclaim retry */ NR_ZONE_INACTIVE_ANON = NR_ZONE_LRU_BASE, NR_ZONE_ACTIVE_ANON, NR_ZONE_INACTIVE_FILE, NR_ZONE_ACTIVE_FILE, NR_ZONE_UNEVICTABLE, NR_ZONE_WRITE_PENDING, /* Count of dirty, writeback and unstable pages */ NR_MLOCK, /* mlock()ed pages found and moved off LRU */ RH_KABI_BROKEN_REMOVE_ENUM(NR_PAGETABLE) RH_KABI_BROKEN_REMOVE_ENUM(NR_KERNEL_STACK_KB) /* Second 128 byte cacheline */ NR_BOUNCE, #if IS_ENABLED(CONFIG_ZSMALLOC) NR_ZSPAGES, /* allocated in zsmalloc */ #endif NR_FREE_CMA_PAGES, NR_VM_ZONE_STAT_ITEMS }; enum node_stat_item { NR_LRU_BASE, NR_INACTIVE_ANON = NR_LRU_BASE, /* must match order of LRU_[IN]ACTIVE */ NR_ACTIVE_ANON, /* " " " " " */ NR_INACTIVE_FILE, /* " " " " " */ NR_ACTIVE_FILE, /* " " " " " */ NR_UNEVICTABLE, /* " " " " " */ NR_SLAB_RECLAIMABLE_B, NR_SLAB_UNRECLAIMABLE_B, NR_ISOLATED_ANON, /* Temporary isolated pages from anon lru */ NR_ISOLATED_FILE, /* Temporary isolated pages from file lru */ RH_KABI_BROKEN_INSERT_ENUM(WORKINGSET_NODES) WORKINGSET_REFAULT_BASE, RH_KABI_BROKEN_INSERT_ENUM(WORKINGSET_REFAULT_ANON = WORKINGSET_REFAULT_BASE) RH_KABI_BROKEN_INSERT_ENUM(WORKINGSET_REFAULT_FILE) WORKINGSET_ACTIVATE_BASE, RH_KABI_BROKEN_INSERT_ENUM(WORKINGSET_ACTIVATE_ANON = WORKINGSET_ACTIVATE_BASE) RH_KABI_BROKEN_INSERT_ENUM(WORKINGSET_ACTIVATE_FILE) RH_KABI_BROKEN_INSERT_ENUM(WORKINGSET_RESTORE_BASE) RH_KABI_BROKEN_INSERT_ENUM(WORKINGSET_RESTORE_ANON = WORKINGSET_RESTORE_BASE) RH_KABI_BROKEN_INSERT_ENUM(WORKINGSET_RESTORE_FILE) WORKINGSET_NODERECLAIM, NR_ANON_MAPPED, /* Mapped anonymous pages */ NR_FILE_MAPPED, /* pagecache pages mapped into pagetables. only modified from process context */ NR_FILE_PAGES, NR_FILE_DIRTY, NR_WRITEBACK, NR_WRITEBACK_TEMP, /* Writeback using temporary buffers */ NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */ NR_SHMEM_THPS, NR_SHMEM_PMDMAPPED, RH_KABI_BROKEN_INSERT_ENUM(NR_FILE_THPS) RH_KABI_BROKEN_INSERT_ENUM(NR_FILE_PMDMAPPED) NR_ANON_THPS, RH_KABI_BROKEN_REMOVE_ENUM(NR_UNSTABLE_NFS) NR_VMSCAN_WRITE, NR_VMSCAN_IMMEDIATE, /* Prioritise for reclaim when writeback ends */ NR_DIRTIED, /* page dirtyings since bootup */ NR_WRITTEN, /* page writings since bootup */ RH_KABI_BROKEN_INSERT_ENUM(NR_THROTTLED_WRITTEN) /* NR_WRITTEN while reclaim throttled */ RH_KABI_RENAME(NR_INDIRECTLY_RECLAIMABLE_BYTES, NR_KERNEL_MISC_RECLAIMABLE), /* reclaimable non-slab kernel pages */ RH_KABI_BROKEN_INSERT_ENUM(NR_FOLL_PIN_ACQUIRED) /* via: pin_user_page(), gup flag: FOLL_PIN */ RH_KABI_BROKEN_INSERT_ENUM(NR_FOLL_PIN_RELEASED) /* pages returned via unpin_user_page() */ RH_KABI_BROKEN_INSERT_ENUM(NR_KERNEL_STACK_KB) /* measured in KiB */ #if IS_ENABLED(CONFIG_SHADOW_CALL_STACK) NR_KERNEL_SCS_KB, /* measured in KiB */ #endif RH_KABI_BROKEN_INSERT_ENUM(NR_PAGETABLE) /* used for pagetables */ #ifdef CONFIG_SWAP RH_KABI_BROKEN_INSERT_ENUM(NR_SWAPCACHE) #endif NR_VM_NODE_STAT_ITEMS }; /* * Returns true if the item should be printed in THPs (/proc/vmstat * currently prints number of anon, file and shmem THPs. But the item * is charged in pages). */ static __always_inline bool vmstat_item_print_in_thp(enum node_stat_item item) { if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) return false; return item == NR_ANON_THPS || item == NR_FILE_THPS || item == NR_SHMEM_THPS || item == NR_SHMEM_PMDMAPPED || item == NR_FILE_PMDMAPPED; } /* * Returns true if the value is measured in bytes (most vmstat values are * measured in pages). This defines the API part, the internal representation * might be different. */ static __always_inline bool vmstat_item_in_bytes(int idx) { /* * Global and per-node slab counters track slab pages. * It's expected that changes are multiples of PAGE_SIZE. * Internally values are stored in pages. * * Per-memcg and per-lruvec counters track memory, consumed * by individual slab objects. These counters are actually * byte-precise. */ return (idx == NR_SLAB_RECLAIMABLE_B || idx == NR_SLAB_UNRECLAIMABLE_B); } /* * We do arithmetic on the LRU lists in various places in the code, * so it is important to keep the active lists LRU_ACTIVE higher in * the array than the corresponding inactive lists, and to keep * the *_FILE lists LRU_FILE higher than the corresponding _ANON lists. * * This has to be kept in sync with the statistics in zone_stat_item * above and the descriptions in vmstat_text in mm/vmstat.c */ #define LRU_BASE 0 #define LRU_ACTIVE 1 #define LRU_FILE 2 enum lru_list { LRU_INACTIVE_ANON = LRU_BASE, LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE, LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE, LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE, LRU_UNEVICTABLE, NR_LRU_LISTS }; enum vmscan_throttle_state { VMSCAN_THROTTLE_WRITEBACK, VMSCAN_THROTTLE_ISOLATED, VMSCAN_THROTTLE_NOPROGRESS, VMSCAN_THROTTLE_CONGESTED, NR_VMSCAN_THROTTLE, }; #define for_each_lru(lru) for (lru = 0; lru < NR_LRU_LISTS; lru++) #define for_each_evictable_lru(lru) for (lru = 0; lru <= LRU_ACTIVE_FILE; lru++) static inline bool is_file_lru(enum lru_list lru) { return (lru == LRU_INACTIVE_FILE || lru == LRU_ACTIVE_FILE); } static inline bool is_active_lru(enum lru_list lru) { return (lru == LRU_ACTIVE_ANON || lru == LRU_ACTIVE_FILE); } struct zone_reclaim_stat { /* * The pageout code in vmscan.c keeps track of how many of the * mem/swap backed and file backed pages are referenced. * The higher the rotated/scanned ratio, the more valuable * that cache is. * * The anon LRU stats live in [0], file LRU stats in [1] */ unsigned long recent_rotated[2]; unsigned long recent_scanned[2]; }; #define ANON_AND_FILE 2 enum lruvec_flags { LRUVEC_CONGESTED, /* lruvec has many dirty pages * backed by a congested BDI */ }; struct lruvec { struct list_head lists[NR_LRU_LISTS]; /* * These track the cost of reclaiming one LRU - file or anon - * over the other. As the observed cost of reclaiming one LRU * increases, the reclaim scan balance tips toward the other. */ RH_KABI_REPLACE_SPLIT( struct zone_reclaim_stat reclaim_stat, unsigned long anon_cost, unsigned long file_cost, /* Refaults at the time of last reclaim cycle */ unsigned long refaults[ANON_AND_FILE]) /* Non-resident age, driven by LRU movement */ atomic_long_t RH_KABI_RENAME(inactive_age, nonresident_age); /* Various lruvec state flags (enum lruvec_flags) */ RH_KABI_REPLACE(unsigned long refaults, unsigned long flags) #ifdef CONFIG_MEMCG struct pglist_data *pgdat; #endif /* per lruvec lru_lock for memcg */ RH_KABI_BROKEN_INSERT(spinlock_t lru_lock) }; /* Isolate unmapped file */ #define ISOLATE_UNMAPPED ((__force isolate_mode_t)0x2) /* Isolate for asynchronous migration */ #define ISOLATE_ASYNC_MIGRATE ((__force isolate_mode_t)0x4) /* Isolate unevictable pages */ #define ISOLATE_UNEVICTABLE ((__force isolate_mode_t)0x8) /* LRU Isolation modes. */ typedef unsigned __bitwise isolate_mode_t; enum zone_watermarks { WMARK_MIN, WMARK_LOW, WMARK_HIGH, NR_WMARK }; #define min_wmark_pages(z) (z->_watermark[WMARK_MIN] + z->watermark_boost) #define low_wmark_pages(z) (z->_watermark[WMARK_LOW] + z->watermark_boost) #define high_wmark_pages(z) (z->_watermark[WMARK_HIGH] + z->watermark_boost) #define wmark_pages(z, i) (z->_watermark[i] + z->watermark_boost) struct per_cpu_pages { int count; /* number of pages in the list */ int high; /* high watermark, emptying needed */ int batch; /* chunk size for buddy add/remove */ /* Lists of pages, one per migrate type stored on the pcp-lists */ struct list_head lists[MIGRATE_PCPTYPES]; }; struct per_cpu_pageset { struct per_cpu_pages pcp; #ifdef CONFIG_NUMA s8 expire; u16 vm_numa_stat_diff[NR_VM_NUMA_STAT_ITEMS]; #endif #ifdef CONFIG_SMP s8 stat_threshold; s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS]; #endif }; struct per_cpu_nodestat { s8 stat_threshold; s8 vm_node_stat_diff[NR_VM_NODE_STAT_ITEMS]; }; #endif /* !__GENERATING_BOUNDS.H */ enum zone_type { #ifdef CONFIG_ZONE_DMA /* * ZONE_DMA is used when there are devices that are not able * to do DMA to all of addressable memory (ZONE_NORMAL). Then we * carve out the portion of memory that is needed for these devices. * The range is arch specific. * * Some examples * * Architecture Limit * --------------------------- * parisc, ia64, sparc <4G * s390, powerpc <2G * arm Various * alpha Unlimited or 0-16MB. * * i386, x86_64 and multiple other arches * <16M. */ ZONE_DMA, #endif #ifdef CONFIG_ZONE_DMA32 /* * x86_64 needs two ZONE_DMAs because it supports devices that are * only able to do DMA to the lower 16M but also 32 bit devices that * can only do DMA areas below 4G. */ ZONE_DMA32, #endif /* * Normal addressable memory is in ZONE_NORMAL. DMA operations can be * performed on pages in ZONE_NORMAL if the DMA devices support * transfers to all addressable memory. */ ZONE_NORMAL, #ifdef CONFIG_HIGHMEM /* * A memory area that is only addressable by the kernel through * mapping portions into its own address space. This is for example * used by i386 to allow the kernel to address the memory beyond * 900MB. The kernel will set up special mappings (page * table entries on i386) for each page that the kernel needs to * access. */ ZONE_HIGHMEM, #endif /* * ZONE_MOVABLE is similar to ZONE_NORMAL, except that it contains * movable pages with few exceptional cases described below. Main use * cases for ZONE_MOVABLE are to make memory offlining/unplug more * likely to succeed, and to locally limit unmovable allocations - e.g., * to increase the number of THP/huge pages. Notable special cases are: * * 1. Pinned pages: (long-term) pinning of movable pages might * essentially turn such pages unmovable. Therefore, we do not allow * pinning long-term pages in ZONE_MOVABLE. When pages are pinned and * faulted, they come from the right zone right away. However, it is * still possible that address space already has pages in * ZONE_MOVABLE at the time when pages are pinned (i.e. user has * touches that memory before pinning). In such case we migrate them * to a different zone. When migration fails - pinning fails. * 2. memblock allocations: kernelcore/movablecore setups might create * situations where ZONE_MOVABLE contains unmovable allocations * after boot. Memory offlining and allocations fail early. * 3. Memory holes: kernelcore/movablecore setups might create very rare * situations where ZONE_MOVABLE contains memory holes after boot, * for example, if we have sections that are only partially * populated. Memory offlining and allocations fail early. * 4. PG_hwpoison pages: while poisoned pages can be skipped during * memory offlining, such pages cannot be allocated. * 5. Unmovable PG_offline pages: in paravirtualized environments, * hotplugged memory blocks might only partially be managed by the * buddy (e.g., via XEN-balloon, Hyper-V balloon, virtio-mem). The * parts not manged by the buddy are unmovable PG_offline pages. In * some cases (virtio-mem), such pages can be skipped during * memory offlining, however, cannot be moved/allocated. These * techniques might use alloc_contig_range() to hide previously * exposed pages from the buddy again (e.g., to implement some sort * of memory unplug in virtio-mem). * * In general, no unmovable allocations that degrade memory offlining * should end up in ZONE_MOVABLE. Allocators (like alloc_contig_range()) * have to expect that migrating pages in ZONE_MOVABLE can fail (even * if has_unmovable_pages() states that there are no unmovable pages, * there can be false negatives). */ ZONE_MOVABLE, #ifdef CONFIG_ZONE_DEVICE ZONE_DEVICE, #endif __MAX_NR_ZONES }; #ifndef __GENERATING_BOUNDS_H #define ASYNC_AND_SYNC 2 struct zone { /* Read-mostly fields */ /* zone watermarks, access with *_wmark_pages(zone) macros */ unsigned long RH_KABI_RENAME(watermark, _watermark)[NR_WMARK]; unsigned long nr_reserved_highatomic; /* * We don't know if the memory that we're going to allocate will be * freeable or/and it will be released eventually, so to avoid totally * wasting several GB of ram we must reserve some of the lower zone * memory (otherwise we risk to run OOM on the lower zones despite * there being tons of freeable ram on the higher zones). This array is * recalculated at runtime if the sysctl_lowmem_reserve_ratio sysctl * changes. */ long lowmem_reserve[MAX_NR_ZONES]; #ifdef CONFIG_NUMA int node; #endif struct pglist_data *zone_pgdat; struct per_cpu_pageset __percpu *pageset; #ifndef CONFIG_SPARSEMEM /* * Flags for a pageblock_nr_pages block. See pageblock-flags.h. * In SPARSEMEM, this map is stored in struct mem_section */ unsigned long *pageblock_flags; #endif /* CONFIG_SPARSEMEM */ /* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */ unsigned long zone_start_pfn; /* * spanned_pages is the total pages spanned by the zone, including * holes, which is calculated as: * spanned_pages = zone_end_pfn - zone_start_pfn; * * present_pages is physical pages existing within the zone, which * is calculated as: * present_pages = spanned_pages - absent_pages(pages in holes); * * managed_pages is present pages managed by the buddy system, which * is calculated as (reserved_pages includes pages allocated by the * bootmem allocator): * managed_pages = present_pages - reserved_pages; * * So present_pages may be used by memory hotplug or memory power * management logic to figure out unmanaged pages by checking * (present_pages - managed_pages). And managed_pages should be used * by page allocator and vm scanner to calculate all kinds of watermarks * and thresholds. * * Locking rules: * * zone_start_pfn and spanned_pages are protected by span_seqlock. * It is a seqlock because it has to be read outside of zone->lock, * and it is done in the main allocator path. But, it is written * quite infrequently. * * The span_seq lock is declared along with zone->lock because it is * frequently read in proximity to zone->lock. It's good to * give them a chance of being in the same cacheline. * * Write access to present_pages at runtime should be protected by * mem_hotplug_begin/end(). Any reader who can't tolerant drift of * present_pages should get_online_mems() to get a stable value. */ RH_KABI_REPLACE( unsigned long managed_pages, atomic_long_t managed_pages) unsigned long spanned_pages; unsigned long present_pages; const char *name; #ifdef CONFIG_MEMORY_ISOLATION /* * Number of isolated pageblock. It is used to solve incorrect * freepage counting problem due to racy retrieving migratetype * of pageblock. Protected by zone->lock. */ unsigned long nr_isolate_pageblock; #endif #ifdef CONFIG_MEMORY_HOTPLUG /* see spanned/present_pages for more description */ #ifndef __aarch64__ seqlock_t span_seqlock; #endif #endif int initialized; RH_KABI_FILL_HOLE(unsigned long watermark_boost) /* * the high and batch values are copied to individual pagesets for * faster access. * Utilizes a hole in the KABI between watermark_boost and zone padding */ RH_KABI_FILL_HOLE(int pageset_high) RH_KABI_FILL_HOLE(int pageset_batch) #ifdef CONFIG_MEMORY_HOTPLUG #ifdef __aarch64__ RH_KABI_FILL_HOLE(seqlock_t span_seqlock) #endif #endif /* Write-intensive fields used from the page allocator */ ZONE_PADDING(_pad1_) /* free areas of different sizes */ struct free_area free_area[MAX_ORDER]; /* zone flags, see below */ unsigned long flags; /* Primarily protects free_area */ spinlock_t lock; /* Write-intensive fields used by compaction and vmstats. */ ZONE_PADDING(_pad2_) /* * When free pages are below this point, additional steps are taken * when reading the number of free pages to avoid per-cpu counter * drift allowing watermarks to be breached */ unsigned long percpu_drift_mark; #if defined CONFIG_COMPACTION || defined CONFIG_CMA /* pfn where compaction free scanner should start */ unsigned long compact_cached_free_pfn; /* pfn where compaction migration scanner should start */ unsigned long compact_cached_migrate_pfn[ASYNC_AND_SYNC]; #endif #ifdef CONFIG_COMPACTION /* * On compaction failure, 1<managed_pages); } static inline unsigned long zone_end_pfn(const struct zone *zone) { return zone->zone_start_pfn + zone->spanned_pages; } static inline bool zone_spans_pfn(const struct zone *zone, unsigned long pfn) { return zone->zone_start_pfn <= pfn && pfn < zone_end_pfn(zone); } static inline bool zone_is_initialized(struct zone *zone) { return zone->initialized; } static inline bool zone_is_empty(struct zone *zone) { return zone->spanned_pages == 0; } /* * Return true if [start_pfn, start_pfn + nr_pages) range has a non-empty * intersection with the given zone */ static inline bool zone_intersects(struct zone *zone, unsigned long start_pfn, unsigned long nr_pages) { if (zone_is_empty(zone)) return false; if (start_pfn >= zone_end_pfn(zone) || start_pfn + nr_pages <= zone->zone_start_pfn) return false; return true; } /* * The "priority" of VM scanning is how much of the queues we will scan in one * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the * queues ("queue_length >> 12") during an aging round. */ #define DEF_PRIORITY 12 /* Maximum number of zones on a zonelist */ #define MAX_ZONES_PER_ZONELIST (MAX_NUMNODES * MAX_NR_ZONES) enum { ZONELIST_FALLBACK, /* zonelist with fallback */ #ifdef CONFIG_NUMA /* * The NUMA zonelists are doubled because we need zonelists that * restrict the allocations to a single node for __GFP_THISNODE. */ ZONELIST_NOFALLBACK, /* zonelist without fallback (__GFP_THISNODE) */ #endif MAX_ZONELISTS }; /* * This struct contains information about a zone in a zonelist. It is stored * here to avoid dereferences into large structures and lookups of tables */ struct zoneref { struct zone *zone; /* Pointer to actual zone */ int zone_idx; /* zone_idx(zoneref->zone) */ }; /* * One allocation request operates on a zonelist. A zonelist * is a list of zones, the first one is the 'goal' of the * allocation, the other zones are fallback zones, in decreasing * priority. * * To speed the reading of the zonelist, the zonerefs contain the zone index * of the entry being read. Helper functions to access information given * a struct zoneref are * * zonelist_zone() - Return the struct zone * for an entry in _zonerefs * zonelist_zone_idx() - Return the index of the zone for an entry * zonelist_node_idx() - Return the index of the node for an entry */ struct zonelist { struct zoneref _zonerefs[MAX_ZONES_PER_ZONELIST + 1]; }; #ifndef CONFIG_DISCONTIGMEM /* The array of struct pages - for discontigmem use pgdat->lmem_map */ extern struct page *mem_map; #endif #ifdef CONFIG_TRANSPARENT_HUGEPAGE struct deferred_split { spinlock_t split_queue_lock; struct list_head split_queue; unsigned long split_queue_len; }; #endif /* * On NUMA machines, each NUMA node would have a pg_data_t to describe * it's memory layout. On UMA machines there is a single pglist_data which * describes the whole memory. * * Memory statistics and page replacement data structures are maintained on a * per-zone basis. */ struct bootmem_data; typedef struct pglist_data { struct zone node_zones[MAX_NR_ZONES]; struct zonelist node_zonelists[MAX_ZONELISTS]; int nr_zones; #ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */ struct page *node_mem_map; #ifdef CONFIG_PAGE_EXTENSION struct page_ext *node_page_ext; #endif #endif #if defined(CONFIG_MEMORY_HOTPLUG) || defined(CONFIG_DEFERRED_STRUCT_PAGE_INIT) /* * Must be held any time you expect node_start_pfn, * node_present_pages, node_spanned_pages or nr_zones to stay constant. * Also synchronizes pgdat->first_deferred_pfn during deferred page * init. * * pgdat_resize_lock() and pgdat_resize_unlock() are provided to * manipulate node_size_lock without checking for CONFIG_MEMORY_HOTPLUG * or CONFIG_DEFERRED_STRUCT_PAGE_INIT. * * Nests above zone->lock and zone->span_seqlock */ #ifndef __aarch64__ spinlock_t node_size_lock; #endif #endif unsigned long node_start_pfn; unsigned long node_present_pages; /* total number of physical pages */ unsigned long node_spanned_pages; /* total size of physical page range, including holes */ int node_id; wait_queue_head_t kswapd_wait; wait_queue_head_t pfmemalloc_wait; struct task_struct *kswapd; /* Protected by mem_hotplug_begin/end() */ int kswapd_order; enum zone_type RH_KABI_RENAME(kswapd_classzone_idx, kswapd_highest_zoneidx); int kswapd_failures; /* Number of 'reclaimed == 0' runs */ #ifdef CONFIG_COMPACTION int kcompactd_max_order; enum zone_type RH_KABI_RENAME(kcompactd_classzone_idx, kcompactd_highest_zoneidx); wait_queue_head_t kcompactd_wait; struct task_struct *kcompactd; #endif #ifdef CONFIG_NUMA_BALANCING /* Lock serializing the migrate rate limiting window */ RH_KABI_DEPRECATE(spinlock_t, numabalancing_migrate_lock) /* Rate limiting time interval */ RH_KABI_DEPRECATE(unsigned long, numabalancing_migrate_next_window) /* Number of pages migrated during the rate limiting time interval */ RH_KABI_DEPRECATE(unsigned long, numabalancing_migrate_nr_pages) #endif /* * This is a per-node reserve of pages that are not available * to userspace allocations. */ unsigned long totalreserve_pages; #ifdef CONFIG_NUMA /* * zone reclaim becomes active if more unmapped pages exist. */ unsigned long min_unmapped_pages; unsigned long min_slab_pages; #endif /* CONFIG_NUMA */ #ifdef CONFIG_MEMORY_HOTPLUG #ifdef __aarch64__ RH_KABI_FILL_HOLE(spinlock_t node_size_lock) #endif #endif /* Write-intensive fields used by page reclaim */ ZONE_PADDING(_pad1_) RH_KABI_DEPRECATE(spinlock_t, lru_lock) #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT /* * If memory initialisation on large machines is deferred then this * is the first PFN that needs to be initialised. */ unsigned long first_deferred_pfn; RH_KABI_DEPRECATE(unsigned long, static_init_pgcnt) #endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */ #ifdef CONFIG_TRANSPARENT_HUGEPAGE #ifdef __GENKSYMS__ spinlock_t split_queue_lock; struct list_head split_queue; unsigned long split_queue_len; #else struct deferred_split deferred_split_queue; #endif #endif /* Fields commonly accessed by the page reclaim scanner */ /* * NOTE: THIS IS UNUSED IF MEMCG IS ENABLED. * * Use mem_cgroup_lruvec() to look up lruvecs. */ struct lruvec RH_KABI_RENAME(lruvec, __lruvec); unsigned long flags; ZONE_PADDING(_pad2_) RH_KABI_USE(1, atomic_t nr_writeback_throttled) /* nr of writeback-throttled tasks */ RH_KABI_USE(2, unsigned long nr_reclaim_start) /* nr pages written while throttled * when throttling started. */ /* * kABI note: * Anything inserted after here will change the offset of vm_stat[] * and per_cpu_nodestats which are not supposed to be accessed by * 3rd party kernel modules anyway. */ /* workqueues for throttling reclaim for different reasons. */ RH_KABI_BROKEN_INSERT(wait_queue_head_t reclaim_wait[NR_VMSCAN_THROTTLE]) /* Per-node vmstats */ struct per_cpu_nodestat __percpu *per_cpu_nodestats; atomic_long_t vm_stat[NR_VM_NODE_STAT_ITEMS]; } pg_data_t; #define node_present_pages(nid) (NODE_DATA(nid)->node_present_pages) #define node_spanned_pages(nid) (NODE_DATA(nid)->node_spanned_pages) #ifdef CONFIG_FLAT_NODE_MEM_MAP #define pgdat_page_nr(pgdat, pagenr) ((pgdat)->node_mem_map + (pagenr)) #else #define pgdat_page_nr(pgdat, pagenr) pfn_to_page((pgdat)->node_start_pfn + (pagenr)) #endif #define nid_page_nr(nid, pagenr) pgdat_page_nr(NODE_DATA(nid),(pagenr)) #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) #define node_end_pfn(nid) pgdat_end_pfn(NODE_DATA(nid)) static inline unsigned long pgdat_end_pfn(pg_data_t *pgdat) { return pgdat->node_start_pfn + pgdat->node_spanned_pages; } static inline bool pgdat_is_empty(pg_data_t *pgdat) { return !pgdat->node_start_pfn && !pgdat->node_spanned_pages; } static inline int zone_id(const struct zone *zone) { struct pglist_data *pgdat = zone->zone_pgdat; return zone - pgdat->node_zones; } #include void build_all_zonelists(pg_data_t *pgdat); void wakeup_kswapd(struct zone *zone, gfp_t gfp_mask, int order, enum zone_type highest_zoneidx); bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark, int highest_zoneidx, unsigned int alloc_flags, long free_pages); bool zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark, int highest_zoneidx, unsigned int alloc_flags); bool zone_watermark_ok_safe(struct zone *z, unsigned int order, unsigned long mark, int highest_zoneidx); /* * Memory initialization context, use to differentiate memory added by * the platform statically or via memory hotplug interface. */ enum meminit_context { MEMINIT_EARLY, MEMINIT_HOTPLUG, }; extern void init_currently_empty_zone(struct zone *zone, unsigned long start_pfn, unsigned long size); extern void lruvec_init(struct lruvec *lruvec); static inline struct pglist_data *lruvec_pgdat(struct lruvec *lruvec) { #ifdef CONFIG_MEMCG return lruvec->pgdat; #else return container_of(lruvec, struct pglist_data, __lruvec); #endif } #ifdef CONFIG_HAVE_MEMORY_PRESENT void memory_present(int nid, unsigned long start, unsigned long end); #else static inline void memory_present(int nid, unsigned long start, unsigned long end) {} #endif #ifdef CONFIG_HAVE_MEMORYLESS_NODES int local_memory_node(int node_id); #else static inline int local_memory_node(int node_id) { return node_id; }; #endif /* * zone_idx() returns 0 for the ZONE_DMA zone, 1 for the ZONE_NORMAL zone, etc. */ #define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones) #ifdef CONFIG_ZONE_DEVICE static inline bool zone_is_zone_device(struct zone *zone) { return zone_idx(zone) == ZONE_DEVICE; } #else static inline bool zone_is_zone_device(struct zone *zone) { return false; } #endif /* * Returns true if a zone has pages managed by the buddy allocator. * All the reclaim decisions have to use this function rather than * populated_zone(). If the whole zone is reserved then we can easily * end up with populated_zone() && !managed_zone(). */ static inline bool managed_zone(struct zone *zone) { return zone_managed_pages(zone); } /* Returns true if a zone has memory */ static inline bool populated_zone(struct zone *zone) { return zone->present_pages; } #ifdef CONFIG_NUMA static inline int zone_to_nid(struct zone *zone) { return zone->node; } static inline void zone_set_nid(struct zone *zone, int nid) { zone->node = nid; } #else static inline int zone_to_nid(struct zone *zone) { return 0; } static inline void zone_set_nid(struct zone *zone, int nid) {} #endif extern int movable_zone; static inline int is_highmem_idx(enum zone_type idx) { #ifdef CONFIG_HIGHMEM return (idx == ZONE_HIGHMEM || (idx == ZONE_MOVABLE && movable_zone == ZONE_HIGHMEM)); #else return 0; #endif } #ifdef CONFIG_ZONE_DMA bool has_managed_dma(void); #else static inline bool has_managed_dma(void) { return false; } #endif /** * is_highmem - helper function to quickly check if a struct zone is a * highmem zone or not. This is an attempt to keep references * to ZONE_{DMA/NORMAL/HIGHMEM/etc} in general code to a minimum. * @zone - pointer to struct zone variable */ static inline int is_highmem(struct zone *zone) { #ifdef CONFIG_HIGHMEM return is_highmem_idx(zone_idx(zone)); #else return 0; #endif } /* These two functions are used to setup the per zone pages min values */ struct ctl_table; int min_free_kbytes_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); int watermark_boost_factor_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); int watermark_scale_factor_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES]; int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); extern int numa_zonelist_order_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); extern char numa_zonelist_order[]; #define NUMA_ZONELIST_ORDER_LEN 16 #ifndef CONFIG_NEED_MULTIPLE_NODES extern struct pglist_data contig_page_data; #define NODE_DATA(nid) (&contig_page_data) #define NODE_MEM_MAP(nid) mem_map #else /* CONFIG_NEED_MULTIPLE_NODES */ #include #endif /* !CONFIG_NEED_MULTIPLE_NODES */ extern struct pglist_data *first_online_pgdat(void); extern struct pglist_data *next_online_pgdat(struct pglist_data *pgdat); extern struct zone *next_zone(struct zone *zone); /** * for_each_online_pgdat - helper macro to iterate over all online nodes * @pgdat - pointer to a pg_data_t variable */ #define for_each_online_pgdat(pgdat) \ for (pgdat = first_online_pgdat(); \ pgdat; \ pgdat = next_online_pgdat(pgdat)) /** * for_each_zone - helper macro to iterate over all memory zones * @zone - pointer to struct zone variable * * The user only needs to declare the zone variable, for_each_zone * fills it in. */ #define for_each_zone(zone) \ for (zone = (first_online_pgdat())->node_zones; \ zone; \ zone = next_zone(zone)) #define for_each_populated_zone(zone) \ for (zone = (first_online_pgdat())->node_zones; \ zone; \ zone = next_zone(zone)) \ if (!populated_zone(zone)) \ ; /* do nothing */ \ else static inline struct zone *zonelist_zone(struct zoneref *zoneref) { return zoneref->zone; } static inline int zonelist_zone_idx(struct zoneref *zoneref) { return zoneref->zone_idx; } static inline int zonelist_node_idx(struct zoneref *zoneref) { return zone_to_nid(zoneref->zone); } struct zoneref *__next_zones_zonelist(struct zoneref *z, enum zone_type highest_zoneidx, nodemask_t *nodes); /** * next_zones_zonelist - Returns the next zone at or below highest_zoneidx within the allowed nodemask using a cursor within a zonelist as a starting point * @z - The cursor used as a starting point for the search * @highest_zoneidx - The zone index of the highest zone to return * @nodes - An optional nodemask to filter the zonelist with * * This function returns the next zone at or below a given zone index that is * within the allowed nodemask using a cursor as the starting point for the * search. The zoneref returned is a cursor that represents the current zone * being examined. It should be advanced by one before calling * next_zones_zonelist again. */ static __always_inline struct zoneref *next_zones_zonelist(struct zoneref *z, enum zone_type highest_zoneidx, nodemask_t *nodes) { if (likely(!nodes && zonelist_zone_idx(z) <= highest_zoneidx)) return z; return __next_zones_zonelist(z, highest_zoneidx, nodes); } /** * first_zones_zonelist - Returns the first zone at or below highest_zoneidx within the allowed nodemask in a zonelist * @zonelist - The zonelist to search for a suitable zone * @highest_zoneidx - The zone index of the highest zone to return * @nodes - An optional nodemask to filter the zonelist with * @return - Zoneref pointer for the first suitable zone found (see below) * * This function returns the first zone at or below a given zone index that is * within the allowed nodemask. The zoneref returned is a cursor that can be * used to iterate the zonelist with next_zones_zonelist by advancing it by * one before calling. * * When no eligible zone is found, zoneref->zone is NULL (zoneref itself is * never NULL). This may happen either genuinely, or due to concurrent nodemask * update due to cpuset modification. */ static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist, enum zone_type highest_zoneidx, nodemask_t *nodes) { return next_zones_zonelist(zonelist->_zonerefs, highest_zoneidx, nodes); } /** * for_each_zone_zonelist_nodemask - helper macro to iterate over valid zones in a zonelist at or below a given zone index and within a nodemask * @zone - The current zone in the iterator * @z - The current pointer within zonelist->zones being iterated * @zlist - The zonelist being iterated * @highidx - The zone index of the highest zone to return * @nodemask - Nodemask allowed by the allocator * * This iterator iterates though all zones at or below a given zone index and * within a given nodemask */ #define for_each_zone_zonelist_nodemask(zone, z, zlist, highidx, nodemask) \ for (z = first_zones_zonelist(zlist, highidx, nodemask), zone = zonelist_zone(z); \ zone; \ z = next_zones_zonelist(++z, highidx, nodemask), \ zone = zonelist_zone(z)) #define for_next_zone_zonelist_nodemask(zone, z, zlist, highidx, nodemask) \ for (zone = z->zone; \ zone; \ z = next_zones_zonelist(++z, highidx, nodemask), \ zone = zonelist_zone(z)) /** * for_each_zone_zonelist - helper macro to iterate over valid zones in a zonelist at or below a given zone index * @zone - The current zone in the iterator * @z - The current pointer within zonelist->zones being iterated * @zlist - The zonelist being iterated * @highidx - The zone index of the highest zone to return * * This iterator iterates though all zones at or below a given zone index. */ #define for_each_zone_zonelist(zone, z, zlist, highidx) \ for_each_zone_zonelist_nodemask(zone, z, zlist, highidx, NULL) /* Whether the 'nodes' are all movable nodes */ static inline bool movable_only_nodes(nodemask_t *nodes) { struct zonelist *zonelist; struct zoneref *z; int nid; if (nodes_empty(*nodes)) return false; /* * We can chose arbitrary node from the nodemask to get a * zonelist as they are interlinked. We just need to find * at least one zone that can satisfy kernel allocations. */ nid = first_node(*nodes); zonelist = &NODE_DATA(nid)->node_zonelists[ZONELIST_FALLBACK]; z = first_zones_zonelist(zonelist, ZONE_NORMAL, nodes); return (!z->zone) ? true : false; } #ifdef CONFIG_SPARSEMEM #include #endif #ifdef CONFIG_FLATMEM #define pfn_to_nid(pfn) (0) #endif #ifdef CONFIG_SPARSEMEM /* * SECTION_SHIFT #bits space required to store a section # * * PA_SECTION_SHIFT physical address to/from section number * PFN_SECTION_SHIFT pfn to/from section number */ #define PA_SECTION_SHIFT (SECTION_SIZE_BITS) #define PFN_SECTION_SHIFT (SECTION_SIZE_BITS - PAGE_SHIFT) #define NR_MEM_SECTIONS (1UL << SECTIONS_SHIFT) #define PAGES_PER_SECTION (1UL << PFN_SECTION_SHIFT) #define PAGE_SECTION_MASK (~(PAGES_PER_SECTION-1)) #define SECTION_BLOCKFLAGS_BITS \ ((1UL << (PFN_SECTION_SHIFT - pageblock_order)) * NR_PAGEBLOCK_BITS) #if (MAX_ORDER - 1 + PAGE_SHIFT) > SECTION_SIZE_BITS #error Allocator MAX_ORDER exceeds SECTION_SIZE #endif static inline unsigned long pfn_to_section_nr(unsigned long pfn) { return pfn >> PFN_SECTION_SHIFT; } static inline unsigned long section_nr_to_pfn(unsigned long sec) { return sec << PFN_SECTION_SHIFT; } #define SECTION_ALIGN_UP(pfn) (((pfn) + PAGES_PER_SECTION - 1) & PAGE_SECTION_MASK) #define SECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SECTION_MASK) #define SUBSECTION_SHIFT 21 #define SUBSECTION_SIZE (1UL << SUBSECTION_SHIFT) #define PFN_SUBSECTION_SHIFT (SUBSECTION_SHIFT - PAGE_SHIFT) #define PAGES_PER_SUBSECTION (1UL << PFN_SUBSECTION_SHIFT) #define PAGE_SUBSECTION_MASK (~(PAGES_PER_SUBSECTION-1)) #if SUBSECTION_SHIFT > SECTION_SIZE_BITS #error Subsection size exceeds section size #else #define SUBSECTIONS_PER_SECTION (1UL << (SECTION_SIZE_BITS - SUBSECTION_SHIFT)) #endif #define SUBSECTION_ALIGN_UP(pfn) ALIGN((pfn), PAGES_PER_SUBSECTION) #define SUBSECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SUBSECTION_MASK) struct mem_section_usage { struct rcu_head rcu; DECLARE_BITMAP(subsection_map, SUBSECTIONS_PER_SECTION); /* See declaration of similar field in struct zone */ unsigned long pageblock_flags[0]; }; void subsection_map_init(unsigned long pfn, unsigned long nr_pages); struct page; struct page_ext; struct mem_section { /* * This is, logically, a pointer to an array of struct * pages. However, it is stored with some other magic. * (see sparse.c::sparse_init_one_section()) * * Additionally during early boot we encode node id of * the location of the section here to guide allocation. * (see sparse.c::memory_present()) * * Making it a UL at least makes someone do a cast * before using it wrong. */ unsigned long section_mem_map; RH_KABI_REPLACE( unsigned long *pageblock_flags, struct mem_section_usage *usage) #if defined(CONFIG_PAGE_EXTENSION) && !defined(__GENKSYMS__) /* * If SPARSEMEM, pgdat doesn't have page_ext pointer. We use * section. (see page_ext.h about this.) */ struct page_ext *page_ext; unsigned long pad; #endif /* * WARNING: mem_section must be a power-of-2 in size for the * calculation and use of SECTION_ROOT_MASK to make sense. */ }; #ifdef CONFIG_SPARSEMEM_EXTREME #define SECTIONS_PER_ROOT (PAGE_SIZE / sizeof (struct mem_section)) #else #define SECTIONS_PER_ROOT 1 #endif #define SECTION_NR_TO_ROOT(sec) ((sec) / SECTIONS_PER_ROOT) #define NR_SECTION_ROOTS DIV_ROUND_UP(NR_MEM_SECTIONS, SECTIONS_PER_ROOT) #define SECTION_ROOT_MASK (SECTIONS_PER_ROOT - 1) #ifdef CONFIG_SPARSEMEM_EXTREME extern struct mem_section **mem_section; #else extern struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT]; #endif static inline unsigned long *section_to_usemap(struct mem_section *ms) { return ms->usage->pageblock_flags; } static inline struct mem_section *__nr_to_section(unsigned long nr) { #ifdef CONFIG_SPARSEMEM_EXTREME if (!mem_section) return NULL; #endif if (!mem_section[SECTION_NR_TO_ROOT(nr)]) return NULL; return &mem_section[SECTION_NR_TO_ROOT(nr)][nr & SECTION_ROOT_MASK]; } extern size_t mem_section_usage_size(void); /* * We use the lower bits of the mem_map pointer to store * a little bit of information. The pointer is calculated * as mem_map - section_nr_to_pfn(pnum). The result is * aligned to the minimum alignment of the two values: * 1. All mem_map arrays are page-aligned. * 2. section_nr_to_pfn() always clears PFN_SECTION_SHIFT * lowest bits. PFN_SECTION_SHIFT is arch-specific * (equal SECTION_SIZE_BITS - PAGE_SHIFT), and the * worst combination is powerpc with 256k pages, * which results in PFN_SECTION_SHIFT equal 6. * To sum it up, at least 6 bits are available. */ #define SECTION_MARKED_PRESENT (1UL<<0) #define SECTION_HAS_MEM_MAP (1UL<<1) #define SECTION_IS_ONLINE (1UL<<2) #define SECTION_IS_EARLY (1UL<<3) #define SECTION_TAINT_ZONE_DEVICE (1UL<<4) #define SECTION_MAP_LAST_BIT (1UL<<5) #define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1)) #define SECTION_NID_SHIFT 6 static inline struct page *__section_mem_map_addr(struct mem_section *section) { unsigned long map = section->section_mem_map; map &= SECTION_MAP_MASK; return (struct page *)map; } static inline int present_section(struct mem_section *section) { return (section && (section->section_mem_map & SECTION_MARKED_PRESENT)); } static inline int present_section_nr(unsigned long nr) { return present_section(__nr_to_section(nr)); } static inline int valid_section(struct mem_section *section) { return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP)); } static inline int early_section(struct mem_section *section) { return (section && (section->section_mem_map & SECTION_IS_EARLY)); } static inline int valid_section_nr(unsigned long nr) { return valid_section(__nr_to_section(nr)); } static inline int online_section(struct mem_section *section) { return (section && (section->section_mem_map & SECTION_IS_ONLINE)); } static inline int online_device_section(struct mem_section *section) { unsigned long flags = SECTION_IS_ONLINE | SECTION_TAINT_ZONE_DEVICE; return section && ((section->section_mem_map & flags) == flags); } static inline int online_section_nr(unsigned long nr) { return online_section(__nr_to_section(nr)); } #ifdef CONFIG_MEMORY_HOTPLUG void online_mem_sections(unsigned long start_pfn, unsigned long end_pfn); #ifdef CONFIG_MEMORY_HOTREMOVE void offline_mem_sections(unsigned long start_pfn, unsigned long end_pfn); #endif #endif static inline struct mem_section *__pfn_to_section(unsigned long pfn) { return __nr_to_section(pfn_to_section_nr(pfn)); } extern unsigned long __highest_present_section_nr; static inline int subsection_map_index(unsigned long pfn) { return (pfn & ~(PAGE_SECTION_MASK)) / PAGES_PER_SUBSECTION; } #ifdef CONFIG_SPARSEMEM_VMEMMAP static inline int pfn_section_valid(struct mem_section *ms, unsigned long pfn) { int idx = subsection_map_index(pfn); struct mem_section_usage *usage = READ_ONCE(ms->usage); return usage ? test_bit(idx, usage->subsection_map) : 0; } #else static inline int pfn_section_valid(struct mem_section *ms, unsigned long pfn) { return 1; } #endif #ifndef CONFIG_HAVE_ARCH_PFN_VALID static inline int pfn_valid(unsigned long pfn) { struct mem_section *ms; int ret; if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS) return 0; ms = __pfn_to_section(pfn); rcu_read_lock_sched(); if (!valid_section(ms)) { rcu_read_unlock_sched(); return 0; } /* * Traditionally early sections always returned pfn_valid() for * the entire section-sized span. */ ret = early_section(ms) || pfn_section_valid(ms, pfn); rcu_read_unlock_sched(); return ret; } #endif static inline int pfn_in_present_section(unsigned long pfn) { if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS) return 0; return present_section(__pfn_to_section(pfn)); } static inline unsigned long next_present_section_nr(unsigned long section_nr) { while (++section_nr <= __highest_present_section_nr) { if (present_section_nr(section_nr)) return section_nr; } return -1; } /* * These are _only_ used during initialisation, therefore they * can use __initdata ... They could have names to indicate * this restriction. */ #ifdef CONFIG_NUMA #define pfn_to_nid(pfn) \ ({ \ unsigned long __pfn_to_nid_pfn = (pfn); \ page_to_nid(pfn_to_page(__pfn_to_nid_pfn)); \ }) #else #define pfn_to_nid(pfn) (0) #endif #define early_pfn_valid(pfn) pfn_valid(pfn) void sparse_init(void); #else #define sparse_init() do {} while (0) #define sparse_index_init(_sec, _nid) do {} while (0) #define pfn_in_present_section pfn_valid #define subsection_map_init(_pfn, _nr_pages) do {} while (0) #endif /* CONFIG_SPARSEMEM */ /* * During memory init memblocks map pfns to nids. The search is expensive and * this caches recent lookups. The implementation of __early_pfn_to_nid * may treat start/end as pfns or sections. */ struct mminit_pfnnid_cache { unsigned long last_start; unsigned long last_end; int last_nid; }; #ifndef early_pfn_valid #define early_pfn_valid(pfn) (1) #endif void memory_present(int nid, unsigned long start, unsigned long end); /* * If it is possible to have holes within a MAX_ORDER_NR_PAGES, then we * need to check pfn validity within that MAX_ORDER_NR_PAGES block. * pfn_valid_within() should be used in this case; we optimise this away * when we have no holes within a MAX_ORDER_NR_PAGES block. */ #ifdef CONFIG_HOLES_IN_ZONE #define pfn_valid_within(pfn) pfn_valid(pfn) #else #define pfn_valid_within(pfn) (1) #endif #ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL /* * pfn_valid() is meant to be able to tell if a given PFN has valid memmap * associated with it or not. This means that a struct page exists for this * pfn. The caller cannot assume the page is fully initialized in general. * Hotplugable pages might not have been onlined yet. pfn_to_online_page() * will ensure the struct page is fully online and initialized. Special pages * (e.g. ZONE_DEVICE) are never onlined and should be treated accordingly. * * In FLATMEM, it is expected that holes always have valid memmap as long as * there is valid PFNs either side of the hole. In SPARSEMEM, it is assumed * that a valid section has a memmap for the entire section. * * However, an ARM, and maybe other embedded architectures in the future * free memmap backing holes to save memory on the assumption the memmap is * never used. The page_zone linkages are then broken even though pfn_valid() * returns true. A walker of the full memmap must then do this additional * check to ensure the memmap they are looking at is sane by making sure * the zone and PFN linkages are still valid. This is expensive, but walkers * of the full memmap are extremely rare. */ bool memmap_valid_within(unsigned long pfn, struct page *page, struct zone *zone); #else static inline bool memmap_valid_within(unsigned long pfn, struct page *page, struct zone *zone) { return true; } #endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */ #endif /* !__GENERATING_BOUNDS.H */ #endif /* !__ASSEMBLY__ */ #endif /* _LINUX_MMZONE_H */