* refs/heads/tmp-26c8156:
Linux 4.4.49
drm/i915: fix use-after-free in page_flip_completed()
ALSA: seq: Don't handle loop timeout at snd_seq_pool_done()
ALSA: seq: Fix race at creating a queue
xen-netfront: Delete rx_refill_timer in xennet_disconnect_backend()
scsi: mpt3sas: disable ASPM for MPI2 controllers
scsi: aacraid: Fix INTx/MSI-x issue with older controllers
scsi: zfcp: fix use-after-free by not tracing WKA port open/close on failed send
netvsc: Set maximum GSO size in the right place
mac80211: Fix adding of mesh vendor IEs
ARM: 8642/1: LPAE: catch pending imprecise abort on unmask
target: Fix COMPARE_AND_WRITE ref leak for non GOOD status
target: Fix early transport_generic_handle_tmr abort scenario
target: Use correct SCSI status during EXTENDED_COPY exception
target: Don't BUG_ON during NodeACL dynamic -> explicit conversion
ARM: 8643/3: arm/ptrace: Preserve previous registers for short regset write
hns: avoid stack overflow with CONFIG_KASAN
cpumask: use nr_cpumask_bits for parsing functions
Revert "x86/ioapic: Restore IO-APIC irq_chip retrigger callback"
selinux: fix off-by-one in setprocattr
ARC: [arcompact] brown paper bag bug in unaligned access delay slot fixup
Linux 4.4.48
base/memory, hotplug: fix a kernel oops in show_valid_zones()
x86/irq: Make irq activate operations symmetric
USB: serial: option: add device ID for HP lt2523 (Novatel E371)
usb: gadget: f_fs: Assorted buffer overflow checks.
USB: Add quirk for WORLDE easykey.25 MIDI keyboard
USB: serial: pl2303: add ATEN device ID
USB: serial: qcserial: add Dell DW5570 QDL
KVM: x86: do not save guest-unsupported XSAVE state
HID: wacom: Fix poor prox handling in 'wacom_pl_irq'
percpu-refcount: fix reference leak during percpu-atomic transition
mmc: sdhci: Ignore unexpected CARD_INT interrupts
can: bcm: fix hrtimer/tasklet termination in bcm op removal
mm, fs: check for fatal signals in do_generic_file_read()
mm/memory_hotplug.c: check start_pfn in test_pages_in_a_zone()
cifs: initialize file_info_lock
zswap: disable changing params if init fails
svcrpc: fix oops in absence of krb5 module
NFSD: Fix a null reference case in find_or_create_lock_stateid()
powerpc: Add missing error check to prom_find_boot_cpu()
powerpc/eeh: Fix wrong flag passed to eeh_unfreeze_pe()
libata: apply MAX_SEC_1024 to all CX1-JB*-HP devices
ata: sata_mv:- Handle return value of devm_ioremap.
perf/core: Fix PERF_RECORD_MMAP2 prot/flags for anonymous memory
crypto: arm64/aes-blk - honour iv_out requirement in CBC and CTR modes
crypto: api - Clear CRYPTO_ALG_DEAD bit before registering an alg
drm/nouveau/nv1a,nv1f/disp: fix memory clock rate retrieval
drm/nouveau/disp/gt215: Fix HDA ELD handling (thus, HDMI audio) on gt215
ext4: validate s_first_meta_bg at mount time
PCI/ASPM: Handle PCI-to-PCIe bridges as roots of PCIe hierarchies
ANDROID: security: export security_path_chown()
Linux 4.4.47
net: dsa: Bring back device detaching in dsa_slave_suspend()
qmi_wwan/cdc_ether: add device ID for HP lt2523 (Novatel E371) WWAN card
af_unix: move unix_mknod() out of bindlock
r8152: don't execute runtime suspend if the tx is not empty
bridge: netlink: call br_changelink() during br_dev_newlink()
tcp: initialize max window for a new fastopen socket
ipv6: addrconf: Avoid addrconf_disable_change() using RCU read-side lock
net: phy: bcm63xx: Utilize correct config_intr function
net: fix harmonize_features() vs NETIF_F_HIGHDMA
ax25: Fix segfault after sock connection timeout
ravb: do not use zero-length alignment DMA descriptor
openvswitch: maintain correct checksum state in conntrack actions
tcp: fix tcp_fastopen unaligned access complaints on sparc
net: systemport: Decouple flow control from __bcm_sysport_tx_reclaim
net: ipv4: fix table id in getroute response
net: lwtunnel: Handle lwtunnel_fill_encap failure
mlxsw: pci: Fix EQE structure definition
mlxsw: switchx2: Fix memory leak at skb reallocation
mlxsw: spectrum: Fix memory leak at skb reallocation
r8152: fix the sw rx checksum is unavailable
ANDROID: sdcardfs: Switch strcasecmp for internal call
ANDROID: sdcardfs: switch to full_name_hash and qstr
ANDROID: sdcardfs: Add GID Derivation to sdcardfs
ANDROID: sdcardfs: Remove redundant operation
ANDROID: sdcardfs: add support for user permission isolation
ANDROID: sdcardfs: Refactor configfs interface
ANDROID: sdcardfs: Allow non-owners to touch
ANDROID: binder: fix format specifier for type binder_size_t
ANDROID: fs: Export vfs_rmdir2
ANDROID: fs: Export free_fs_struct and set_fs_pwd
ANDROID: mnt: remount should propagate to slaves of slaves
ANDROID: sdcardfs: Switch ->d_inode to d_inode()
ANDROID: sdcardfs: Fix locking issue with permision fix up
ANDROID: sdcardfs: Change magic value
ANDROID: sdcardfs: Use per mount permissions
ANDROID: sdcardfs: Add gid and mask to private mount data
ANDROID: sdcardfs: User new permission2 functions
ANDROID: vfs: Add setattr2 for filesystems with per mount permissions
ANDROID: vfs: Add permission2 for filesystems with per mount permissions
ANDROID: vfs: Allow filesystems to access their private mount data
ANDROID: mnt: Add filesystem private data to mount points
ANDROID: sdcardfs: Move directory unlock before touch
ANDROID: sdcardfs: fix external storage exporting incorrect uid
ANDROID: sdcardfs: Added top to sdcardfs_inode_info
ANDROID: sdcardfs: Switch package list to RCU
ANDROID: sdcardfs: Fix locking for permission fix up
ANDROID: sdcardfs: Check for other cases on path lookup
ANDROID: sdcardfs: override umask on mkdir and create
Linux 4.4.46
mm, memcg: do not retry precharge charges
platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT
pinctrl: broxton: Use correct PADCFGLOCK offset
s5k4ecgx: select CRC32 helper
IB/umem: Release pid in error and ODP flow
IB/ipoib: move back IB LL address into the hard header
drm/i915: Don't leak edid in intel_crt_detect_ddc()
SUNRPC: cleanup ida information when removing sunrpc module
NFSv4.0: always send mode in SETATTR after EXCLUSIVE4
nfs: Don't increment lock sequence ID after NFS4ERR_MOVED
parisc: Don't use BITS_PER_LONG in userspace-exported swab.h header
ARC: [arcompact] handle unaligned access delay slot corner case
ARC: udelay: fix inline assembler by adding LP_COUNT to clobber list
can: ti_hecc: add missing prepare and unprepare of the clock
can: c_can_pci: fix null-pointer-deref in c_can_start() - set device pointer
s390/ptrace: Preserve previous registers for short regset write
RDMA/cma: Fix unknown symbol when CONFIG_IPV6 is not enabled
ISDN: eicon: silence misleading array-bounds warning
sysctl: fix proc_doulongvec_ms_jiffies_minmax()
mm/mempolicy.c: do not put mempolicy before using its nodemask
drm: Fix broken VT switch with video=1366x768 option
tile/ptrace: Preserve previous registers for short regset write
fbdev: color map copying bounds checking
Linux 4.4.45
arm64: avoid returning from bad_mode
selftest/powerpc: Wrong PMC initialized in pmc56_overflow test
dmaengine: pl330: Fix runtime PM support for terminated transfers
ite-cir: initialize use_demodulator before using it
blackfin: check devm_pinctrl_get() for errors
ARM: 8613/1: Fix the uaccess crash on PB11MPCore
ARM: ux500: fix prcmu_is_cpu_in_wfi() calculation
ARM: dts: imx6qdl-nitrogen6_max: fix sgtl5000 pinctrl init
arm64/ptrace: Reject attempts to set incomplete hardware breakpoint fields
arm64/ptrace: Avoid uninitialised struct padding in fpr_set()
arm64/ptrace: Preserve previous registers for short regset write - 3
arm64/ptrace: Preserve previous registers for short regset write - 2
arm64/ptrace: Preserve previous registers for short regset write
ARM: dts: da850-evm: fix read access to SPI flash
ceph: fix bad endianness handling in parse_reply_info_extra
ARM: 8634/1: hw_breakpoint: blacklist Scorpion CPUs
svcrdma: avoid duplicate dma unmapping during error recovery
clocksource/exynos_mct: Clear interrupt when cpu is shut down
ubifs: Fix journal replay wrt. xattr nodes
qla2xxx: Fix crash due to null pointer access
x86/ioapic: Restore IO-APIC irq_chip retrigger callback
mtd: nand: xway: disable module support
ieee802154: atusb: do not use the stack for buffers to make them DMA able
mmc: mxs-mmc: Fix additional cycles after transmission stop
HID: corsair: fix control-transfer error handling
HID: corsair: fix DMA buffers on stack
PCI: Enumerate switches below PCI-to-PCIe bridges
fuse: clear FR_PENDING flag when moving requests out of pending queue
svcrpc: don't leak contexts on PROC_DESTROY
x86/PCI: Ignore _CRS on Supermicro X8DTH-i/6/iF/6F
tmpfs: clear S_ISGID when setting posix ACLs
ARM: dts: imx31: fix AVIC base address
ARM: dts: imx31: move CCM device node to AIPS2 bus devices
ARM: dts: imx31: fix clock control module interrupts description
perf scripting: Avoid leaking the scripting_context variable
IB/IPoIB: Remove can't use GFP_NOIO warning
IB/mlx4: When no DMFS for IPoIB, don't allow NET_IF QPs
IB/mlx4: Fix port query for 56Gb Ethernet links
IB/mlx4: Fix out-of-range array index in destroy qp flow
IB/mlx4: Set traffic class in AH
IB/mlx5: Wait for all async command completions to complete
ftrace/x86: Set ftrace_stub to weak to prevent gcc from using short jumps to it
Linux 4.4.44
pinctrl: sh-pfc: Do not unconditionally support PIN_CONFIG_BIAS_DISABLE
powerpc/ibmebus: Fix device reference leaks in sysfs interface
powerpc/ibmebus: Fix further device reference leaks
bus: vexpress-config: fix device reference leak
blk-mq: Always schedule hctx->next_cpu
ACPI / APEI: Fix NMI notification handling
block: cfq_cpd_alloc() should use @gfp
cpufreq: powernv: Disable preemption while checking CPU throttling state
NFSv4.1: nfs4_fl_prepare_ds must be careful about reporting success.
NFS: Fix a performance regression in readdir
pNFS: Fix race in pnfs_wait_on_layoutreturn
pinctrl: meson: fix gpio request disabling other modes
btrfs: fix error handling when run_delayed_extent_op fails
btrfs: fix locking when we put back a delayed ref that's too new
x86/cpu: Fix bootup crashes by sanitizing the argument of the 'clearcpuid=' command-line option
USB: serial: ch341: fix modem-control and B0 handling
USB: serial: ch341: fix resume after reset
drm/radeon: drop verde dpm quirks
sysctl: Drop reference added by grab_header in proc_sys_readdir
sysrq: attach sysrq handler correctly for 32-bit kernel
tty/serial: atmel_serial: BUG: stop DMA from transmitting in stop_tx
mnt: Protect the mountpoint hashtable with mount_lock
vme: Fix wrong pointer utilization in ca91cx42_slave_get
xhci: fix deadlock at host remove by running watchdog correctly
i2c: fix kernel memory disclosure in dev interface
i2c: print correct device invalid address
Input: elants_i2c - avoid divide by 0 errors on bad touchscreen data
USB: serial: ch341: fix open and resume after B0
USB: serial: ch341: fix control-message error handling
USB: serial: ch341: fix open error handling
USB: serial: ch341: fix initial modem-control state
USB: serial: kl5kusb105: fix line-state error handling
nl80211: fix sched scan netlink socket owner destruction
KVM: x86: Introduce segmented_write_std
KVM: x86: emulate FXSAVE and FXRSTOR
KVM: x86: add asm_safe wrapper
KVM: x86: add Align16 instruction flag
KVM: x86: flush pending lapic jump label updates on module unload
jump_labels: API for flushing deferred jump label updates
KVM: eventfd: fix NULL deref irqbypass consumer
KVM: x86: fix emulation of "MOV SS, null selector"
mm/hugetlb.c: fix reservation race when freeing surplus pages
ocfs2: fix crash caused by stale lvb with fsdlm plugin
mm: fix devm_memremap_pages crash, use mem_hotplug_{begin, done}
selftests: do not require bash for the generated test
selftests: do not require bash to run netsocktests testcase
Input: i8042 - add Pegatron touchpad to noloop table
Input: xpad - use correct product id for x360w controllers
DEBUG: sched/fair: Fix sched_load_avg_cpu events for task_groups
DEBUG: sched/fair: Fix missing sched_load_avg_cpu events
net: socket: don't set sk_uid to garbage value in ->setattr()
ANDROID: configs: CONFIG_ARM64_SW_TTBR0_PAN=y
UPSTREAM: arm64: Disable PAN on uaccess_enable()
UPSTREAM: arm64: Enable CONFIG_ARM64_SW_TTBR0_PAN
UPSTREAM: arm64: xen: Enable user access before a privcmd hvc call
UPSTREAM: arm64: Handle faults caused by inadvertent user access with PAN enabled
BACKPORT: arm64: Disable TTBR0_EL1 during normal kernel execution
BACKPORT: arm64: Introduce uaccess_{disable,enable} functionality based on TTBR0_EL1
BACKPORT: arm64: Factor out TTBR0_EL1 post-update workaround into a specific asm macro
BACKPORT: arm64: Factor out PAN enabling/disabling into separate uaccess_* macros
UPSTREAM: arm64: alternative: add auto-nop infrastructure
UPSTREAM: arm64: barriers: introduce nops and __nops macros for NOP sequences
Revert "FROMLIST: arm64: Factor out PAN enabling/disabling into separate uaccess_* macros"
Revert "FROMLIST: arm64: Factor out TTBR0_EL1 post-update workaround into a specific asm macro"
Revert "FROMLIST: arm64: Introduce uaccess_{disable,enable} functionality based on TTBR0_EL1"
Revert "FROMLIST: arm64: Disable TTBR0_EL1 during normal kernel execution"
Revert "FROMLIST: arm64: Handle faults caused by inadvertent user access with PAN enabled"
Revert "FROMLIST: arm64: xen: Enable user access before a privcmd hvc call"
Revert "FROMLIST: arm64: Enable CONFIG_ARM64_SW_TTBR0_PAN"
ANDROID: sched/walt: fix build failure if FAIR_GROUP_SCHED=n
Linux 4.4.43
mm/init: fix zone boundary creation
ALSA: usb-audio: Add a quirk for Plantronics BT600
spi: mvebu: fix baudrate calculation for armada variant
ARM: OMAP4+: Fix bad fallthrough for cpuidle
ARM: zynq: Reserve correct amount of non-DMA RAM
powerpc: Fix build warning on 32-bit PPC
ALSA: firewire-tascam: Fix to handle error from initialization of stream data
HID: hid-cypress: validate length of report
net: vrf: do not allow table id 0
net: ipv4: Fix multipath selection with vrf
gro: Disable frag0 optimization on IPv6 ext headers
gro: use min_t() in skb_gro_reset_offset()
gro: Enter slow-path if there is no tailroom
r8152: fix rx issue for runtime suspend
r8152: split rtl8152_suspend function
ipv4: Do not allow MAIN to be alias for new LOCAL w/ custom rules
igmp: Make igmp group member RFC 3376 compliant
drop_monitor: consider inserted data in genlmsg_end
drop_monitor: add missing call to genlmsg_end
net/mlx5: Avoid shadowing numa_node
net/mlx5: Check FW limitations on log_max_qp before setting it
net: stmmac: Fix race between stmmac_drv_probe and stmmac_open
net, sched: fix soft lockup in tc_classify
ipv6: handle -EFAULT from skb_copy_bits
net: vrf: Drop conntrack data after pass through VRF device on Tx
ser_gigaset: return -ENOMEM on error instead of success
netvsc: reduce maximum GSO size
Linux 4.4.42
usb: gadget: composite: always set ep->mult to a sensible value
Revert "usb: gadget: composite: always set ep->mult to a sensible value"
tick/broadcast: Prevent NULL pointer dereference
drm/radeon: Always store CRTC relative radeon_crtc->cursor_x/y values
cx23885-dvb: move initialization of a8293_pdata
net: vxge: avoid unused function warnings
net: ti: cpmac: Fix compiler warning due to type confusion
cred/userns: define current_user_ns() as a function
staging: comedi: dt282x: tidy up register bit defines
powerpc/pci/rpadlpar: Fix device reference leaks
md: MD_RECOVERY_NEEDED is set for mddev->recovery
crypto: arm64/aes-ce - fix for big endian
crypto: arm64/aes-xts-ce: fix for big endian
crypto: arm64/sha1-ce - fix for big endian
crypto: arm64/aes-neon - fix for big endian
crypto: arm64/aes-ccm-ce: fix for big endian
crypto: arm/aes-ce - fix for big endian
crypto: arm64/ghash-ce - fix for big endian
crypto: arm64/sha2-ce - fix for big endian
s390/crypto: unlock on error in prng_tdes_read()
mmc: mmc_test: Uninitialized return value
PM / wakeirq: Fix dedicated wakeirq for drivers not using autosuspend
irqchip/bcm7038-l1: Implement irq_cpu_offline() callback
target/iscsi: Fix double free in lio_target_tiqn_addtpg()
scsi: mvsas: fix command_active typo
ASoC: samsung: i2s: Fixup last IRQ unsafe spin lock call
iommu/vt-d: Flush old iommu caches for kdump when the device gets context mapped
iommu/vt-d: Fix pasid table size encoding
iommu/amd: Fix the left value check of cmd buffer
iommu/amd: Missing error code in amd_iommu_init_device()
clk: imx31: fix rewritten input argument of mx31_clocks_init()
clk: clk-wm831x: fix a logic error
hwmon: (g762) Fix overflows and crash seen when writing limit attributes
hwmon: (nct7802) Fix overflows seen when writing into limit attributes
hwmon: (ds620) Fix overflows seen when writing temperature limits
hwmon: (amc6821) sign extension temperature
hwmon: (scpi) Fix module autoload
cris: Only build flash rescue image if CONFIG_ETRAX_AXISFLASHMAP is selected
ath10k: use the right length of "background"
stable-fixup: hotplug: fix unused function warning
usb: dwc3: ep0: explicitly call dwc3_ep0_prepare_one_trb()
usb: dwc3: ep0: add dwc3_ep0_prepare_one_trb()
usb: dwc3: gadget: always unmap EP0 requests
staging: iio: ad7606: fix improper setting of oversampling pins
mei: bus: fix mei_cldev_enable KDoc
USB: serial: io_ti: bind to interface after fw download
USB: phy: am335x-control: fix device and of_node leaks
ARM: dts: r8a7794: Correct hsusb parent clock
USB: serial: kl5kusb105: abort on open exception path
ALSA: usb-audio: Fix bogus error return in snd_usb_create_stream()
usb: musb: blackfin: add bfin_fifo_offset in bfin_ops
usb: hub: Move hub_port_disable() to fix warning if PM is disabled
usb: musb: Fix trying to free already-free IRQ 4
usb: dwc3: pci: add Intel Gemini Lake PCI ID
xhci: Fix race related to abort operation
xhci: Use delayed_work instead of timer for command timeout
usb: xhci-mem: use passed in GFP flags instead of GFP_KERNEL
USB: serial: mos7720: fix parallel probe
USB: serial: mos7720: fix parport use-after-free on probe errors
USB: serial: mos7720: fix use-after-free on probe errors
USB: serial: mos7720: fix NULL-deref at open
USB: serial: mos7840: fix NULL-deref at open
USB: serial: kobil_sct: fix NULL-deref in write
USB: serial: cyberjack: fix NULL-deref at open
USB: serial: oti6858: fix NULL-deref at open
USB: serial: io_edgeport: fix NULL-deref at open
USB: serial: ti_usb_3410_5052: fix NULL-deref at open
USB: serial: garmin_gps: fix memory leak on failed URB submit
USB: serial: iuu_phoenix: fix NULL-deref at open
USB: serial: io_ti: fix I/O after disconnect
USB: serial: io_ti: fix another NULL-deref at open
USB: serial: io_ti: fix NULL-deref at open
USB: serial: spcp8x5: fix NULL-deref at open
USB: serial: keyspan_pda: verify endpoints at probe
USB: serial: pl2303: fix NULL-deref at open
USB: serial: quatech2: fix sleep-while-atomic in close
USB: serial: omninet: fix NULL-derefs at open and disconnect
usb: xhci: hold lock over xhci_abort_cmd_ring()
xhci: Handle command completion and timeout race
usb: host: xhci: Fix possible wild pointer when handling abort command
usb: xhci: fix return value of xhci_setup_device()
xhci: free xhci virtual devices with leaf nodes first
usb: xhci: apply XHCI_PME_STUCK_QUIRK to Intel Apollo Lake
xhci: workaround for hosts missing CAS bit
usb: xhci: fix possible wild pointer
usb: dwc3: core: avoid Overflow events
usb: gadget: composite: Test get_alt() presence instead of set_alt()
USB: dummy-hcd: fix bug in stop_activity (handle ep0)
USB: fix problems with duplicate endpoint addresses
USB: gadgetfs: fix checks of wTotalLength in config descriptors
USB: gadgetfs: fix use-after-free bug
USB: gadgetfs: fix unbounded memory allocation bug
usb: gadgetfs: restrict upper bound on device configuration size
usb: storage: unusual_uas: Add JMicron JMS56x to unusual device
usb: musb: dsps: implement clear_ep_rxintr() callback
usb: musb: core: add clear_ep_rxintr() to musb_platform_ops
KVM: MIPS: Flush KVM entry code from icache globally
KVM: x86: reset MMU on KVM_SET_VCPU_EVENTS
mac80211: initialize fast-xmit 'info' later
ARM: davinci: da850: don't add emac clock to lookup table twice
ALSA: usb-audio: Fix irq/process data synchronization
ALSA: hda - Apply asus-mode8 fixup to ASUS X71SL
ALSA: hda - Fix up GPIO for ASUS ROG Ranger
Linux 4.4.41
net: mvpp2: fix dma unmapping of TX buffers for fragments
sg_write()/bsg_write() is not fit to be called under KERNEL_DS
kconfig/nconf: Fix hang when editing symbol with a long prompt
target/user: Fix use-after-free of tcmu_cmds if they are expired
powerpc: Convert cmp to cmpd in idle enter sequence
powerpc/ps3: Fix system hang with GCC 5 builds
nfs_write_end(): fix handling of short copies
libceph: verify authorize reply on connect
PCI: Check for PME in targeted sleep state
Input: drv260x - fix input device's parent assignment
media: solo6x10: fix lockup by avoiding delayed register write
IB/cma: Fix a race condition in iboe_addr_get_sgid()
IB/multicast: Check ib_find_pkey() return value
IPoIB: Avoid reading an uninitialized member variable
IB/mad: Fix an array index check
fgraph: Handle a case where a tracer ignores set_graph_notrace
platform/x86: asus-nb-wmi.c: Add X45U quirk
ftrace/x86_32: Set ftrace_stub to weak to prevent gcc from using short jumps to it
kvm: nVMX: Allow L1 to intercept software exceptions (#BP and #OF)
KVM: PPC: Book3S HV: Don't lose hardware R/C bit updates in H_PROTECT
KVM: PPC: Book3S HV: Save/restore XER in checkpointed register state
md/raid5: limit request size according to implementation limits
sc16is7xx: Drop bogus use of IRQF_ONESHOT
s390/vmlogrdr: fix IUCV buffer allocation
firmware: fix usermode helper fallback loading
ARC: mm: arc700: Don't assume 2 colours for aliasing VIPT dcache
scsi: avoid a permanent stop of the scsi device's request queue
scsi: zfcp: fix rport unblock race with LUN recovery
scsi: zfcp: do not trace pure benign residual HBA responses at default level
scsi: zfcp: fix use-after-"free" in FC ingress path after TMF
scsi: megaraid_sas: Do not set MPI2_TYPE_CUDA for JBOD FP path for FW which does not support JBOD sequence map
scsi: megaraid_sas: For SRIOV enabled firmware, ensure VF driver waits for 30secs before reset
vt: fix Scroll Lock LED trigger name
block: protect iterate_bdevs() against concurrent close
mei: request async autosuspend at the end of enumeration
drivers/gpu/drm/ast: Fix infinite loop if read fails
drm/gma500: Add compat ioctl
drm/radeon: add additional pci revision to dpm workaround
drm/radeon: Hide the HW cursor while it's out of bounds
drm/radeon: Also call cursor_move_locked when the cursor size changes
drm/nouveau/i2c/gk110b,gm10x: use the correct implementation
drm/nouveau/fifo/gf100-: protect channel preempt with subdev mutex
drm/nouveau/ltc: protect clearing of comptags with mutex
drm/nouveau/bios: require checksum to match for fast acpi shadow method
drm/nouveau/kms: lvds panel strap moved again on maxwell
ACPI / video: Add force_native quirk for HP Pavilion dv6
ACPI / video: Add force_native quirk for Dell XPS 17 L702X
staging: comedi: ni_mio_common: fix E series ni_ai_insn_read() data
staging: comedi: ni_mio_common: fix M Series ni_ai_insn_read() data mask
thermal: hwmon: Properly report critical temperature in sysfs
clk: bcm2835: Avoid overwriting the div info when disabling a pll_div clk
timekeeping_Force_unsigned_clocksource_to_nanoseconds_conversion
regulator: stw481x-vmmc: fix ages old enable error
mmc: sdhci: Fix recovery from tuning timeout
ath9k: Really fix LED polarity for some Mini PCI AR9220 MB92 cards.
cfg80211/mac80211: fix BSS leaks when abandoning assoc attempts
rtlwifi: Fix enter/exit power_save
ssb: Fix error routine when fallback SPROM fails
Linux 4.4.40
ppp: defer netns reference release for ppp channel
driver core: fix race between creating/querying glue dir and its cleanup
xfs: set AGI buffer type in xlog_recover_clear_agi_bucket
arm/xen: Use alloc_percpu rather than __alloc_percpu
xen/gntdev: Use VM_MIXEDMAP instead of VM_IO to avoid NUMA balancing
tpm xen: Remove bogus tpm_chip_unregister
kernel/debug/debug_core.c: more properly delay for secondary CPUs
kernel/watchdog: use nmi registers snapshot in hardlockup handler
CIFS: Fix a possible memory corruption in push locks
CIFS: Fix missing nls unload in smb2_reconnect()
CIFS: Fix a possible memory corruption during reconnect
ASoC: intel: Fix crash at suspend/resume without card registration
dm space map metadata: fix 'struct sm_metadata' leak on failed create
dm crypt: mark key as invalid until properly loaded
dm flakey: return -EINVAL on interval bounds error in flakey_ctr()
blk-mq: Do not invoke .queue_rq() for a stopped queue
usb: gadget: composite: always set ep->mult to a sensible value
exec: Ensure mm->user_ns contains the execed files
fs: exec: apply CLOEXEC before changing dumpable task flags
mm/vmscan.c: set correct defer count for shrinker
loop: return proper error from loop_queue_rq()
f2fs: set ->owner for debugfs status file's file_operations
ext4: do not perform data journaling when data is encrypted
ext4: return -ENOMEM instead of success
ext4: reject inodes with negative size
ext4: add sanity checking to count_overhead()
ext4: fix in-superblock mount options processing
ext4: use more strict checks for inodes_per_block on mount
ext4: fix stack memory corruption with 64k block size
ext4: fix mballoc breakage with 64k block size
crypto: caam - fix AEAD givenc descriptors
ptrace: Capture the ptracer's creds not PT_PTRACE_CAP
mm: Add a user_ns owner to mm_struct and fix ptrace permission checks
block_dev: don't test bdev->bd_contains when it is not stable
btrfs: make file clone aware of fatal signals
Btrfs: don't BUG() during drop snapshot
Btrfs: fix memory leak in do_walk_down
Btrfs: don't leak reloc root nodes on error
Btrfs: return gracefully from balance if fs tree is corrupted
Btrfs: bail out if block group has different mixed flag
Btrfs: fix memory leak in reading btree blocks
clk: ti: omap36xx: Work around sprz319 advisory 2.1
ALSA: hda: when comparing pin configurations, ignore assoc in addition to seq
ALSA: hda - Gate the mic jack on HP Z1 Gen3 AiO
ALSA: hda - fix headset-mic problem on a Dell laptop
ALSA: hda - ignore the assoc and seq when comparing pin configurations
ALSA: hda/ca0132 - Add quirk for Alienware 15 R2 2016
ALSA: hiface: Fix M2Tech hiFace driver sampling rate change
ALSA: usb-audio: Add QuickCam Communicate Deluxe/S7500 to volume_control_quirks
USB: UHCI: report non-PME wakeup signalling for Intel hardware
usb: gadget: composite: correctly initialize ep->maxpacket
usb: gadget: f_uac2: fix error handling at afunc_bind
usb: hub: Fix auto-remount of safely removed or ejected USB-3 devices
USB: cdc-acm: add device id for GW Instek AFG-125
USB: serial: kl5kusb105: fix open error path
USB: serial: option: add dlink dwm-158
USB: serial: option: add support for Telit LE922A PIDs 0x1040, 0x1041
Btrfs: fix qgroup rescan worker initialization
btrfs: store and load values of stripes_min/stripes_max in balance status item
Btrfs: fix tree search logic when replaying directory entry deletes
btrfs: limit async_work allocation and worker func duration
ANDROID: trace: net: use %pK for kernel pointers
ANDROID: android-base: Enable QUOTA related configs
net: ipv4: Don't crash if passing a null sk to ip_rt_update_pmtu.
net: inet: Support UID-based routing in IP protocols.
Revert "net: ipv6: fix virtual tunneling build"
net: core: add UID to flows, rules, and routes
net: core: Add a UID field to struct sock.
Revert "net: core: Support UID-based routing."
Revert "net: core: Handle 'sk' being NULL in UID-based routing"
Revert "ANDROID: net: fix 'const' warnings"
Revert "ANDROID: net: fib: remove duplicate assignment"
Revert "ANDROID: net: core: fix UID-based routing"
UPSTREAM: efi/arm64: Don't apply MEMBLOCK_NOMAP to UEFI memory map mapping
UPSTREAM: arm64: enable CONFIG_DEBUG_RODATA by default
goldfish: enable CONFIG_INET_DIAG_DESTROY
sched/walt: kill {min,max}_capacity
sched: fix wrong truncation of walt_avg
ANDROID: dm verity: add minimum prefetch size
Linux 4.4.39
crypto: rsa - Add Makefile dependencies to fix parallel builds
hotplug: Make register and unregister notifier API symmetric
batman-adv: Check for alloc errors when preparing TT local data
m68k: Fix ndelay() macro
arm64: futex.h: Add missing PAN toggling
can: peak: fix bad memory access and free sequence
can: raw: raw_setsockopt: limit number of can_filter that can be set
crypto: mcryptd - Check mcryptd algorithm compatibility
perf/x86: Fix full width counter, counter overflow
locking/rtmutex: Use READ_ONCE() in rt_mutex_owner()
locking/rtmutex: Prevent dequeue vs. unlock race
zram: restrict add/remove attributes to root only
parisc: Fix TLB related boot crash on SMP machines
parisc: Remove unnecessary TLB purges from flush_dcache_page_asm and flush_icache_page_asm
parisc: Purge TLB before setting PTE
powerpc/eeh: Fix deadlock when PE frozen state can't be cleared
Conflicts:
arch/arm64/kernel/traps.c
drivers/usb/dwc3/core.h
drivers/usb/dwc3/ep0.c
drivers/usb/gadget/function/f_fs.c
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
drivers/video/fbdev/core/fbcmap.c
include/trace/events/sched.h
mm/vmscan.c
Change-Id: I3faa0010ecb98972cd8e6470377a493b56d95f89
Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org>
Signed-off-by: Runmin Wang <runminw@codeaurora.org>
3209 lines
74 KiB
C
3209 lines
74 KiB
C
/*
|
|
* sysctl.c: General linux system control interface
|
|
*
|
|
* Begun 24 March 1995, Stephen Tweedie
|
|
* Added /proc support, Dec 1995
|
|
* Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas.
|
|
* Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver.
|
|
* Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver.
|
|
* Dynamic registration fixes, Stephen Tweedie.
|
|
* Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn.
|
|
* Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris
|
|
* Horn.
|
|
* Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer.
|
|
* Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer.
|
|
* Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill
|
|
* Wendling.
|
|
* The list_for_each() macro wasn't appropriate for the sysctl loop.
|
|
* Removed it and replaced it with older style, 03/23/00, Bill Wendling
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/aio.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/swap.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/sysctl.h>
|
|
#include <linux/bitmap.h>
|
|
#include <linux/signal.h>
|
|
#include <linux/printk.h>
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/security.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/kmemcheck.h>
|
|
#include <linux/kmemleak.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/kobject.h>
|
|
#include <linux/net.h>
|
|
#include <linux/sysrq.h>
|
|
#include <linux/highuid.h>
|
|
#include <linux/writeback.h>
|
|
#include <linux/ratelimit.h>
|
|
#include <linux/compaction.h>
|
|
#include <linux/hugetlb.h>
|
|
#include <linux/initrd.h>
|
|
#include <linux/key.h>
|
|
#include <linux/times.h>
|
|
#include <linux/limits.h>
|
|
#include <linux/dcache.h>
|
|
#include <linux/dnotify.h>
|
|
#include <linux/syscalls.h>
|
|
#include <linux/vmstat.h>
|
|
#include <linux/nfs_fs.h>
|
|
#include <linux/acpi.h>
|
|
#include <linux/reboot.h>
|
|
#include <linux/ftrace.h>
|
|
#include <linux/perf_event.h>
|
|
#include <linux/kprobes.h>
|
|
#include <linux/pipe_fs_i.h>
|
|
#include <linux/oom.h>
|
|
#include <linux/kmod.h>
|
|
#include <linux/capability.h>
|
|
#include <linux/binfmts.h>
|
|
#include <linux/sched/sysctl.h>
|
|
#include <linux/kexec.h>
|
|
#include <linux/bpf.h>
|
|
|
|
#include <asm/uaccess.h>
|
|
#include <asm/processor.h>
|
|
|
|
#ifdef CONFIG_X86
|
|
#include <asm/nmi.h>
|
|
#include <asm/stacktrace.h>
|
|
#include <asm/io.h>
|
|
#endif
|
|
#ifdef CONFIG_SPARC
|
|
#include <asm/setup.h>
|
|
#endif
|
|
#ifdef CONFIG_BSD_PROCESS_ACCT
|
|
#include <linux/acct.h>
|
|
#endif
|
|
#ifdef CONFIG_RT_MUTEXES
|
|
#include <linux/rtmutex.h>
|
|
#endif
|
|
#if defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_LOCK_STAT)
|
|
#include <linux/lockdep.h>
|
|
#endif
|
|
#ifdef CONFIG_CHR_DEV_SG
|
|
#include <scsi/sg.h>
|
|
#endif
|
|
|
|
#ifdef CONFIG_LOCKUP_DETECTOR
|
|
#include <linux/nmi.h>
|
|
#endif
|
|
|
|
#if defined(CONFIG_SYSCTL)
|
|
|
|
/* External variables not in a header file. */
|
|
extern int suid_dumpable;
|
|
#ifdef CONFIG_COREDUMP
|
|
extern int core_uses_pid;
|
|
extern char core_pattern[];
|
|
extern unsigned int core_pipe_limit;
|
|
#endif
|
|
extern int pid_max;
|
|
extern int extra_free_kbytes;
|
|
extern int pid_max_min, pid_max_max;
|
|
extern int percpu_pagelist_fraction;
|
|
extern int compat_log;
|
|
extern int latencytop_enabled;
|
|
extern int sysctl_nr_open_min, sysctl_nr_open_max;
|
|
#ifndef CONFIG_MMU
|
|
extern int sysctl_nr_trim_pages;
|
|
#endif
|
|
|
|
/* Constants used for minimum and maximum */
|
|
#ifdef CONFIG_LOCKUP_DETECTOR
|
|
static int sixty = 60;
|
|
#endif
|
|
|
|
static int __maybe_unused neg_one = -1;
|
|
|
|
static int zero;
|
|
static int __maybe_unused one = 1;
|
|
static int __maybe_unused two = 2;
|
|
static int __maybe_unused three = 3;
|
|
static int __maybe_unused four = 4;
|
|
static unsigned long one_ul = 1;
|
|
static int one_hundred = 100;
|
|
#ifdef CONFIG_PRINTK
|
|
static int ten_thousand = 10000;
|
|
#endif
|
|
#ifdef CONFIG_SCHED_HMP
|
|
static int one_thousand = 1000;
|
|
static int max_freq_reporting_policy = FREQ_REPORT_INVALID_POLICY - 1;
|
|
#endif
|
|
|
|
/* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
|
|
static unsigned long dirty_bytes_min = 2 * PAGE_SIZE;
|
|
|
|
/* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
|
|
static int maxolduid = 65535;
|
|
static int minolduid;
|
|
|
|
static int ngroups_max = NGROUPS_MAX;
|
|
static const int cap_last_cap = CAP_LAST_CAP;
|
|
|
|
/*this is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs */
|
|
#ifdef CONFIG_DETECT_HUNG_TASK
|
|
static unsigned long hung_task_timeout_max = (LONG_MAX/HZ);
|
|
#endif
|
|
|
|
#ifdef CONFIG_INOTIFY_USER
|
|
#include <linux/inotify.h>
|
|
#endif
|
|
#ifdef CONFIG_SPARC
|
|
#endif
|
|
|
|
#ifdef __hppa__
|
|
extern int pwrsw_enabled;
|
|
#endif
|
|
|
|
#ifdef CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW
|
|
extern int unaligned_enabled;
|
|
#endif
|
|
|
|
#ifdef CONFIG_IA64
|
|
extern int unaligned_dump_stack;
|
|
#endif
|
|
|
|
#ifdef CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN
|
|
extern int no_unaligned_warning;
|
|
#endif
|
|
|
|
#ifdef CONFIG_PROC_SYSCTL
|
|
|
|
#define SYSCTL_WRITES_LEGACY -1
|
|
#define SYSCTL_WRITES_WARN 0
|
|
#define SYSCTL_WRITES_STRICT 1
|
|
|
|
static int sysctl_writes_strict = SYSCTL_WRITES_STRICT;
|
|
|
|
static int proc_do_cad_pid(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos);
|
|
static int proc_taint(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos);
|
|
#endif
|
|
|
|
#ifdef CONFIG_PRINTK
|
|
static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos);
|
|
#endif
|
|
|
|
static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos);
|
|
#ifdef CONFIG_COREDUMP
|
|
static int proc_dostring_coredump(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos);
|
|
#endif
|
|
|
|
#ifdef CONFIG_MAGIC_SYSRQ
|
|
/* Note: sysrq code uses it's own private copy */
|
|
static int __sysrq_enabled = CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE;
|
|
|
|
static int sysrq_sysctl_handler(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp,
|
|
loff_t *ppos)
|
|
{
|
|
int error;
|
|
|
|
error = proc_dointvec(table, write, buffer, lenp, ppos);
|
|
if (error)
|
|
return error;
|
|
|
|
if (write)
|
|
sysrq_toggle_support(__sysrq_enabled);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
static struct ctl_table kern_table[];
|
|
static struct ctl_table vm_table[];
|
|
static struct ctl_table fs_table[];
|
|
static struct ctl_table debug_table[];
|
|
static struct ctl_table dev_table[];
|
|
extern struct ctl_table random_table[];
|
|
#ifdef CONFIG_EPOLL
|
|
extern struct ctl_table epoll_table[];
|
|
#endif
|
|
|
|
#ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
|
|
int sysctl_legacy_va_layout;
|
|
#endif
|
|
|
|
/* The default sysctl tables: */
|
|
|
|
static struct ctl_table sysctl_base_table[] = {
|
|
{
|
|
.procname = "kernel",
|
|
.mode = 0555,
|
|
.child = kern_table,
|
|
},
|
|
{
|
|
.procname = "vm",
|
|
.mode = 0555,
|
|
.child = vm_table,
|
|
},
|
|
{
|
|
.procname = "fs",
|
|
.mode = 0555,
|
|
.child = fs_table,
|
|
},
|
|
{
|
|
.procname = "debug",
|
|
.mode = 0555,
|
|
.child = debug_table,
|
|
},
|
|
{
|
|
.procname = "dev",
|
|
.mode = 0555,
|
|
.child = dev_table,
|
|
},
|
|
{ }
|
|
};
|
|
|
|
#ifdef CONFIG_SCHED_DEBUG
|
|
static int min_sched_granularity_ns = 100000; /* 100 usecs */
|
|
static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */
|
|
static int min_wakeup_granularity_ns; /* 0 usecs */
|
|
static int max_wakeup_granularity_ns = NSEC_PER_SEC; /* 1 second */
|
|
#ifdef CONFIG_SMP
|
|
static int min_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE;
|
|
static int max_sched_tunable_scaling = SCHED_TUNABLESCALING_END-1;
|
|
#endif /* CONFIG_SMP */
|
|
#endif /* CONFIG_SCHED_DEBUG */
|
|
|
|
#ifdef CONFIG_COMPACTION
|
|
static int min_extfrag_threshold;
|
|
static int max_extfrag_threshold = 1000;
|
|
#endif
|
|
|
|
static struct ctl_table kern_table[] = {
|
|
{
|
|
.procname = "sched_child_runs_first",
|
|
.data = &sysctl_sched_child_runs_first,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#ifdef CONFIG_SCHED_HMP
|
|
{
|
|
.procname = "sched_freq_reporting_policy",
|
|
.data = &sysctl_sched_freq_reporting_policy,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &max_freq_reporting_policy,
|
|
},
|
|
{
|
|
.procname = "sched_freq_inc_notify",
|
|
.data = &sysctl_sched_freq_inc_notify,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "sched_freq_dec_notify",
|
|
.data = &sysctl_sched_freq_dec_notify,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "sched_cpu_high_irqload",
|
|
.data = &sysctl_sched_cpu_high_irqload,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_ravg_hist_size",
|
|
.data = &sysctl_sched_ravg_hist_size,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_window_update_handler,
|
|
},
|
|
{
|
|
.procname = "sched_window_stats_policy",
|
|
.data = &sysctl_sched_window_stats_policy,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_window_update_handler,
|
|
},
|
|
{
|
|
.procname = "sched_spill_load",
|
|
.data = &sysctl_sched_spill_load_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "sched_spill_nr_run",
|
|
.data = &sysctl_sched_spill_nr_run,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "sched_upmigrate",
|
|
.data = &sysctl_sched_upmigrate_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "sched_downmigrate",
|
|
.data = &sysctl_sched_downmigrate_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "sched_group_upmigrate",
|
|
.data = &sysctl_sched_group_upmigrate_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "sched_group_downmigrate",
|
|
.data = &sysctl_sched_group_downmigrate_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "sched_init_task_load",
|
|
.data = &sysctl_sched_init_task_load_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "sched_select_prev_cpu_us",
|
|
.data = &sysctl_sched_select_prev_cpu_us,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "sched_restrict_cluster_spill",
|
|
.data = &sysctl_sched_restrict_cluster_spill,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "sched_small_wakee_task_load",
|
|
.data = &sysctl_sched_small_wakee_task_load_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "sched_big_waker_task_load",
|
|
.data = &sysctl_sched_big_waker_task_load_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "sched_prefer_sync_wakee_to_waker",
|
|
.data = &sysctl_sched_prefer_sync_wakee_to_waker,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "sched_enable_thread_grouping",
|
|
.data = &sysctl_sched_enable_thread_grouping,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_pred_alert_freq",
|
|
.data = &sysctl_sched_pred_alert_freq,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "sched_freq_aggregate",
|
|
.data = &sysctl_sched_freq_aggregate,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_window_update_handler,
|
|
},
|
|
{
|
|
.procname = "sched_freq_aggregate_threshold",
|
|
.data = &sysctl_sched_freq_aggregate_threshold_pct,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_hmp_proc_update_handler,
|
|
.extra1 = &zero,
|
|
/*
|
|
* Special handling for sched_freq_aggregate_threshold_pct
|
|
* which can be greater than 100. Use 1000 as an upper bound
|
|
* value which works for all practical use cases.
|
|
*/
|
|
.extra2 = &one_thousand,
|
|
},
|
|
{
|
|
.procname = "sched_boost",
|
|
.data = &sysctl_sched_boost,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_boost_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &three,
|
|
},
|
|
{
|
|
.procname = "sched_short_burst_ns",
|
|
.data = &sysctl_sched_short_burst,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_short_sleep_ns",
|
|
.data = &sysctl_sched_short_sleep,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif /* CONFIG_SCHED_HMP */
|
|
#ifdef CONFIG_SCHED_DEBUG
|
|
{
|
|
.procname = "sched_min_granularity_ns",
|
|
.data = &sysctl_sched_min_granularity,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_proc_update_handler,
|
|
.extra1 = &min_sched_granularity_ns,
|
|
.extra2 = &max_sched_granularity_ns,
|
|
},
|
|
{
|
|
.procname = "sched_latency_ns",
|
|
.data = &sysctl_sched_latency,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_proc_update_handler,
|
|
.extra1 = &min_sched_granularity_ns,
|
|
.extra2 = &max_sched_granularity_ns,
|
|
},
|
|
{
|
|
.procname = "sched_is_big_little",
|
|
.data = &sysctl_sched_is_big_little,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_sync_hint_enable",
|
|
.data = &sysctl_sched_sync_hint_enable,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_initial_task_util",
|
|
.data = &sysctl_sched_initial_task_util,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_cstate_aware",
|
|
.data = &sysctl_sched_cstate_aware,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_wakeup_granularity_ns",
|
|
.data = &sysctl_sched_wakeup_granularity,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_proc_update_handler,
|
|
.extra1 = &min_wakeup_granularity_ns,
|
|
.extra2 = &max_wakeup_granularity_ns,
|
|
},
|
|
#ifdef CONFIG_SMP
|
|
{
|
|
.procname = "sched_tunable_scaling",
|
|
.data = &sysctl_sched_tunable_scaling,
|
|
.maxlen = sizeof(enum sched_tunable_scaling),
|
|
.mode = 0644,
|
|
.proc_handler = sched_proc_update_handler,
|
|
.extra1 = &min_sched_tunable_scaling,
|
|
.extra2 = &max_sched_tunable_scaling,
|
|
},
|
|
{
|
|
.procname = "sched_migration_cost_ns",
|
|
.data = &sysctl_sched_migration_cost,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_nr_migrate",
|
|
.data = &sysctl_sched_nr_migrate,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "sched_time_avg_ms",
|
|
.data = &sysctl_sched_time_avg,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &one,
|
|
},
|
|
{
|
|
.procname = "sched_shares_window_ns",
|
|
.data = &sysctl_sched_shares_window,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif /* CONFIG_SMP */
|
|
#ifdef CONFIG_NUMA_BALANCING
|
|
{
|
|
.procname = "numa_balancing_scan_delay_ms",
|
|
.data = &sysctl_numa_balancing_scan_delay,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "numa_balancing_scan_period_min_ms",
|
|
.data = &sysctl_numa_balancing_scan_period_min,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "numa_balancing_scan_period_max_ms",
|
|
.data = &sysctl_numa_balancing_scan_period_max,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "numa_balancing_scan_size_mb",
|
|
.data = &sysctl_numa_balancing_scan_size,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &one,
|
|
},
|
|
{
|
|
.procname = "numa_balancing",
|
|
.data = NULL, /* filled in by handler */
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sysctl_numa_balancing,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#endif /* CONFIG_NUMA_BALANCING */
|
|
#endif /* CONFIG_SCHED_DEBUG */
|
|
{
|
|
.procname = "sched_rt_period_us",
|
|
.data = &sysctl_sched_rt_period,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_rt_handler,
|
|
},
|
|
{
|
|
.procname = "sched_rt_runtime_us",
|
|
.data = &sysctl_sched_rt_runtime,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_rt_handler,
|
|
},
|
|
{
|
|
.procname = "sched_rr_timeslice_ms",
|
|
.data = &sched_rr_timeslice,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = sched_rr_handler,
|
|
},
|
|
#ifdef CONFIG_SCHED_AUTOGROUP
|
|
{
|
|
.procname = "sched_autogroup_enabled",
|
|
.data = &sysctl_sched_autogroup_enabled,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_CFS_BANDWIDTH
|
|
{
|
|
.procname = "sched_cfs_bandwidth_slice_us",
|
|
.data = &sysctl_sched_cfs_bandwidth_slice,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &one,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_SCHED_TUNE
|
|
{
|
|
.procname = "sched_cfs_boost",
|
|
.data = &sysctl_sched_cfs_boost,
|
|
.maxlen = sizeof(sysctl_sched_cfs_boost),
|
|
#ifdef CONFIG_CGROUP_SCHEDTUNE
|
|
.mode = 0444,
|
|
#else
|
|
.mode = 0644,
|
|
#endif
|
|
.proc_handler = &sysctl_sched_cfs_boost_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_PROVE_LOCKING
|
|
{
|
|
.procname = "prove_locking",
|
|
.data = &prove_locking,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_LOCK_STAT
|
|
{
|
|
.procname = "lock_stat",
|
|
.data = &lock_stat,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "panic",
|
|
.data = &panic_timeout,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#ifdef CONFIG_COREDUMP
|
|
{
|
|
.procname = "core_uses_pid",
|
|
.data = &core_uses_pid,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "core_pattern",
|
|
.data = core_pattern,
|
|
.maxlen = CORENAME_MAX_SIZE,
|
|
.mode = 0644,
|
|
.proc_handler = proc_dostring_coredump,
|
|
},
|
|
{
|
|
.procname = "core_pipe_limit",
|
|
.data = &core_pipe_limit,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_PROC_SYSCTL
|
|
{
|
|
.procname = "tainted",
|
|
.maxlen = sizeof(long),
|
|
.mode = 0644,
|
|
.proc_handler = proc_taint,
|
|
},
|
|
{
|
|
.procname = "sysctl_writes_strict",
|
|
.data = &sysctl_writes_strict,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &neg_one,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_LATENCYTOP
|
|
{
|
|
.procname = "latencytop",
|
|
.data = &latencytop_enabled,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
{
|
|
.procname = "real-root-dev",
|
|
.data = &real_root_dev,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "print-fatal-signals",
|
|
.data = &print_fatal_signals,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#ifdef CONFIG_SPARC
|
|
{
|
|
.procname = "reboot-cmd",
|
|
.data = reboot_command,
|
|
.maxlen = 256,
|
|
.mode = 0644,
|
|
.proc_handler = proc_dostring,
|
|
},
|
|
{
|
|
.procname = "stop-a",
|
|
.data = &stop_a_enabled,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "scons-poweroff",
|
|
.data = &scons_pwroff,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_SPARC64
|
|
{
|
|
.procname = "tsb-ratio",
|
|
.data = &sysctl_tsb_ratio,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef __hppa__
|
|
{
|
|
.procname = "soft-power",
|
|
.data = &pwrsw_enabled,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW
|
|
{
|
|
.procname = "unaligned-trap",
|
|
.data = &unaligned_enabled,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "ctrl-alt-del",
|
|
.data = &C_A_D,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#ifdef CONFIG_FUNCTION_TRACER
|
|
{
|
|
.procname = "ftrace_enabled",
|
|
.data = &ftrace_enabled,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = ftrace_enable_sysctl,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_STACK_TRACER
|
|
{
|
|
.procname = "stack_tracer_enabled",
|
|
.data = &stack_tracer_enabled,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = stack_trace_sysctl,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_TRACING
|
|
{
|
|
.procname = "ftrace_dump_on_oops",
|
|
.data = &ftrace_dump_on_oops,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "traceoff_on_warning",
|
|
.data = &__disable_trace_on_warning,
|
|
.maxlen = sizeof(__disable_trace_on_warning),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "tracepoint_printk",
|
|
.data = &tracepoint_printk,
|
|
.maxlen = sizeof(tracepoint_printk),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_KEXEC_CORE
|
|
{
|
|
.procname = "kexec_load_disabled",
|
|
.data = &kexec_load_disabled,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
/* only handle a transition from default "0" to "1" */
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &one,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_MODULES
|
|
{
|
|
.procname = "modprobe",
|
|
.data = &modprobe_path,
|
|
.maxlen = KMOD_PATH_LEN,
|
|
.mode = 0644,
|
|
.proc_handler = proc_dostring,
|
|
},
|
|
{
|
|
.procname = "modules_disabled",
|
|
.data = &modules_disabled,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
/* only handle a transition from default "0" to "1" */
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &one,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_UEVENT_HELPER
|
|
{
|
|
.procname = "hotplug",
|
|
.data = &uevent_helper,
|
|
.maxlen = UEVENT_HELPER_PATH_LEN,
|
|
.mode = 0644,
|
|
.proc_handler = proc_dostring,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_CHR_DEV_SG
|
|
{
|
|
.procname = "sg-big-buff",
|
|
.data = &sg_big_buff,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0444,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_BSD_PROCESS_ACCT
|
|
{
|
|
.procname = "acct",
|
|
.data = &acct_parm,
|
|
.maxlen = 3*sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_MAGIC_SYSRQ
|
|
{
|
|
.procname = "sysrq",
|
|
.data = &__sysrq_enabled,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = sysrq_sysctl_handler,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_PROC_SYSCTL
|
|
{
|
|
.procname = "cad_pid",
|
|
.data = NULL,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0600,
|
|
.proc_handler = proc_do_cad_pid,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "threads-max",
|
|
.data = NULL,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = sysctl_max_threads,
|
|
},
|
|
{
|
|
.procname = "random",
|
|
.mode = 0555,
|
|
.child = random_table,
|
|
},
|
|
{
|
|
.procname = "usermodehelper",
|
|
.mode = 0555,
|
|
.child = usermodehelper_table,
|
|
},
|
|
{
|
|
.procname = "overflowuid",
|
|
.data = &overflowuid,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &minolduid,
|
|
.extra2 = &maxolduid,
|
|
},
|
|
{
|
|
.procname = "overflowgid",
|
|
.data = &overflowgid,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &minolduid,
|
|
.extra2 = &maxolduid,
|
|
},
|
|
#ifdef CONFIG_S390
|
|
#ifdef CONFIG_MATHEMU
|
|
{
|
|
.procname = "ieee_emulation_warnings",
|
|
.data = &sysctl_ieee_emulation_warnings,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "userprocess_debug",
|
|
.data = &show_unhandled_signals,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "pid_max",
|
|
.data = &pid_max,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &pid_max_min,
|
|
.extra2 = &pid_max_max,
|
|
},
|
|
{
|
|
.procname = "panic_on_oops",
|
|
.data = &panic_on_oops,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#if defined CONFIG_PRINTK
|
|
{
|
|
.procname = "printk",
|
|
.data = &console_loglevel,
|
|
.maxlen = 4*sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "printk_ratelimit",
|
|
.data = &printk_ratelimit_state.interval,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_jiffies,
|
|
},
|
|
{
|
|
.procname = "printk_ratelimit_burst",
|
|
.data = &printk_ratelimit_state.burst,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "printk_delay",
|
|
.data = &printk_delay_msec,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &ten_thousand,
|
|
},
|
|
{
|
|
.procname = "dmesg_restrict",
|
|
.data = &dmesg_restrict,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax_sysadmin,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "kptr_restrict",
|
|
.data = &kptr_restrict,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax_sysadmin,
|
|
.extra1 = &zero,
|
|
.extra2 = &two,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "ngroups_max",
|
|
.data = &ngroups_max,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0444,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "cap_last_cap",
|
|
.data = (void *)&cap_last_cap,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0444,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#if defined(CONFIG_LOCKUP_DETECTOR)
|
|
{
|
|
.procname = "watchdog",
|
|
.data = &watchdog_user_enabled,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_watchdog,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "watchdog_thresh",
|
|
.data = &watchdog_thresh,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_watchdog_thresh,
|
|
.extra1 = &zero,
|
|
.extra2 = &sixty,
|
|
},
|
|
{
|
|
.procname = "nmi_watchdog",
|
|
.data = &nmi_watchdog_enabled,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_nmi_watchdog,
|
|
.extra1 = &zero,
|
|
#if defined(CONFIG_HAVE_NMI_WATCHDOG) || defined(CONFIG_HARDLOCKUP_DETECTOR)
|
|
.extra2 = &one,
|
|
#else
|
|
.extra2 = &zero,
|
|
#endif
|
|
},
|
|
{
|
|
.procname = "soft_watchdog",
|
|
.data = &soft_watchdog_enabled,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_soft_watchdog,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "watchdog_cpumask",
|
|
.data = &watchdog_cpumask_bits,
|
|
.maxlen = NR_CPUS,
|
|
.mode = 0644,
|
|
.proc_handler = proc_watchdog_cpumask,
|
|
},
|
|
{
|
|
.procname = "softlockup_panic",
|
|
.data = &softlockup_panic,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
|
{
|
|
.procname = "hardlockup_panic",
|
|
.data = &hardlockup_panic,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_SMP
|
|
{
|
|
.procname = "softlockup_all_cpu_backtrace",
|
|
.data = &sysctl_softlockup_all_cpu_backtrace,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "hardlockup_all_cpu_backtrace",
|
|
.data = &sysctl_hardlockup_all_cpu_backtrace,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#endif /* CONFIG_SMP */
|
|
#endif
|
|
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86)
|
|
{
|
|
.procname = "unknown_nmi_panic",
|
|
.data = &unknown_nmi_panic,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#if defined(CONFIG_X86)
|
|
{
|
|
.procname = "panic_on_unrecovered_nmi",
|
|
.data = &panic_on_unrecovered_nmi,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "panic_on_io_nmi",
|
|
.data = &panic_on_io_nmi,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
|
{
|
|
.procname = "panic_on_stackoverflow",
|
|
.data = &sysctl_panic_on_stackoverflow,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "bootloader_type",
|
|
.data = &bootloader_type,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0444,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "bootloader_version",
|
|
.data = &bootloader_version,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0444,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "kstack_depth_to_print",
|
|
.data = &kstack_depth_to_print,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "io_delay_type",
|
|
.data = &io_delay_type,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#if defined(CONFIG_MMU)
|
|
{
|
|
.procname = "randomize_va_space",
|
|
.data = &randomize_va_space,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#if defined(CONFIG_S390) && defined(CONFIG_SMP)
|
|
{
|
|
.procname = "spin_retry",
|
|
.data = &spin_retry,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#if defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86)
|
|
{
|
|
.procname = "acpi_video_flags",
|
|
.data = &acpi_realmode_flags,
|
|
.maxlen = sizeof (unsigned long),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN
|
|
{
|
|
.procname = "ignore-unaligned-usertrap",
|
|
.data = &no_unaligned_warning,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_IA64
|
|
{
|
|
.procname = "unaligned-dump-stack",
|
|
.data = &unaligned_dump_stack,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_DETECT_HUNG_TASK
|
|
{
|
|
.procname = "hung_task_panic",
|
|
.data = &sysctl_hung_task_panic,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "hung_task_check_count",
|
|
.data = &sysctl_hung_task_check_count,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "hung_task_timeout_secs",
|
|
.data = &sysctl_hung_task_timeout_secs,
|
|
.maxlen = sizeof(unsigned long),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dohung_task_timeout_secs,
|
|
.extra2 = &hung_task_timeout_max,
|
|
},
|
|
{
|
|
.procname = "hung_task_warnings",
|
|
.data = &sysctl_hung_task_warnings,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &neg_one,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_COMPAT
|
|
{
|
|
.procname = "compat-log",
|
|
.data = &compat_log,
|
|
.maxlen = sizeof (int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_RT_MUTEXES
|
|
{
|
|
.procname = "max_lock_depth",
|
|
.data = &max_lock_depth,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "poweroff_cmd",
|
|
.data = &poweroff_cmd,
|
|
.maxlen = POWEROFF_CMD_PATH_LEN,
|
|
.mode = 0644,
|
|
.proc_handler = proc_dostring,
|
|
},
|
|
#ifdef CONFIG_KEYS
|
|
{
|
|
.procname = "keys",
|
|
.mode = 0555,
|
|
.child = key_sysctls,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_PERF_EVENTS
|
|
/*
|
|
* User-space scripts rely on the existence of this file
|
|
* as a feature check for perf_events being enabled.
|
|
*
|
|
* So it's an ABI, do not remove!
|
|
*/
|
|
{
|
|
.procname = "perf_event_paranoid",
|
|
.data = &sysctl_perf_event_paranoid,
|
|
.maxlen = sizeof(sysctl_perf_event_paranoid),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "perf_event_mlock_kb",
|
|
.data = &sysctl_perf_event_mlock,
|
|
.maxlen = sizeof(sysctl_perf_event_mlock),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "perf_event_max_sample_rate",
|
|
.data = &sysctl_perf_event_sample_rate,
|
|
.maxlen = sizeof(sysctl_perf_event_sample_rate),
|
|
.mode = 0644,
|
|
.proc_handler = perf_proc_update_handler,
|
|
.extra1 = &one,
|
|
},
|
|
{
|
|
.procname = "perf_cpu_time_max_percent",
|
|
.data = &sysctl_perf_cpu_time_max_percent,
|
|
.maxlen = sizeof(sysctl_perf_cpu_time_max_percent),
|
|
.mode = 0644,
|
|
.proc_handler = perf_cpu_time_max_percent_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_KMEMCHECK
|
|
{
|
|
.procname = "kmemcheck",
|
|
.data = &kmemcheck_enabled,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "panic_on_warn",
|
|
.data = &panic_on_warn,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)
|
|
{
|
|
.procname = "timer_migration",
|
|
.data = &sysctl_timer_migration,
|
|
.maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
.proc_handler = timer_migration_handler,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_BPF_SYSCALL
|
|
{
|
|
.procname = "unprivileged_bpf_disabled",
|
|
.data = &sysctl_unprivileged_bpf_disabled,
|
|
.maxlen = sizeof(sysctl_unprivileged_bpf_disabled),
|
|
.mode = 0644,
|
|
/* only handle a transition from default "0" to "1" */
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &one,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
#if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
|
|
{
|
|
.procname = "boot_reason",
|
|
.data = &boot_reason,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0444,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
|
|
{
|
|
.procname = "cold_boot",
|
|
.data = &cold_boot,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0444,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
/*
|
|
* NOTE: do not add new entries to this table unless you have read
|
|
* Documentation/sysctl/ctl_unnumbered.txt
|
|
*/
|
|
{ }
|
|
};
|
|
|
|
static struct ctl_table vm_table[] = {
|
|
{
|
|
.procname = "overcommit_memory",
|
|
.data = &sysctl_overcommit_memory,
|
|
.maxlen = sizeof(sysctl_overcommit_memory),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &two,
|
|
},
|
|
{
|
|
.procname = "panic_on_oom",
|
|
.data = &sysctl_panic_on_oom,
|
|
.maxlen = sizeof(sysctl_panic_on_oom),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &two,
|
|
},
|
|
{
|
|
.procname = "oom_kill_allocating_task",
|
|
.data = &sysctl_oom_kill_allocating_task,
|
|
.maxlen = sizeof(sysctl_oom_kill_allocating_task),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "oom_dump_tasks",
|
|
.data = &sysctl_oom_dump_tasks,
|
|
.maxlen = sizeof(sysctl_oom_dump_tasks),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "overcommit_ratio",
|
|
.data = &sysctl_overcommit_ratio,
|
|
.maxlen = sizeof(sysctl_overcommit_ratio),
|
|
.mode = 0644,
|
|
.proc_handler = overcommit_ratio_handler,
|
|
},
|
|
{
|
|
.procname = "overcommit_kbytes",
|
|
.data = &sysctl_overcommit_kbytes,
|
|
.maxlen = sizeof(sysctl_overcommit_kbytes),
|
|
.mode = 0644,
|
|
.proc_handler = overcommit_kbytes_handler,
|
|
},
|
|
{
|
|
.procname = "page-cluster",
|
|
.data = &page_cluster,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "dirty_background_ratio",
|
|
.data = &dirty_background_ratio,
|
|
.maxlen = sizeof(dirty_background_ratio),
|
|
.mode = 0644,
|
|
.proc_handler = dirty_background_ratio_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "dirty_background_bytes",
|
|
.data = &dirty_background_bytes,
|
|
.maxlen = sizeof(dirty_background_bytes),
|
|
.mode = 0644,
|
|
.proc_handler = dirty_background_bytes_handler,
|
|
.extra1 = &one_ul,
|
|
},
|
|
{
|
|
.procname = "dirty_ratio",
|
|
.data = &vm_dirty_ratio,
|
|
.maxlen = sizeof(vm_dirty_ratio),
|
|
.mode = 0644,
|
|
.proc_handler = dirty_ratio_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "dirty_bytes",
|
|
.data = &vm_dirty_bytes,
|
|
.maxlen = sizeof(vm_dirty_bytes),
|
|
.mode = 0644,
|
|
.proc_handler = dirty_bytes_handler,
|
|
.extra1 = &dirty_bytes_min,
|
|
},
|
|
{
|
|
.procname = "dirty_writeback_centisecs",
|
|
.data = &dirty_writeback_interval,
|
|
.maxlen = sizeof(dirty_writeback_interval),
|
|
.mode = 0644,
|
|
.proc_handler = dirty_writeback_centisecs_handler,
|
|
},
|
|
{
|
|
.procname = "dirty_expire_centisecs",
|
|
.data = &dirty_expire_interval,
|
|
.maxlen = sizeof(dirty_expire_interval),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "dirtytime_expire_seconds",
|
|
.data = &dirtytime_expire_interval,
|
|
.maxlen = sizeof(dirty_expire_interval),
|
|
.mode = 0644,
|
|
.proc_handler = dirtytime_interval_handler,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "nr_pdflush_threads",
|
|
.mode = 0444 /* read-only */,
|
|
.proc_handler = pdflush_proc_obsolete,
|
|
},
|
|
{
|
|
.procname = "swappiness",
|
|
.data = &vm_swappiness,
|
|
.maxlen = sizeof(vm_swappiness),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
#ifdef CONFIG_HUGETLB_PAGE
|
|
{
|
|
.procname = "nr_hugepages",
|
|
.data = NULL,
|
|
.maxlen = sizeof(unsigned long),
|
|
.mode = 0644,
|
|
.proc_handler = hugetlb_sysctl_handler,
|
|
},
|
|
#ifdef CONFIG_NUMA
|
|
{
|
|
.procname = "nr_hugepages_mempolicy",
|
|
.data = NULL,
|
|
.maxlen = sizeof(unsigned long),
|
|
.mode = 0644,
|
|
.proc_handler = &hugetlb_mempolicy_sysctl_handler,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "hugetlb_shm_group",
|
|
.data = &sysctl_hugetlb_shm_group,
|
|
.maxlen = sizeof(gid_t),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "hugepages_treat_as_movable",
|
|
.data = &hugepages_treat_as_movable,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
{
|
|
.procname = "nr_overcommit_hugepages",
|
|
.data = NULL,
|
|
.maxlen = sizeof(unsigned long),
|
|
.mode = 0644,
|
|
.proc_handler = hugetlb_overcommit_handler,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "lowmem_reserve_ratio",
|
|
.data = &sysctl_lowmem_reserve_ratio,
|
|
.maxlen = sizeof(sysctl_lowmem_reserve_ratio),
|
|
.mode = 0644,
|
|
.proc_handler = lowmem_reserve_ratio_sysctl_handler,
|
|
},
|
|
{
|
|
.procname = "drop_caches",
|
|
.data = &sysctl_drop_caches,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = drop_caches_sysctl_handler,
|
|
.extra1 = &one,
|
|
.extra2 = &four,
|
|
},
|
|
#ifdef CONFIG_COMPACTION
|
|
{
|
|
.procname = "compact_memory",
|
|
.data = &sysctl_compact_memory,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0200,
|
|
.proc_handler = sysctl_compaction_handler,
|
|
},
|
|
{
|
|
.procname = "extfrag_threshold",
|
|
.data = &sysctl_extfrag_threshold,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = sysctl_extfrag_handler,
|
|
.extra1 = &min_extfrag_threshold,
|
|
.extra2 = &max_extfrag_threshold,
|
|
},
|
|
{
|
|
.procname = "compact_unevictable_allowed",
|
|
.data = &sysctl_compact_unevictable_allowed,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
|
|
#endif /* CONFIG_COMPACTION */
|
|
{
|
|
.procname = "min_free_kbytes",
|
|
.data = &min_free_kbytes,
|
|
.maxlen = sizeof(min_free_kbytes),
|
|
.mode = 0644,
|
|
.proc_handler = min_free_kbytes_sysctl_handler,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "extra_free_kbytes",
|
|
.data = &extra_free_kbytes,
|
|
.maxlen = sizeof(extra_free_kbytes),
|
|
.mode = 0644,
|
|
.proc_handler = min_free_kbytes_sysctl_handler,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "percpu_pagelist_fraction",
|
|
.data = &percpu_pagelist_fraction,
|
|
.maxlen = sizeof(percpu_pagelist_fraction),
|
|
.mode = 0644,
|
|
.proc_handler = percpu_pagelist_fraction_sysctl_handler,
|
|
.extra1 = &zero,
|
|
},
|
|
#ifdef CONFIG_MMU
|
|
{
|
|
.procname = "max_map_count",
|
|
.data = &sysctl_max_map_count,
|
|
.maxlen = sizeof(sysctl_max_map_count),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
#else
|
|
{
|
|
.procname = "nr_trim_pages",
|
|
.data = &sysctl_nr_trim_pages,
|
|
.maxlen = sizeof(sysctl_nr_trim_pages),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "laptop_mode",
|
|
.data = &laptop_mode,
|
|
.maxlen = sizeof(laptop_mode),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_jiffies,
|
|
},
|
|
{
|
|
.procname = "block_dump",
|
|
.data = &block_dump,
|
|
.maxlen = sizeof(block_dump),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "vfs_cache_pressure",
|
|
.data = &sysctl_vfs_cache_pressure,
|
|
.maxlen = sizeof(sysctl_vfs_cache_pressure),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
.extra1 = &zero,
|
|
},
|
|
#ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
|
|
{
|
|
.procname = "legacy_va_layout",
|
|
.data = &sysctl_legacy_va_layout,
|
|
.maxlen = sizeof(sysctl_legacy_va_layout),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
.extra1 = &zero,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_NUMA
|
|
{
|
|
.procname = "zone_reclaim_mode",
|
|
.data = &zone_reclaim_mode,
|
|
.maxlen = sizeof(zone_reclaim_mode),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
.extra1 = &zero,
|
|
},
|
|
{
|
|
.procname = "min_unmapped_ratio",
|
|
.data = &sysctl_min_unmapped_ratio,
|
|
.maxlen = sizeof(sysctl_min_unmapped_ratio),
|
|
.mode = 0644,
|
|
.proc_handler = sysctl_min_unmapped_ratio_sysctl_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
{
|
|
.procname = "min_slab_ratio",
|
|
.data = &sysctl_min_slab_ratio,
|
|
.maxlen = sizeof(sysctl_min_slab_ratio),
|
|
.mode = 0644,
|
|
.proc_handler = sysctl_min_slab_ratio_sysctl_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one_hundred,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_SMP
|
|
{
|
|
.procname = "stat_interval",
|
|
.data = &sysctl_stat_interval,
|
|
.maxlen = sizeof(sysctl_stat_interval),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_jiffies,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_MMU
|
|
{
|
|
.procname = "mmap_min_addr",
|
|
.data = &dac_mmap_min_addr,
|
|
.maxlen = sizeof(unsigned long),
|
|
.mode = 0644,
|
|
.proc_handler = mmap_min_addr_handler,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_NUMA
|
|
{
|
|
.procname = "numa_zonelist_order",
|
|
.data = &numa_zonelist_order,
|
|
.maxlen = NUMA_ZONELIST_ORDER_LEN,
|
|
.mode = 0644,
|
|
.proc_handler = numa_zonelist_order_handler,
|
|
},
|
|
#endif
|
|
#if (defined(CONFIG_X86_32) && !defined(CONFIG_UML))|| \
|
|
(defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))
|
|
{
|
|
.procname = "vdso_enabled",
|
|
#ifdef CONFIG_X86_32
|
|
.data = &vdso32_enabled,
|
|
.maxlen = sizeof(vdso32_enabled),
|
|
#else
|
|
.data = &vdso_enabled,
|
|
.maxlen = sizeof(vdso_enabled),
|
|
#endif
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
.extra1 = &zero,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_HIGHMEM
|
|
{
|
|
.procname = "highmem_is_dirtyable",
|
|
.data = &vm_highmem_is_dirtyable,
|
|
.maxlen = sizeof(vm_highmem_is_dirtyable),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_MEMORY_FAILURE
|
|
{
|
|
.procname = "memory_failure_early_kill",
|
|
.data = &sysctl_memory_failure_early_kill,
|
|
.maxlen = sizeof(sysctl_memory_failure_early_kill),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "memory_failure_recovery",
|
|
.data = &sysctl_memory_failure_recovery,
|
|
.maxlen = sizeof(sysctl_memory_failure_recovery),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "user_reserve_kbytes",
|
|
.data = &sysctl_user_reserve_kbytes,
|
|
.maxlen = sizeof(sysctl_user_reserve_kbytes),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
},
|
|
{
|
|
.procname = "admin_reserve_kbytes",
|
|
.data = &sysctl_admin_reserve_kbytes,
|
|
.maxlen = sizeof(sysctl_admin_reserve_kbytes),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
},
|
|
#ifdef CONFIG_HAVE_ARCH_MMAP_RND_BITS
|
|
{
|
|
.procname = "mmap_rnd_bits",
|
|
.data = &mmap_rnd_bits,
|
|
.maxlen = sizeof(mmap_rnd_bits),
|
|
.mode = 0600,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = (void *)&mmap_rnd_bits_min,
|
|
.extra2 = (void *)&mmap_rnd_bits_max,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS
|
|
{
|
|
.procname = "mmap_rnd_compat_bits",
|
|
.data = &mmap_rnd_compat_bits,
|
|
.maxlen = sizeof(mmap_rnd_compat_bits),
|
|
.mode = 0600,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = (void *)&mmap_rnd_compat_bits_min,
|
|
.extra2 = (void *)&mmap_rnd_compat_bits_max,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_SWAP
|
|
{
|
|
.procname = "swap_ratio",
|
|
.data = &sysctl_swap_ratio,
|
|
.maxlen = sizeof(sysctl_swap_ratio),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
},
|
|
{
|
|
.procname = "swap_ratio_enable",
|
|
.data = &sysctl_swap_ratio_enable,
|
|
.maxlen = sizeof(sysctl_swap_ratio_enable),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
},
|
|
#endif
|
|
{ }
|
|
};
|
|
|
|
static struct ctl_table fs_table[] = {
|
|
{
|
|
.procname = "inode-nr",
|
|
.data = &inodes_stat,
|
|
.maxlen = 2*sizeof(long),
|
|
.mode = 0444,
|
|
.proc_handler = proc_nr_inodes,
|
|
},
|
|
{
|
|
.procname = "inode-state",
|
|
.data = &inodes_stat,
|
|
.maxlen = 7*sizeof(long),
|
|
.mode = 0444,
|
|
.proc_handler = proc_nr_inodes,
|
|
},
|
|
{
|
|
.procname = "file-nr",
|
|
.data = &files_stat,
|
|
.maxlen = sizeof(files_stat),
|
|
.mode = 0444,
|
|
.proc_handler = proc_nr_files,
|
|
},
|
|
{
|
|
.procname = "file-max",
|
|
.data = &files_stat.max_files,
|
|
.maxlen = sizeof(files_stat.max_files),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
},
|
|
{
|
|
.procname = "nr_open",
|
|
.data = &sysctl_nr_open,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &sysctl_nr_open_min,
|
|
.extra2 = &sysctl_nr_open_max,
|
|
},
|
|
{
|
|
.procname = "dentry-state",
|
|
.data = &dentry_stat,
|
|
.maxlen = 6*sizeof(long),
|
|
.mode = 0444,
|
|
.proc_handler = proc_nr_dentry,
|
|
},
|
|
{
|
|
.procname = "overflowuid",
|
|
.data = &fs_overflowuid,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &minolduid,
|
|
.extra2 = &maxolduid,
|
|
},
|
|
{
|
|
.procname = "overflowgid",
|
|
.data = &fs_overflowgid,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &minolduid,
|
|
.extra2 = &maxolduid,
|
|
},
|
|
#ifdef CONFIG_FILE_LOCKING
|
|
{
|
|
.procname = "leases-enable",
|
|
.data = &leases_enable,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_DNOTIFY
|
|
{
|
|
.procname = "dir-notify-enable",
|
|
.data = &dir_notify_enable,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_MMU
|
|
#ifdef CONFIG_FILE_LOCKING
|
|
{
|
|
.procname = "lease-break-time",
|
|
.data = &lease_break_time,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_AIO
|
|
{
|
|
.procname = "aio-nr",
|
|
.data = &aio_nr,
|
|
.maxlen = sizeof(aio_nr),
|
|
.mode = 0444,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
},
|
|
{
|
|
.procname = "aio-max-nr",
|
|
.data = &aio_max_nr,
|
|
.maxlen = sizeof(aio_max_nr),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
},
|
|
#endif /* CONFIG_AIO */
|
|
#ifdef CONFIG_INOTIFY_USER
|
|
{
|
|
.procname = "inotify",
|
|
.mode = 0555,
|
|
.child = inotify_table,
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_EPOLL
|
|
{
|
|
.procname = "epoll",
|
|
.mode = 0555,
|
|
.child = epoll_table,
|
|
},
|
|
#endif
|
|
#endif
|
|
{
|
|
.procname = "protected_symlinks",
|
|
.data = &sysctl_protected_symlinks,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0600,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "protected_hardlinks",
|
|
.data = &sysctl_protected_hardlinks,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0600,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
{
|
|
.procname = "suid_dumpable",
|
|
.data = &suid_dumpable,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax_coredump,
|
|
.extra1 = &zero,
|
|
.extra2 = &two,
|
|
},
|
|
#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
|
|
{
|
|
.procname = "binfmt_misc",
|
|
.mode = 0555,
|
|
.child = sysctl_mount_point,
|
|
},
|
|
#endif
|
|
{
|
|
.procname = "pipe-max-size",
|
|
.data = &pipe_max_size,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = &pipe_proc_fn,
|
|
.extra1 = &pipe_min_size,
|
|
},
|
|
{
|
|
.procname = "pipe-user-pages-hard",
|
|
.data = &pipe_user_pages_hard,
|
|
.maxlen = sizeof(pipe_user_pages_hard),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
},
|
|
{
|
|
.procname = "pipe-user-pages-soft",
|
|
.data = &pipe_user_pages_soft,
|
|
.maxlen = sizeof(pipe_user_pages_soft),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
},
|
|
{ }
|
|
};
|
|
|
|
static struct ctl_table debug_table[] = {
|
|
#ifdef CONFIG_SYSCTL_EXCEPTION_TRACE
|
|
{
|
|
.procname = "exception-trace",
|
|
.data = &show_unhandled_signals,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec
|
|
},
|
|
#endif
|
|
#if defined(CONFIG_OPTPROBES)
|
|
{
|
|
.procname = "kprobes-optimization",
|
|
.data = &sysctl_kprobes_optimization,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_kprobes_optimization_handler,
|
|
.extra1 = &zero,
|
|
.extra2 = &one,
|
|
},
|
|
#endif
|
|
{ }
|
|
};
|
|
|
|
static struct ctl_table dev_table[] = {
|
|
{ }
|
|
};
|
|
|
|
int __init sysctl_init(void)
|
|
{
|
|
struct ctl_table_header *hdr;
|
|
|
|
hdr = register_sysctl_table(sysctl_base_table);
|
|
kmemleak_not_leak(hdr);
|
|
return 0;
|
|
}
|
|
|
|
#endif /* CONFIG_SYSCTL */
|
|
|
|
/*
|
|
* /proc/sys support
|
|
*/
|
|
|
|
#ifdef CONFIG_PROC_SYSCTL
|
|
|
|
static int _proc_do_string(char *data, int maxlen, int write,
|
|
char __user *buffer,
|
|
size_t *lenp, loff_t *ppos)
|
|
{
|
|
size_t len;
|
|
char __user *p;
|
|
char c;
|
|
|
|
if (!data || !maxlen || !*lenp) {
|
|
*lenp = 0;
|
|
return 0;
|
|
}
|
|
|
|
if (write) {
|
|
if (sysctl_writes_strict == SYSCTL_WRITES_STRICT) {
|
|
/* Only continue writes not past the end of buffer. */
|
|
len = strlen(data);
|
|
if (len > maxlen - 1)
|
|
len = maxlen - 1;
|
|
|
|
if (*ppos > len)
|
|
return 0;
|
|
len = *ppos;
|
|
} else {
|
|
/* Start writing from beginning of buffer. */
|
|
len = 0;
|
|
}
|
|
|
|
*ppos += *lenp;
|
|
p = buffer;
|
|
while ((p - buffer) < *lenp && len < maxlen - 1) {
|
|
if (get_user(c, p++))
|
|
return -EFAULT;
|
|
if (c == 0 || c == '\n')
|
|
break;
|
|
data[len++] = c;
|
|
}
|
|
data[len] = 0;
|
|
} else {
|
|
len = strlen(data);
|
|
if (len > maxlen)
|
|
len = maxlen;
|
|
|
|
if (*ppos > len) {
|
|
*lenp = 0;
|
|
return 0;
|
|
}
|
|
|
|
data += *ppos;
|
|
len -= *ppos;
|
|
|
|
if (len > *lenp)
|
|
len = *lenp;
|
|
if (len)
|
|
if (copy_to_user(buffer, data, len))
|
|
return -EFAULT;
|
|
if (len < *lenp) {
|
|
if (put_user('\n', buffer + len))
|
|
return -EFAULT;
|
|
len++;
|
|
}
|
|
*lenp = len;
|
|
*ppos += len;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void warn_sysctl_write(struct ctl_table *table)
|
|
{
|
|
pr_warn_once("%s wrote to %s when file position was not 0!\n"
|
|
"This will not be supported in the future. To silence this\n"
|
|
"warning, set kernel.sysctl_writes_strict = -1\n",
|
|
current->comm, table->procname);
|
|
}
|
|
|
|
/**
|
|
* proc_dostring - read a string sysctl
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
*
|
|
* Reads/writes a string from/to the user buffer. If the kernel
|
|
* buffer provided is not large enough to hold the string, the
|
|
* string is truncated. The copied string is %NULL-terminated.
|
|
* If the string is being read by the user process, it is copied
|
|
* and a newline '\n' is added. It is truncated if the buffer is
|
|
* not large enough.
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_dostring(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
if (write && *ppos && sysctl_writes_strict == SYSCTL_WRITES_WARN)
|
|
warn_sysctl_write(table);
|
|
|
|
return _proc_do_string((char *)(table->data), table->maxlen, write,
|
|
(char __user *)buffer, lenp, ppos);
|
|
}
|
|
|
|
static size_t proc_skip_spaces(char **buf)
|
|
{
|
|
size_t ret;
|
|
char *tmp = skip_spaces(*buf);
|
|
ret = tmp - *buf;
|
|
*buf = tmp;
|
|
return ret;
|
|
}
|
|
|
|
static void proc_skip_char(char **buf, size_t *size, const char v)
|
|
{
|
|
while (*size) {
|
|
if (**buf != v)
|
|
break;
|
|
(*size)--;
|
|
(*buf)++;
|
|
}
|
|
}
|
|
|
|
#define TMPBUFLEN 22
|
|
/**
|
|
* proc_get_long - reads an ASCII formatted integer from a user buffer
|
|
*
|
|
* @buf: a kernel buffer
|
|
* @size: size of the kernel buffer
|
|
* @val: this is where the number will be stored
|
|
* @neg: set to %TRUE if number is negative
|
|
* @perm_tr: a vector which contains the allowed trailers
|
|
* @perm_tr_len: size of the perm_tr vector
|
|
* @tr: pointer to store the trailer character
|
|
*
|
|
* In case of success %0 is returned and @buf and @size are updated with
|
|
* the amount of bytes read. If @tr is non-NULL and a trailing
|
|
* character exists (size is non-zero after returning from this
|
|
* function), @tr is updated with the trailing character.
|
|
*/
|
|
static int proc_get_long(char **buf, size_t *size,
|
|
unsigned long *val, bool *neg,
|
|
const char *perm_tr, unsigned perm_tr_len, char *tr)
|
|
{
|
|
int len;
|
|
char *p, tmp[TMPBUFLEN];
|
|
|
|
if (!*size)
|
|
return -EINVAL;
|
|
|
|
len = *size;
|
|
if (len > TMPBUFLEN - 1)
|
|
len = TMPBUFLEN - 1;
|
|
|
|
memcpy(tmp, *buf, len);
|
|
|
|
tmp[len] = 0;
|
|
p = tmp;
|
|
if (*p == '-' && *size > 1) {
|
|
*neg = true;
|
|
p++;
|
|
} else
|
|
*neg = false;
|
|
if (!isdigit(*p))
|
|
return -EINVAL;
|
|
|
|
*val = simple_strtoul(p, &p, 0);
|
|
|
|
len = p - tmp;
|
|
|
|
/* We don't know if the next char is whitespace thus we may accept
|
|
* invalid integers (e.g. 1234...a) or two integers instead of one
|
|
* (e.g. 123...1). So lets not allow such large numbers. */
|
|
if (len == TMPBUFLEN - 1)
|
|
return -EINVAL;
|
|
|
|
if (len < *size && perm_tr_len && !memchr(perm_tr, *p, perm_tr_len))
|
|
return -EINVAL;
|
|
|
|
if (tr && (len < *size))
|
|
*tr = *p;
|
|
|
|
*buf += len;
|
|
*size -= len;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* proc_put_long - converts an integer to a decimal ASCII formatted string
|
|
*
|
|
* @buf: the user buffer
|
|
* @size: the size of the user buffer
|
|
* @val: the integer to be converted
|
|
* @neg: sign of the number, %TRUE for negative
|
|
*
|
|
* In case of success %0 is returned and @buf and @size are updated with
|
|
* the amount of bytes written.
|
|
*/
|
|
static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
|
|
bool neg)
|
|
{
|
|
int len;
|
|
char tmp[TMPBUFLEN], *p = tmp;
|
|
|
|
sprintf(p, "%s%lu", neg ? "-" : "", val);
|
|
len = strlen(tmp);
|
|
if (len > *size)
|
|
len = *size;
|
|
if (copy_to_user(*buf, tmp, len))
|
|
return -EFAULT;
|
|
*size -= len;
|
|
*buf += len;
|
|
return 0;
|
|
}
|
|
#undef TMPBUFLEN
|
|
|
|
static int proc_put_char(void __user **buf, size_t *size, char c)
|
|
{
|
|
if (*size) {
|
|
char __user **buffer = (char __user **)buf;
|
|
if (put_user(c, *buffer))
|
|
return -EFAULT;
|
|
(*size)--, (*buffer)++;
|
|
*buf = *buffer;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
|
|
int *valp,
|
|
int write, void *data)
|
|
{
|
|
if (write) {
|
|
*valp = *negp ? -*lvalp : *lvalp;
|
|
} else {
|
|
int val = *valp;
|
|
if (val < 0) {
|
|
*negp = true;
|
|
*lvalp = -(unsigned long)val;
|
|
} else {
|
|
*negp = false;
|
|
*lvalp = (unsigned long)val;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int do_proc_douintvec_conv(bool *negp, unsigned long *lvalp,
|
|
int *valp,
|
|
int write, void *data)
|
|
{
|
|
if (write) {
|
|
if (*negp)
|
|
return -EINVAL;
|
|
*valp = *lvalp;
|
|
} else {
|
|
unsigned int val = *valp;
|
|
*lvalp = (unsigned long)val;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static const char proc_wspace_sep[] = { ' ', '\t', '\n' };
|
|
|
|
static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
|
|
int write, void __user *buffer,
|
|
size_t *lenp, loff_t *ppos,
|
|
int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
|
|
int write, void *data),
|
|
void *data)
|
|
{
|
|
int *i, vleft, first = 1, err = 0;
|
|
unsigned long page = 0;
|
|
size_t left;
|
|
char *kbuf;
|
|
|
|
if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) {
|
|
*lenp = 0;
|
|
return 0;
|
|
}
|
|
|
|
i = (int *) tbl_data;
|
|
vleft = table->maxlen / sizeof(*i);
|
|
left = *lenp;
|
|
|
|
if (!conv)
|
|
conv = do_proc_dointvec_conv;
|
|
|
|
if (write) {
|
|
if (*ppos) {
|
|
switch (sysctl_writes_strict) {
|
|
case SYSCTL_WRITES_STRICT:
|
|
goto out;
|
|
case SYSCTL_WRITES_WARN:
|
|
warn_sysctl_write(table);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (left > PAGE_SIZE - 1)
|
|
left = PAGE_SIZE - 1;
|
|
page = __get_free_page(GFP_TEMPORARY);
|
|
kbuf = (char *) page;
|
|
if (!kbuf)
|
|
return -ENOMEM;
|
|
if (copy_from_user(kbuf, buffer, left)) {
|
|
err = -EFAULT;
|
|
goto free;
|
|
}
|
|
kbuf[left] = 0;
|
|
}
|
|
|
|
for (; left && vleft--; i++, first=0) {
|
|
unsigned long lval;
|
|
bool neg;
|
|
|
|
if (write) {
|
|
left -= proc_skip_spaces(&kbuf);
|
|
|
|
if (!left)
|
|
break;
|
|
err = proc_get_long(&kbuf, &left, &lval, &neg,
|
|
proc_wspace_sep,
|
|
sizeof(proc_wspace_sep), NULL);
|
|
if (err)
|
|
break;
|
|
if (conv(&neg, &lval, i, 1, data)) {
|
|
err = -EINVAL;
|
|
break;
|
|
}
|
|
} else {
|
|
if (conv(&neg, &lval, i, 0, data)) {
|
|
err = -EINVAL;
|
|
break;
|
|
}
|
|
if (!first)
|
|
err = proc_put_char(&buffer, &left, '\t');
|
|
if (err)
|
|
break;
|
|
err = proc_put_long(&buffer, &left, lval, neg);
|
|
if (err)
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!write && !first && left && !err)
|
|
err = proc_put_char(&buffer, &left, '\n');
|
|
if (write && !err && left)
|
|
left -= proc_skip_spaces(&kbuf);
|
|
free:
|
|
if (write) {
|
|
free_page(page);
|
|
if (first)
|
|
return err ? : -EINVAL;
|
|
}
|
|
*lenp -= left;
|
|
out:
|
|
*ppos += *lenp;
|
|
return err;
|
|
}
|
|
|
|
static int do_proc_dointvec(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos,
|
|
int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
|
|
int write, void *data),
|
|
void *data)
|
|
{
|
|
return __do_proc_dointvec(table->data, table, write,
|
|
buffer, lenp, ppos, conv, data);
|
|
}
|
|
|
|
/**
|
|
* proc_dointvec - read a vector of integers
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
*
|
|
* Reads/writes up to table->maxlen/sizeof(unsigned int) integer
|
|
* values from/to the user buffer, treated as an ASCII string.
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_dointvec(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL);
|
|
}
|
|
|
|
/**
|
|
* proc_douintvec - read a vector of unsigned integers
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
*
|
|
* Reads/writes up to table->maxlen/sizeof(unsigned int) unsigned integer
|
|
* values from/to the user buffer, treated as an ASCII string.
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_douintvec(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return do_proc_dointvec(table, write, buffer, lenp, ppos,
|
|
do_proc_douintvec_conv, NULL);
|
|
}
|
|
|
|
/*
|
|
* Taint values can only be increased
|
|
* This means we can safely use a temporary.
|
|
*/
|
|
static int proc_taint(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
struct ctl_table t;
|
|
unsigned long tmptaint = get_taint();
|
|
int err;
|
|
|
|
if (write && !capable(CAP_SYS_ADMIN))
|
|
return -EPERM;
|
|
|
|
t = *table;
|
|
t.data = &tmptaint;
|
|
err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos);
|
|
if (err < 0)
|
|
return err;
|
|
|
|
if (write) {
|
|
/*
|
|
* Poor man's atomic or. Not worth adding a primitive
|
|
* to everyone's atomic.h for this
|
|
*/
|
|
int i;
|
|
for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) {
|
|
if ((tmptaint >> i) & 1)
|
|
add_taint(i, LOCKDEP_STILL_OK);
|
|
}
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
#ifdef CONFIG_PRINTK
|
|
static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
if (write && !capable(CAP_SYS_ADMIN))
|
|
return -EPERM;
|
|
|
|
return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
|
}
|
|
#endif
|
|
|
|
struct do_proc_dointvec_minmax_conv_param {
|
|
int *min;
|
|
int *max;
|
|
};
|
|
|
|
static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
|
|
int *valp,
|
|
int write, void *data)
|
|
{
|
|
struct do_proc_dointvec_minmax_conv_param *param = data;
|
|
if (write) {
|
|
int val = *negp ? -*lvalp : *lvalp;
|
|
if ((param->min && *param->min > val) ||
|
|
(param->max && *param->max < val))
|
|
return -EINVAL;
|
|
*valp = val;
|
|
} else {
|
|
int val = *valp;
|
|
if (val < 0) {
|
|
*negp = true;
|
|
*lvalp = -(unsigned long)val;
|
|
} else {
|
|
*negp = false;
|
|
*lvalp = (unsigned long)val;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* proc_dointvec_minmax - read a vector of integers with min/max values
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
*
|
|
* Reads/writes up to table->maxlen/sizeof(unsigned int) integer
|
|
* values from/to the user buffer, treated as an ASCII string.
|
|
*
|
|
* This routine will ensure the values are within the range specified by
|
|
* table->extra1 (min) and table->extra2 (max).
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_dointvec_minmax(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
struct do_proc_dointvec_minmax_conv_param param = {
|
|
.min = (int *) table->extra1,
|
|
.max = (int *) table->extra2,
|
|
};
|
|
return do_proc_dointvec(table, write, buffer, lenp, ppos,
|
|
do_proc_dointvec_minmax_conv, ¶m);
|
|
}
|
|
|
|
static void validate_coredump_safety(void)
|
|
{
|
|
#ifdef CONFIG_COREDUMP
|
|
if (suid_dumpable == SUID_DUMP_ROOT &&
|
|
core_pattern[0] != '/' && core_pattern[0] != '|') {
|
|
printk(KERN_WARNING "Unsafe core_pattern used with "\
|
|
"suid_dumpable=2. Pipe handler or fully qualified "\
|
|
"core dump path required.\n");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
|
if (!error)
|
|
validate_coredump_safety();
|
|
return error;
|
|
}
|
|
|
|
#ifdef CONFIG_COREDUMP
|
|
static int proc_dostring_coredump(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
int error = proc_dostring(table, write, buffer, lenp, ppos);
|
|
if (!error)
|
|
validate_coredump_safety();
|
|
return error;
|
|
}
|
|
#endif
|
|
|
|
static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write,
|
|
void __user *buffer,
|
|
size_t *lenp, loff_t *ppos,
|
|
unsigned long convmul,
|
|
unsigned long convdiv)
|
|
{
|
|
unsigned long *i, *min, *max;
|
|
int vleft, first = 1, err = 0;
|
|
unsigned long page = 0;
|
|
size_t left;
|
|
char *kbuf;
|
|
|
|
if (!data || !table->maxlen || !*lenp || (*ppos && !write)) {
|
|
*lenp = 0;
|
|
return 0;
|
|
}
|
|
|
|
i = (unsigned long *) data;
|
|
min = (unsigned long *) table->extra1;
|
|
max = (unsigned long *) table->extra2;
|
|
vleft = table->maxlen / sizeof(unsigned long);
|
|
left = *lenp;
|
|
|
|
if (write) {
|
|
if (*ppos) {
|
|
switch (sysctl_writes_strict) {
|
|
case SYSCTL_WRITES_STRICT:
|
|
goto out;
|
|
case SYSCTL_WRITES_WARN:
|
|
warn_sysctl_write(table);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (left > PAGE_SIZE - 1)
|
|
left = PAGE_SIZE - 1;
|
|
page = __get_free_page(GFP_TEMPORARY);
|
|
kbuf = (char *) page;
|
|
if (!kbuf)
|
|
return -ENOMEM;
|
|
if (copy_from_user(kbuf, buffer, left)) {
|
|
err = -EFAULT;
|
|
goto free;
|
|
}
|
|
kbuf[left] = 0;
|
|
}
|
|
|
|
for (; left && vleft--; i++, first = 0) {
|
|
unsigned long val;
|
|
|
|
if (write) {
|
|
bool neg;
|
|
|
|
left -= proc_skip_spaces(&kbuf);
|
|
|
|
err = proc_get_long(&kbuf, &left, &val, &neg,
|
|
proc_wspace_sep,
|
|
sizeof(proc_wspace_sep), NULL);
|
|
if (err)
|
|
break;
|
|
if (neg)
|
|
continue;
|
|
val = convmul * val / convdiv;
|
|
if ((min && val < *min) || (max && val > *max))
|
|
continue;
|
|
*i = val;
|
|
} else {
|
|
val = convdiv * (*i) / convmul;
|
|
if (!first) {
|
|
err = proc_put_char(&buffer, &left, '\t');
|
|
if (err)
|
|
break;
|
|
}
|
|
err = proc_put_long(&buffer, &left, val, false);
|
|
if (err)
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!write && !first && left && !err)
|
|
err = proc_put_char(&buffer, &left, '\n');
|
|
if (write && !err)
|
|
left -= proc_skip_spaces(&kbuf);
|
|
free:
|
|
if (write) {
|
|
free_page(page);
|
|
if (first)
|
|
return err ? : -EINVAL;
|
|
}
|
|
*lenp -= left;
|
|
out:
|
|
*ppos += *lenp;
|
|
return err;
|
|
}
|
|
|
|
static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
|
|
void __user *buffer,
|
|
size_t *lenp, loff_t *ppos,
|
|
unsigned long convmul,
|
|
unsigned long convdiv)
|
|
{
|
|
return __do_proc_doulongvec_minmax(table->data, table, write,
|
|
buffer, lenp, ppos, convmul, convdiv);
|
|
}
|
|
|
|
/**
|
|
* proc_doulongvec_minmax - read a vector of long integers with min/max values
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
*
|
|
* Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
|
|
* values from/to the user buffer, treated as an ASCII string.
|
|
*
|
|
* This routine will ensure the values are within the range specified by
|
|
* table->extra1 (min) and table->extra2 (max).
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_doulongvec_minmax(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l);
|
|
}
|
|
|
|
/**
|
|
* proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values with min/max values
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
*
|
|
* Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
|
|
* values from/to the user buffer, treated as an ASCII string. The values
|
|
* are treated as milliseconds, and converted to jiffies when they are stored.
|
|
*
|
|
* This routine will ensure the values are within the range specified by
|
|
* table->extra1 (min) and table->extra2 (max).
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
|
|
void __user *buffer,
|
|
size_t *lenp, loff_t *ppos)
|
|
{
|
|
return do_proc_doulongvec_minmax(table, write, buffer,
|
|
lenp, ppos, HZ, 1000l);
|
|
}
|
|
|
|
|
|
static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *lvalp,
|
|
int *valp,
|
|
int write, void *data)
|
|
{
|
|
if (write) {
|
|
if (*lvalp > LONG_MAX / HZ)
|
|
return 1;
|
|
*valp = *negp ? -(*lvalp*HZ) : (*lvalp*HZ);
|
|
} else {
|
|
int val = *valp;
|
|
unsigned long lval;
|
|
if (val < 0) {
|
|
*negp = true;
|
|
lval = -(unsigned long)val;
|
|
} else {
|
|
*negp = false;
|
|
lval = (unsigned long)val;
|
|
}
|
|
*lvalp = lval / HZ;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *lvalp,
|
|
int *valp,
|
|
int write, void *data)
|
|
{
|
|
if (write) {
|
|
if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ)
|
|
return 1;
|
|
*valp = clock_t_to_jiffies(*negp ? -*lvalp : *lvalp);
|
|
} else {
|
|
int val = *valp;
|
|
unsigned long lval;
|
|
if (val < 0) {
|
|
*negp = true;
|
|
lval = -(unsigned long)val;
|
|
} else {
|
|
*negp = false;
|
|
lval = (unsigned long)val;
|
|
}
|
|
*lvalp = jiffies_to_clock_t(lval);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp,
|
|
int *valp,
|
|
int write, void *data)
|
|
{
|
|
if (write) {
|
|
unsigned long jif = msecs_to_jiffies(*negp ? -*lvalp : *lvalp);
|
|
|
|
if (jif > INT_MAX)
|
|
return 1;
|
|
*valp = (int)jif;
|
|
} else {
|
|
int val = *valp;
|
|
unsigned long lval;
|
|
if (val < 0) {
|
|
*negp = true;
|
|
lval = -(unsigned long)val;
|
|
} else {
|
|
*negp = false;
|
|
lval = (unsigned long)val;
|
|
}
|
|
*lvalp = jiffies_to_msecs(lval);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* proc_dointvec_jiffies - read a vector of integers as seconds
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
*
|
|
* Reads/writes up to table->maxlen/sizeof(unsigned int) integer
|
|
* values from/to the user buffer, treated as an ASCII string.
|
|
* The values read are assumed to be in seconds, and are converted into
|
|
* jiffies.
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_dointvec_jiffies(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return do_proc_dointvec(table,write,buffer,lenp,ppos,
|
|
do_proc_dointvec_jiffies_conv,NULL);
|
|
}
|
|
|
|
/**
|
|
* proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ seconds
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: pointer to the file position
|
|
*
|
|
* Reads/writes up to table->maxlen/sizeof(unsigned int) integer
|
|
* values from/to the user buffer, treated as an ASCII string.
|
|
* The values read are assumed to be in 1/USER_HZ seconds, and
|
|
* are converted into jiffies.
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return do_proc_dointvec(table,write,buffer,lenp,ppos,
|
|
do_proc_dointvec_userhz_jiffies_conv,NULL);
|
|
}
|
|
|
|
/**
|
|
* proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
* @ppos: the current position in the file
|
|
*
|
|
* Reads/writes up to table->maxlen/sizeof(unsigned int) integer
|
|
* values from/to the user buffer, treated as an ASCII string.
|
|
* The values read are assumed to be in 1/1000 seconds, and
|
|
* are converted into jiffies.
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return do_proc_dointvec(table, write, buffer, lenp, ppos,
|
|
do_proc_dointvec_ms_jiffies_conv, NULL);
|
|
}
|
|
|
|
static int proc_do_cad_pid(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
struct pid *new_pid;
|
|
pid_t tmp;
|
|
int r;
|
|
|
|
tmp = pid_vnr(cad_pid);
|
|
|
|
r = __do_proc_dointvec(&tmp, table, write, buffer,
|
|
lenp, ppos, NULL, NULL);
|
|
if (r || !write)
|
|
return r;
|
|
|
|
new_pid = find_get_pid(tmp);
|
|
if (!new_pid)
|
|
return -ESRCH;
|
|
|
|
put_pid(xchg(&cad_pid, new_pid));
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* proc_do_large_bitmap - read/write from/to a large bitmap
|
|
* @table: the sysctl table
|
|
* @write: %TRUE if this is a write to the sysctl file
|
|
* @buffer: the user buffer
|
|
* @lenp: the size of the user buffer
|
|
* @ppos: file position
|
|
*
|
|
* The bitmap is stored at table->data and the bitmap length (in bits)
|
|
* in table->maxlen.
|
|
*
|
|
* We use a range comma separated format (e.g. 1,3-4,10-10) so that
|
|
* large bitmaps may be represented in a compact manner. Writing into
|
|
* the file will clear the bitmap then update it with the given input.
|
|
*
|
|
* Returns 0 on success.
|
|
*/
|
|
int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
int err = 0;
|
|
bool first = 1;
|
|
size_t left = *lenp;
|
|
unsigned long bitmap_len = table->maxlen;
|
|
unsigned long *bitmap = *(unsigned long **) table->data;
|
|
unsigned long *tmp_bitmap = NULL;
|
|
char tr_a[] = { '-', ',', '\n' }, tr_b[] = { ',', '\n', 0 }, c;
|
|
|
|
if (!bitmap || !bitmap_len || !left || (*ppos && !write)) {
|
|
*lenp = 0;
|
|
return 0;
|
|
}
|
|
|
|
if (write) {
|
|
unsigned long page = 0;
|
|
char *kbuf;
|
|
|
|
if (left > PAGE_SIZE - 1)
|
|
left = PAGE_SIZE - 1;
|
|
|
|
page = __get_free_page(GFP_TEMPORARY);
|
|
kbuf = (char *) page;
|
|
if (!kbuf)
|
|
return -ENOMEM;
|
|
if (copy_from_user(kbuf, buffer, left)) {
|
|
free_page(page);
|
|
return -EFAULT;
|
|
}
|
|
kbuf[left] = 0;
|
|
|
|
tmp_bitmap = kzalloc(BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long),
|
|
GFP_KERNEL);
|
|
if (!tmp_bitmap) {
|
|
free_page(page);
|
|
return -ENOMEM;
|
|
}
|
|
proc_skip_char(&kbuf, &left, '\n');
|
|
while (!err && left) {
|
|
unsigned long val_a, val_b;
|
|
bool neg;
|
|
|
|
err = proc_get_long(&kbuf, &left, &val_a, &neg, tr_a,
|
|
sizeof(tr_a), &c);
|
|
if (err)
|
|
break;
|
|
if (val_a >= bitmap_len || neg) {
|
|
err = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
val_b = val_a;
|
|
if (left) {
|
|
kbuf++;
|
|
left--;
|
|
}
|
|
|
|
if (c == '-') {
|
|
err = proc_get_long(&kbuf, &left, &val_b,
|
|
&neg, tr_b, sizeof(tr_b),
|
|
&c);
|
|
if (err)
|
|
break;
|
|
if (val_b >= bitmap_len || neg ||
|
|
val_a > val_b) {
|
|
err = -EINVAL;
|
|
break;
|
|
}
|
|
if (left) {
|
|
kbuf++;
|
|
left--;
|
|
}
|
|
}
|
|
|
|
bitmap_set(tmp_bitmap, val_a, val_b - val_a + 1);
|
|
first = 0;
|
|
proc_skip_char(&kbuf, &left, '\n');
|
|
}
|
|
free_page(page);
|
|
} else {
|
|
unsigned long bit_a, bit_b = 0;
|
|
|
|
while (left) {
|
|
bit_a = find_next_bit(bitmap, bitmap_len, bit_b);
|
|
if (bit_a >= bitmap_len)
|
|
break;
|
|
bit_b = find_next_zero_bit(bitmap, bitmap_len,
|
|
bit_a + 1) - 1;
|
|
|
|
if (!first) {
|
|
err = proc_put_char(&buffer, &left, ',');
|
|
if (err)
|
|
break;
|
|
}
|
|
err = proc_put_long(&buffer, &left, bit_a, false);
|
|
if (err)
|
|
break;
|
|
if (bit_a != bit_b) {
|
|
err = proc_put_char(&buffer, &left, '-');
|
|
if (err)
|
|
break;
|
|
err = proc_put_long(&buffer, &left, bit_b, false);
|
|
if (err)
|
|
break;
|
|
}
|
|
|
|
first = 0; bit_b++;
|
|
}
|
|
if (!err)
|
|
err = proc_put_char(&buffer, &left, '\n');
|
|
}
|
|
|
|
if (!err) {
|
|
if (write) {
|
|
if (*ppos)
|
|
bitmap_or(bitmap, bitmap, tmp_bitmap, bitmap_len);
|
|
else
|
|
bitmap_copy(bitmap, tmp_bitmap, bitmap_len);
|
|
}
|
|
kfree(tmp_bitmap);
|
|
*lenp -= left;
|
|
*ppos += *lenp;
|
|
return 0;
|
|
} else {
|
|
kfree(tmp_bitmap);
|
|
return err;
|
|
}
|
|
}
|
|
|
|
#else /* CONFIG_PROC_SYSCTL */
|
|
|
|
int proc_dostring(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int proc_dointvec(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int proc_douintvec(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int proc_dointvec_minmax(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int proc_dointvec_jiffies(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int proc_doulongvec_minmax(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
|
|
void __user *buffer,
|
|
size_t *lenp, loff_t *ppos)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
|
|
#endif /* CONFIG_PROC_SYSCTL */
|
|
|
|
/*
|
|
* No sense putting this after each symbol definition, twice,
|
|
* exception granted :-)
|
|
*/
|
|
EXPORT_SYMBOL(proc_dointvec);
|
|
EXPORT_SYMBOL(proc_douintvec);
|
|
EXPORT_SYMBOL(proc_dointvec_jiffies);
|
|
EXPORT_SYMBOL(proc_dointvec_minmax);
|
|
EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
|
|
EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
|
|
EXPORT_SYMBOL(proc_dostring);
|
|
EXPORT_SYMBOL(proc_doulongvec_minmax);
|
|
EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax);
|