Files
kernel_xiaomi_sm8250/kernel/module.c
Ivaylo Georgiev d46ff52af6 Merge android-4.19.110 (1984fff) into msm-4.19
* refs/heads/tmp-1984fff:
  Revert "ANDROID: staging: android: ion: enable modularizing the ion driver"
  Revert "BACKPORT: sched/rt: Make RT capacity-aware"
  Revert "ANDROID: GKI: Add devm_thermal_of_virtual_sensor_register API."
  Linux 4.19.110
  KVM: SVM: fix up incorrect backport
  ANDROID: gki_defconfig: Enable USB_CONFIGFS_MASS_STORAGE
  UPSTREAM: arm64: memory: Add missing brackets to untagged_addr() macro
  UPSTREAM: mm: Avoid creating virtual address aliases in brk()/mmap()/mremap()
  ANDROID: Add TPM support and the vTPM proxy to Cuttlefish.
  Revert "ANDROID: tty: serdev: Fix broken serial console input"
  ANDROID: serdev: restrict claim of platform devices
  ANDROID: update the ABI xml representation
  ANDROID: GKI: add a USB TypeC vendor field for ABI compat
  UPSTREAM: usb: typec: mux: Switch to use fwnode_property_count_uXX()
  UPSTREAM: usb: typec: Make sure an alt mode exist before getting its partner
  UPSTREAM: usb: typec: Registering real device entries for the muxes
  UPSTREAM: usb: typec: mux: remove redundant check on variable match
  UPSTREAM: usb: typec: mux: Fix unsigned comparison with less than zero
  UPSTREAM: usb: typec: mux: Find the muxes by also matching against the device node
  UPSTREAM: usb: typec: Find the ports by also matching against the device node
  UPSTREAM: usb: typec: Rationalize the API for the muxes
  UPSTREAM: device property: Add helpers to count items in an array
  UPSTREAM: platform/x86: intel_cht_int33fe: Remove old style mux connections
  UPSTREAM: platform/x86: intel_cht_int33fe: Prepare for better mux naming scheme
  UPSTREAM: usb: typec: Prepare alt mode enter/exit reporting for UCSI alt mode support
  ANDROID: GKI: Update ABI
  ANDROID: GKI: drivers: of: Add API to find ddr device type
  UPSTREAM: Input: reset device timestamp on sync
  UPSTREAM: Input: allow drivers specify timestamp for input events
  ANDROID: GKI: usb: dwc3: Add USB_DR_MODE_DRD as dual role mode
  ANDROID: GKI: Add devm_thermal_of_virtual_sensor_register API.
  UPSTREAM: crypto: skcipher - Introduce crypto_sync_skcipher
  ANDROID: GKI: cfg80211: Add AP stopped interface
  UPSTREAM: device connection: Add fwnode member to struct device_connection
  FROMGIT: kallsyms: unexport kallsyms_lookup_name() and kallsyms_on_each_symbol()
  FROMGIT: samples/hw_breakpoint: drop use of kallsyms_lookup_name()
  FROMGIT: samples/hw_breakpoint: drop HW_BREAKPOINT_R when reporting writes
  UPSTREAM: fscrypt: don't evict dirty inodes after removing key
  ANDROID: gki_defconfig: Enable CONFIG_VM_EVENT_COUNTERS
  ANDROID: gki_defconfig: Enable CONFIG_CLEANCACHE
  ANDROID: Update ABI representation
  ANDROID: gki_defconfig: disable CONFIG_DEBUG_DEVRES
  Linux 4.19.109
  scsi: pm80xx: Fixed kernel panic during error recovery for SATA drive
  dm integrity: fix a deadlock due to offloading to an incorrect workqueue
  efi/x86: Handle by-ref arguments covering multiple pages in mixed mode
  efi/x86: Align GUIDs to their size in the mixed mode runtime wrapper
  powerpc: fix hardware PMU exception bug on PowerVM compatibility mode systems
  dmaengine: coh901318: Fix a double lock bug in dma_tc_handle()
  hwmon: (adt7462) Fix an error return in ADT7462_REG_VOLT()
  ARM: dts: imx7-colibri: Fix frequency for sd/mmc
  ARM: dts: am437x-idk-evm: Fix incorrect OPP node names
  ARM: imx: build v7_cpu_resume() unconditionally
  IB/hfi1, qib: Ensure RCU is locked when accessing list
  RMDA/cm: Fix missing ib_cm_destroy_id() in ib_cm_insert_listen()
  RDMA/iwcm: Fix iwcm work deallocation
  ARM: dts: imx6: phycore-som: fix emmc supply
  phy: mapphone-mdm6600: Fix write timeouts with shorter GPIO toggle interval
  phy: mapphone-mdm6600: Fix timeouts by adding wake-up handling
  drm/sun4i: de2/de3: Remove unsupported VI layer formats
  drm/sun4i: Fix DE2 VI layer format support
  ASoC: dapm: Correct DAPM handling of active widgets during shutdown
  ASoC: pcm512x: Fix unbalanced regulator enable call in probe error path
  ASoC: pcm: Fix possible buffer overflow in dpcm state sysfs output
  dmaengine: imx-sdma: remove dma_slave_config direction usage and leave sdma_event_enable()
  ASoC: intel: skl: Fix possible buffer overflow in debug outputs
  ASoC: intel: skl: Fix pin debug prints
  ASoC: topology: Fix memleak in soc_tplg_manifest_load()
  ASoC: topology: Fix memleak in soc_tplg_link_elems_load()
  spi: bcm63xx-hsspi: Really keep pll clk enabled
  ARM: dts: ls1021a: Restore MDIO compatible to gianfar
  dm writecache: verify watermark during resume
  dm: report suspended device during destroy
  dm cache: fix a crash due to incorrect work item cancelling
  dmaengine: tegra-apb: Prevent race conditions of tasklet vs free list
  dmaengine: tegra-apb: Fix use-after-free
  x86/pkeys: Manually set X86_FEATURE_OSPKE to preserve existing changes
  media: v4l2-mem2mem.c: fix broken links
  vt: selection, push sel_lock up
  vt: selection, push console lock down
  vt: selection, close sel_buffer race
  serial: 8250_exar: add support for ACCES cards
  tty:serial:mvebu-uart:fix a wrong return
  arm: dts: dra76x: Fix mmc3 max-frequency
  fat: fix uninit-memory access for partial initialized inode
  mm: fix possible PMD dirty bit lost in set_pmd_migration_entry()
  mm, numa: fix bad pmd by atomically check for pmd_trans_huge when marking page tables prot_numa
  vgacon: Fix a UAF in vgacon_invert_region
  usb: core: port: do error out if usb_autopm_get_interface() fails
  usb: core: hub: do error out if usb_autopm_get_interface() fails
  usb: core: hub: fix unhandled return by employing a void function
  usb: dwc3: gadget: Update chain bit correctly when using sg list
  usb: quirks: add NO_LPM quirk for Logitech Screen Share
  usb: storage: Add quirk for Samsung Fit flash
  cifs: don't leak -EAGAIN for stat() during reconnect
  ALSA: hda/realtek - Fix silent output on Gigabyte X570 Aorus Master
  ALSA: hda/realtek - Add Headset Mic supported
  net: thunderx: workaround BGX TX Underflow issue
  x86/xen: Distribute switch variables for initialization
  ice: Don't tell the OS that link is going down
  nvme: Fix uninitialized-variable warning
  s390/qdio: fill SL with absolute addresses
  x86/boot/compressed: Don't declare __force_order in kaslr_64.c
  s390: make 'install' not depend on vmlinux
  s390/cio: cio_ignore_proc_seq_next should increase position index
  watchdog: da9062: do not ping the hw during stop()
  net: ks8851-ml: Fix 16-bit IO operation
  net: ks8851-ml: Fix 16-bit data access
  net: ks8851-ml: Remove 8-bit bus accessors
  net: dsa: b53: Ensure the default VID is untagged
  selftests: forwarding: use proto icmp for {gretap, ip6gretap}_mac testing
  drm/msm/dsi/pll: call vco set rate explicitly
  drm/msm/dsi: save pll state before dsi host is powered off
  scsi: megaraid_sas: silence a warning
  drm: msm: Fix return type of dsi_mgr_connector_mode_valid for kCFI
  drm/msm/mdp5: rate limit pp done timeout warnings
  usb: gadget: serial: fix Tx stall after buffer overflow
  usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags
  usb: gadget: composite: Support more than 500mA MaxPower
  selftests: fix too long argument
  serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE
  ALSA: hda: do not override bus codec_mask in link_get()
  kprobes: Fix optimize_kprobe()/unoptimize_kprobe() cancellation logic
  RDMA/core: Fix use of logical OR in get_new_pps
  RDMA/core: Fix pkey and port assignment in get_new_pps
  net: dsa: bcm_sf2: Forcibly configure IMP port for 1Gb/sec
  ALSA: hda/realtek - Fix a regression for mute led on Lenovo Carbon X1
  EDAC/amd64: Set grain per DIMM
  ANDROID: Fix kernelci build-break for arm32
  ANDROID: enable CONFIG_WATCHDOG_CORE=y
  ANDROID: kbuild: align UNUSED_KSYMS_WHITELIST with upstream
  FROMLIST: f2fs: fix wrong check on F2FS_IOC_FSSETXATTR
  FROMGIT: driver core: Reevaluate dev->links.need_for_probe as suppliers are added
  FROMGIT: driver core: Call sync_state() even if supplier has no consumers
  FROMGIT: of: property: Add device link support for power-domains and hwlocks
  UPSTREAM: binder: prevent UAF for binderfs devices II
  UPSTREAM: binder: prevent UAF for binderfs devices
  ANDROID: GKI: enable PM_GENERIC_DOMAINS by default
  ANDROID: GKI: pci: framework: disable auto suspend link
  ANDROID: GKI: gpio: Add support for hierarchical IRQ domains
  ANDROID: GKI: of: property: Add device links support for pinctrl-[0-3]
  ANDROID: GKI: of: property: Ignore properties that start with "qcom,"
  ANDROID: GKI: of: property: Add support for parsing qcom,msm-bus,name property
  ANDROID: GKI: genirq: Export symbols to compile irqchip drivers as modules
  ANDROID: GKI: of: irq: add helper to remap interrupts to another irqdomain
  ANDROID: GKI: genirq/irqdomain: add export symbols for modularizing
  ANDROID: GKI: genirq: Introduce irq_chip_get/set_parent_state calls
  ANDROID: Update ABI representation
  ANDROID: arm64: gki_defconfig: disable CONFIG_ZONE_DMA32
  ANDROID: GKI: drivers: thermal: Fix ABI diff for struct thermal_cooling_device
  ANDROID: GKI: drivers: thermal: Indicate in DT the trips are for temperature falling
  ANDROID: Update ABI representation
  ANDROID: Update ABI whitelist for qcom SoCs
  ANDROID: gki_defconfig: enable CONFIG_TYPEC
  ANDROID: Fix kernelci build-break on !CONFIG_CMA builds
  ANDROID: GKI: mm: fix cma accounting in zone_watermark_ok
  ANDROID: CC_FLAGS_CFI add -fno-sanitize-blacklist
  FROMLIST: lib: test_stackinit.c: XFAIL switch variable init tests
  Linux 4.19.108
  audit: always check the netlink payload length in audit_receive_msg()
  mm, thp: fix defrag setting if newline is not used
  mm/huge_memory.c: use head to check huge zero page
  netfilter: nf_flowtable: fix documentation
  netfilter: nft_tunnel: no need to call htons() when dumping ports
  thermal: brcmstb_thermal: Do not use DT coefficients
  KVM: x86: Remove spurious clearing of async #PF MSR
  KVM: x86: Remove spurious kvm_mmu_unload() from vcpu destruction path
  perf hists browser: Restore ESC as "Zoom out" of DSO/thread/etc
  pwm: omap-dmtimer: put_device() after of_find_device_by_node()
  kprobes: Set unoptimized flag after unoptimizing code
  drivers: net: xgene: Fix the order of the arguments of 'alloc_etherdev_mqs()'
  perf stat: Fix shadow stats for clock events
  perf stat: Use perf_evsel__is_clocki() for clock events
  sched/fair: Fix O(nr_cgroups) in the load balancing path
  sched/fair: Optimize update_blocked_averages()
  KVM: Check for a bad hva before dropping into the ghc slow path
  KVM: SVM: Override default MMIO mask if memory encryption is enabled
  mwifiex: delete unused mwifiex_get_intf_num()
  mwifiex: drop most magic numbers from mwifiex_process_tdls_action_frame()
  namei: only return -ECHILD from follow_dotdot_rcu()
  net: ena: make ena rxfh support ETH_RSS_HASH_NO_CHANGE
  net/smc: no peer ID in CLC decline for SMCD
  net: atlantic: fix potential error handling
  net: atlantic: fix use after free kasan warn
  net: netlink: cap max groups which will be considered in netlink_bind()
  s390/qeth: vnicc Fix EOPNOTSUPP precedence
  usb: charger: assign specific number for enum value
  hv_netvsc: Fix unwanted wakeup in netvsc_attach()
  drm/i915/gvt: Separate display reset from ALL_ENGINES reset
  drm/i915/gvt: Fix orphan vgpu dmabuf_objs' lifetime
  i2c: jz4780: silence log flood on txabrt
  i2c: altera: Fix potential integer overflow
  MIPS: VPE: Fix a double free and a memory leak in 'release_vpe()'
  HID: hiddev: Fix race in in hiddev_disconnect()
  HID: alps: Fix an error handling path in 'alps_input_configured()'
  vhost: Check docket sk_family instead of call getname
  amdgpu/gmc_v9: save/restore sdpif regs during S3
  Revert "PM / devfreq: Modify the device name as devfreq(X) for sysfs"
  tracing: Disable trace_printk() on post poned tests
  macintosh: therm_windtunnel: fix regression when instantiating devices
  HID: core: increase HID report buffer size to 8KiB
  HID: core: fix off-by-one memset in hid_report_raw_event()
  HID: ite: Only bind to keyboard USB interface on Acer SW5-012 keyboard dock
  KVM: VMX: check descriptor table exits on instruction emulation
  ACPI: watchdog: Fix gas->access_width usage
  ACPICA: Introduce ACPI_ACCESS_BYTE_WIDTH() macro
  audit: fix error handling in audit_data_to_entry()
  ext4: potential crash on allocation error in ext4_alloc_flex_bg_array()
  net/tls: Fix to avoid gettig invalid tls record
  qede: Fix race between rdma destroy workqueue and link change event
  ipv6: Fix nlmsg_flags when splitting a multipath route
  ipv6: Fix route replacement with dev-only route
  sctp: move the format error check out of __sctp_sf_do_9_1_abort
  nfc: pn544: Fix occasional HW initialization failure
  net: sched: correct flower port blocking
  net: phy: restore mdio regs in the iproc mdio driver
  net: mscc: fix in frame extraction
  net: fib_rules: Correctly set table field when table number exceeds 8 bits
  sysrq: Remove duplicated sysrq message
  sysrq: Restore original console_loglevel when sysrq disabled
  cfg80211: add missing policy for NL80211_ATTR_STATUS_CODE
  cifs: Fix mode output in debugging statements
  net: ena: ena-com.c: prevent NULL pointer dereference
  net: ena: ethtool: use correct value for crc32 hash
  net: ena: fix incorrectly saving queue numbers when setting RSS indirection table
  net: ena: rss: store hash function as values and not bits
  net: ena: rss: fix failure to get indirection table
  net: ena: fix incorrect default RSS key
  net: ena: add missing ethtool TX timestamping indication
  net: ena: fix uses of round_jiffies()
  net: ena: fix potential crash when rxfh key is NULL
  soc/tegra: fuse: Fix build with Tegra194 configuration
  ARM: dts: sti: fixup sound frame-inversion for stihxxx-b2120.dtsi
  qmi_wwan: unconditionally reject 2 ep interfaces
  qmi_wwan: re-add DW5821e pre-production variant
  s390/zcrypt: fix card and queue total counter wrap
  cfg80211: check wiphy driver existence for drvinfo report
  mac80211: consider more elements in parsing CRC
  dax: pass NOWAIT flag to iomap_apply
  drm/msm: Set dma maximum segment size for mdss
  ipmi:ssif: Handle a possible NULL pointer reference
  iwlwifi: pcie: fix rb_allocator workqueue allocation
  irqchip/gic-v3-its: Fix misuse of GENMASK macro
  ANDROID: Update ABI representation
  ANDROID: abi_gki_aarch64_whitelist: add module_layout and task_struct
  ANDROID: gki_defconfig: disable KPROBES, update ABI
  ANDROID: GKI: mm: add cma pcp list
  ANDROID: GKI: cma: redirect page allocation to CMA
  BACKPORT: mm, compaction: be selective about what pageblocks to clear skip hints
  BACKPORT: mm: reclaim small amounts of memory when an external fragmentation event occurs
  BACKPORT: mm: move zone watermark accesses behind an accessor
  UPSTREAM: mm: use alloc_flags to record if kswapd can wake
  UPSTREAM: mm, page_alloc: spread allocations across zones before introducing fragmentation
  ANDROID: GKI: update abi for ufshcd changes
  ANDROID: Unconditionally create bridge tracepoints
  ANDROID: gki_defconfig: Enable MFD_SYSCON on x86
  ANDROID: scsi: ufs: allow ufs variants to override sg entry size
  ANDROID: Re-add default y for VIRTIO_PCI_LEGACY
  ANDROID: GKI: build in HVC_DRIVER
  ANDROID: Removed default m for virtual sw crypto device
  ANDROID: Remove default y on BRIDGE_IGMP_SNOOPING
  ANDROID: GKI: Added missing SND configs
  FROMLIST: ufs: fix a bug on printing PRDT
  UPSTREAM: sched/uclamp: Reject negative values in cpu_uclamp_write()
  ANDROID: gki_defconfig: Disable CONFIG_RT_GROUP_SCHED
  ANDROID: GKI: Remove CONFIG_BRIDGE from arm64 config
  ANDROID: Add ABI Whitelist for qcom
  ANDROID: Enable HID_NINTENDO as y
  FROMLIST: HID: nintendo: add nintendo switch controller driver
  UPSTREAM: regulator/of_get_regulator: add child path to find the regulator supplier
  ANDROID: gki_defconfig: Remove 'BRIDGE_NETFILTER is not set'
  BACKPORT: net: disable BRIDGE_NETFILTER by default
  ANDROID: kbuild: fix UNUSED_KSYMS_WHITELIST backport
  Linux 4.19.107
  Revert "char/random: silence a lockdep splat with printk()"
  s390/mm: Explicitly compare PAGE_DEFAULT_KEY against zero in storage_key_init_range
  xen: Enable interrupts when calling _cond_resched()
  ata: ahci: Add shutdown to freeze hardware resources of ahci
  rxrpc: Fix call RCU cleanup using non-bh-safe locks
  netfilter: xt_hashlimit: limit the max size of hashtable
  ALSA: seq: Fix concurrent access to queue current tick/time
  ALSA: seq: Avoid concurrent access to queue flags
  ALSA: rawmidi: Avoid bit fields for state flags
  bpf, offload: Replace bitwise AND by logical AND in bpf_prog_offload_info_fill
  genirq/proc: Reject invalid affinity masks (again)
  iommu/vt-d: Fix compile warning from intel-svm.h
  ecryptfs: replace BUG_ON with error handling code
  staging: greybus: use after free in gb_audio_manager_remove_all()
  staging: rtl8723bs: fix copy of overlapping memory
  usb: dwc2: Fix in ISOC request length checking
  usb: gadget: composite: Fix bMaxPower for SuperSpeedPlus
  scsi: Revert "target: iscsi: Wait for all commands to finish before freeing a session"
  scsi: Revert "RDMA/isert: Fix a recently introduced regression related to logout"
  Revert "dmaengine: imx-sdma: Fix memory leak"
  Btrfs: fix btrfs_wait_ordered_range() so that it waits for all ordered extents
  btrfs: do not check delayed items are empty for single transaction cleanup
  btrfs: reset fs_root to NULL on error in open_ctree
  btrfs: fix bytes_may_use underflow in prealloc error condtition
  KVM: apic: avoid calculating pending eoi from an uninitialized val
  KVM: nVMX: handle nested posted interrupts when apicv is disabled for L1
  KVM: nVMX: Check IO instruction VM-exit conditions
  KVM: nVMX: Refactor IO bitmap checks into helper function
  ext4: fix race between writepages and enabling EXT4_EXTENTS_FL
  ext4: rename s_journal_flag_rwsem to s_writepages_rwsem
  ext4: fix mount failure with quota configured as module
  ext4: fix potential race between s_flex_groups online resizing and access
  ext4: fix potential race between s_group_info online resizing and access
  ext4: fix potential race between online resizing and write operations
  ext4: add cond_resched() to __ext4_find_entry()
  ext4: fix a data race in EXT4_I(inode)->i_disksize
  drm/nouveau/kms/gv100-: Re-set LUT after clearing for modesets
  lib/stackdepot.c: fix global out-of-bounds in stack_slabs
  tty: serial: qcom_geni_serial: Fix RX cancel command failure
  tty: serial: qcom_geni_serial: Remove xfer_mode variable
  tty: serial: qcom_geni_serial: Remove set_rfr_wm() and related variables
  tty: serial: qcom_geni_serial: Remove use of *_relaxed() and mb()
  tty: serial: qcom_geni_serial: Remove interrupt storm
  tty: serial: qcom_geni_serial: Fix UART hang
  KVM: x86: don't notify userspace IOAPIC on edge-triggered interrupt EOI
  KVM: nVMX: Don't emulate instructions in guest mode
  xhci: apply XHCI_PME_STUCK_QUIRK to Intel Comet Lake platforms
  drm/amdgpu/soc15: fix xclk for raven
  mm/vmscan.c: don't round up scan size for online memory cgroup
  genirq/irqdomain: Make sure all irq domain flags are distinct
  nvme-multipath: Fix memory leak with ana_log_buf
  mm/memcontrol.c: lost css_put in memcg_expand_shrinker_maps()
  Revert "ipc,sem: remove uneeded sem_undo_list lock usage in exit_sem()"
  MAINTAINERS: Update drm/i915 bug filing URL
  serdev: ttyport: restore client ops on deregistration
  tty: serial: imx: setup the correct sg entry for tx dma
  tty/serial: atmel: manage shutdown in case of RS485 or ISO7816 mode
  serial: 8250: Check UPF_IRQ_SHARED in advance
  x86/cpu/amd: Enable the fixed Instructions Retired counter IRPERF
  x86/mce/amd: Fix kobject lifetime
  x86/mce/amd: Publish the bank pointer only after setup has succeeded
  jbd2: fix ocfs2 corrupt when clearing block group bits
  powerpc/tm: Fix clearing MSR[TS] in current when reclaiming on signal delivery
  staging: rtl8723bs: Fix potential overuse of kernel memory
  staging: rtl8723bs: Fix potential security hole
  staging: rtl8188eu: Fix potential overuse of kernel memory
  staging: rtl8188eu: Fix potential security hole
  usb: dwc3: gadget: Check for IOC/LST bit in TRB->ctrl fields
  usb: dwc2: Fix SET/CLEAR_FEATURE and GET_STATUS flows
  USB: hub: Fix the broken detection of USB3 device in SMSC hub
  USB: hub: Don't record a connect-change event during reset-resume
  USB: Fix novation SourceControl XL after suspend
  usb: uas: fix a plug & unplug racing
  USB: quirks: blacklist duplicate ep on Sound Devices USBPre2
  USB: core: add endpoint-blacklist quirk
  usb: host: xhci: update event ring dequeue pointer on purpose
  xhci: Fix memory leak when caching protocol extended capability PSI tables - take 2
  xhci: fix runtime pm enabling for quirky Intel hosts
  xhci: Force Maximum Packet size for Full-speed bulk devices to valid range.
  staging: vt6656: fix sign of rx_dbm to bb_pre_ed_rssi.
  staging: android: ashmem: Disallow ashmem memory from being remapped
  vt: vt_ioctl: fix race in VT_RESIZEX
  vt: selection, handle pending signals in paste_selection
  vt: fix scrollback flushing on background consoles
  floppy: check FDC index for errors before assigning it
  USB: misc: iowarrior: add support for the 100 device
  USB: misc: iowarrior: add support for the 28 and 28L devices
  USB: misc: iowarrior: add support for 2 OEMed devices
  thunderbolt: Prevent crash if non-active NVMem file is read
  ecryptfs: fix a memory leak bug in ecryptfs_init_messaging()
  ecryptfs: fix a memory leak bug in parse_tag_1_packet()
  ASoC: sun8i-codec: Fix setting DAI data format
  ALSA: hda/realtek - Apply quirk for yet another MSI laptop
  ALSA: hda/realtek - Apply quirk for MSI GP63, too
  ALSA: hda: Use scnprintf() for printing texts for sysfs/procfs
  iommu/qcom: Fix bogus detach logic
  UPSTREAM: sched/psi: Fix OOB write when writing 0 bytes to PSI files
  UPSTREAM: psi: Fix a division error in psi poll()
  UPSTREAM: sched/psi: Fix sampling error and rare div0 crashes with cgroups and high uptime
  UPSTREAM: sched/psi: Correct overly pessimistic size calculation
  ANDROID: build.config.gki.aarch64: enable symbol trimming
  FROMLIST: f2fs: Handle casefolding with Encryption
  FROMLIST: fscrypt: Have filesystems handle their d_ops
  FROMLIST: ext4: Use generic casefolding support
  FROMLIST: f2fs: Use generic casefolding support
  FROMLIST: Add standard casefolding support
  FROMLIST: unicode: Add utf8_casefold_hash
  ANDROID: sdcardfs: fix -ENOENT lookup race issue
  ANDROID: gki_defconfig: Enable CONFIG_RD_LZ4
  ANDROID: gki: Enable BINFMT_MISC as part of GKI
  ANDROID: gki_defconfig: disable CONFIG_CRYPTO_MD4
  ANDROID: dm: Add wrapped key support in dm-default-key
  ANDROID: dm: add support for passing through derive_raw_secret
  ANDROID: block: Prevent crypto fallback for wrapped keys
  BACKPORT: FROMLIST: kbuild: generate autoksyms.h early
  BACKPORT: FROMLIST: kbuild: split adjust_autoksyms.sh in two parts
  BACKPORT: FROMLIST: kbuild: allow symbol whitelisting with TRIM_UNUSED_KSYMS
  ANDROID: kbuild: use modules.order in adjust_autoksyms.sh
  UPSTREAM: kbuild: source include/config/auto.conf instead of ${KCONFIG_CONFIG}
  ANDROID: Disable wq fp check in CFI builds
  ANDROID: increase limit on sched-tune boost groups
  BACKPORT: nvmem: core: fix regression in of_nvmem_cell_get()
  BACKPORT: nvmem: hide unused nvmem_find_cell_by_index function
  BACKPORT: nvmem: resolve cells from DT at registration time
  Linux 4.19.106
  drm/amdgpu/display: handle multiple numbers of fclks in dcn_calcs.c (v2)
  mlxsw: spectrum_dpipe: Add missing error path
  virtio_balloon: prevent pfn array overflow
  cifs: log warning message (once) if out of disk space
  help_next should increase position index
  NFS: Fix memory leaks
  drm/amdgpu/smu10: fix smu10_get_clock_by_type_with_voltage
  drm/amdgpu/smu10: fix smu10_get_clock_by_type_with_latency
  brd: check and limit max_part par
  microblaze: Prevent the overflow of the start
  iwlwifi: mvm: Fix thermal zone registration
  irqchip/gic-v3-its: Reference to its_invall_cmd descriptor when building INVALL
  bcache: explicity type cast in bset_bkey_last()
  reiserfs: prevent NULL pointer dereference in reiserfs_insert_item()
  lib/scatterlist.c: adjust indentation in __sg_alloc_table
  ocfs2: fix a NULL pointer dereference when call ocfs2_update_inode_fsync_trans()
  radeon: insert 10ms sleep in dce5_crtc_load_lut
  trigger_next should increase position index
  ftrace: fpid_next() should increase position index
  drm/nouveau/disp/nv50-: prevent oops when no channel method map provided
  irqchip/gic-v3: Only provision redistributors that are enabled in ACPI
  rbd: work around -Wuninitialized warning
  ceph: check availability of mds cluster on mount after wait timeout
  bpf: map_seq_next should always increase position index
  cifs: fix NULL dereference in match_prepath
  iwlegacy: ensure loop counter addr does not wrap and cause an infinite loop
  hostap: Adjust indentation in prism2_hostapd_add_sta
  ARM: 8951/1: Fix Kexec compilation issue.
  jbd2: make sure ESHUTDOWN to be recorded in the journal superblock
  jbd2: switch to use jbd2_journal_abort() when failed to submit the commit record
  selftests: bpf: Reset global state between reuseport test runs
  iommu/vt-d: Remove unnecessary WARN_ON_ONCE()
  bcache: cached_dev_free needs to put the sb page
  powerpc/sriov: Remove VF eeh_dev state when disabling SR-IOV
  drm/nouveau/mmu: fix comptag memory leak
  ALSA: hda - Add docking station support for Lenovo Thinkpad T420s
  driver core: platform: fix u32 greater or equal to zero comparison
  s390/ftrace: generate traced function stack frame
  s390: adjust -mpacked-stack support check for clang 10
  x86/decoder: Add TEST opcode to Group3-2
  kbuild: use -S instead of -E for precise cc-option test in Kconfig
  ALSA: hda/hdmi - add retry logic to parse_intel_hdmi()
  irqchip/mbigen: Set driver .suppress_bind_attrs to avoid remove problems
  remoteproc: Initialize rproc_class before use
  module: avoid setting info->name early in case we can fall back to info->mod->name
  btrfs: device stats, log when stats are zeroed
  btrfs: safely advance counter when looking up bio csums
  btrfs: fix possible NULL-pointer dereference in integrity checks
  pwm: Remove set but not set variable 'pwm'
  ide: serverworks: potential overflow in svwks_set_pio_mode()
  cmd64x: potential buffer overflow in cmd64x_program_timings()
  pwm: omap-dmtimer: Remove PWM chip in .remove before making it unfunctional
  x86/mm: Fix NX bit clearing issue in kernel_map_pages_in_pgd
  f2fs: fix memleak of kobject
  watchdog/softlockup: Enforce that timestamp is valid on boot
  drm/amd/display: fixup DML dependencies
  arm64: fix alternatives with LLVM's integrated assembler
  scsi: iscsi: Don't destroy session if there are outstanding connections
  f2fs: free sysfs kobject
  f2fs: set I_LINKABLE early to avoid wrong access by vfs
  iommu/arm-smmu-v3: Use WRITE_ONCE() when changing validity of an STE
  usb: musb: omap2430: Get rid of musb .set_vbus for omap2430 glue
  drm/vmwgfx: prevent memory leak in vmw_cmdbuf_res_add
  drm/nouveau/fault/gv100-: fix memory leak on module unload
  drm/nouveau/drm/ttm: Remove set but not used variable 'mem'
  drm/nouveau: Fix copy-paste error in nouveau_fence_wait_uevent_handler
  drm/nouveau/gr/gk20a,gm200-: add terminators to method lists read from fw
  drm/nouveau/secboot/gm20b: initialize pointer in gm20b_secboot_new()
  vme: bridges: reduce stack usage
  bpf: Return -EBADRQC for invalid map type in __bpf_tx_xdp_map
  driver core: Print device when resources present in really_probe()
  driver core: platform: Prevent resouce overflow from causing infinite loops
  visorbus: fix uninitialized variable access
  tty: synclink_gt: Adjust indentation in several functions
  tty: synclinkmp: Adjust indentation in several functions
  ASoC: atmel: fix build error with CONFIG_SND_ATMEL_SOC_DMA=m
  wan: ixp4xx_hss: fix compile-testing on 64-bit
  x86/nmi: Remove irq_work from the long duration NMI handler
  Input: edt-ft5x06 - work around first register access error
  rcu: Use WRITE_ONCE() for assignments to ->pprev for hlist_nulls
  efi/x86: Don't panic or BUG() on non-critical error conditions
  soc/tegra: fuse: Correct straps' address for older Tegra124 device trees
  IB/hfi1: Add software counter for ctxt0 seq drop
  staging: rtl8188: avoid excessive stack usage
  udf: Fix free space reporting for metadata and virtual partitions
  usbip: Fix unsafe unaligned pointer usage
  ARM: dts: stm32: Add power-supply for DSI panel on stm32f469-disco
  drm: remove the newline for CRC source name.
  mlx5: work around high stack usage with gcc
  ACPI: button: Add DMI quirk for Razer Blade Stealth 13 late 2019 lid switch
  tools lib api fs: Fix gcc9 stringop-truncation compilation error
  ALSA: sh: Fix compile warning wrt const
  clk: uniphier: Add SCSSI clock gate for each channel
  ALSA: sh: Fix unused variable warnings
  clk: sunxi-ng: add mux and pll notifiers for A64 CPU clock
  RDMA/rxe: Fix error type of mmap_offset
  reset: uniphier: Add SCSSI reset control for each channel
  pinctrl: sh-pfc: sh7269: Fix CAN function GPIOs
  PM / devfreq: rk3399_dmc: Add COMPILE_TEST and HAVE_ARM_SMCCC dependency
  x86/vdso: Provide missing include file
  crypto: chtls - Fixed memory leak
  dmaengine: imx-sdma: Fix memory leak
  dmaengine: Store module owner in dma_device struct
  selinux: ensure we cleanup the internal AVC counters on error in avc_update()
  ARM: dts: r8a7779: Add device node for ARM global timer
  drm/mediatek: handle events when enabling/disabling crtc
  scsi: aic7xxx: Adjust indentation in ahc_find_syncrate
  scsi: ufs: Complete pending requests in host reset and restore path
  ACPICA: Disassembler: create buffer fields in ACPI_PARSE_LOAD_PASS1
  orinoco: avoid assertion in case of NULL pointer
  rtlwifi: rtl_pci: Fix -Wcast-function-type
  iwlegacy: Fix -Wcast-function-type
  ipw2x00: Fix -Wcast-function-type
  b43legacy: Fix -Wcast-function-type
  ALSA: usx2y: Adjust indentation in snd_usX2Y_hwdep_dsp_status
  netfilter: nft_tunnel: add the missing ERSPAN_VERSION nla_policy
  fore200e: Fix incorrect checks of NULL pointer dereference
  r8169: check that Realtek PHY driver module is loaded
  reiserfs: Fix spurious unlock in reiserfs_fill_super() error handling
  media: v4l2-device.h: Explicitly compare grp{id,mask} to zero in v4l2_device macros
  PCI: Increase D3 delay for AMD Ryzen5/7 XHCI controllers
  PCI: Add generic quirk for increasing D3hot delay
  media: cx23885: Add support for AVerMedia CE310B
  PCI: iproc: Apply quirk_paxc_bridge() for module as well as built-in
  ARM: dts: imx6: rdu2: Limit USBH1 to Full Speed
  ARM: dts: imx6: rdu2: Disable WP for USDHC2 and USDHC3
  arm64: dts: qcom: msm8996: Disable USB2 PHY suspend by core
  selinux: ensure we cleanup the internal AVC counters on error in avc_insert()
  arm: dts: allwinner: H3: Add PMU node
  arm64: dts: allwinner: H6: Add PMU mode
  selinux: fall back to ref-walk if audit is required
  NFC: port100: Convert cpu_to_le16(le16_to_cpu(E1) + E2) to use le16_add_cpu().
  net/wan/fsl_ucc_hdlc: reject muram offsets above 64K
  regulator: rk808: Lower log level on optional GPIOs being not available
  drm/amdgpu: Ensure ret is always initialized when using SOC15_WAIT_ON_RREG
  drm/amdgpu: remove 4 set but not used variable in amdgpu_atombios_get_connector_info_from_object_table
  clk: qcom: rcg2: Don't crash if our parent can't be found; return an error
  kconfig: fix broken dependency in randconfig-generated .config
  KVM: s390: ENOTSUPP -> EOPNOTSUPP fixups
  nbd: add a flush_workqueue in nbd_start_device
  drm/amd/display: Retrain dongles when SINK_COUNT becomes non-zero
  ath10k: Correct the DMA direction for management tx buffers
  ext4, jbd2: ensure panic when aborting with zero errno
  ARM: 8952/1: Disable kmemleak on XIP kernels
  tracing: Fix very unlikely race of registering two stat tracers
  tracing: Fix tracing_stat return values in error handling paths
  powerpc/iov: Move VF pdev fixup into pcibios_fixup_iov()
  s390/pci: Fix possible deadlock in recover_store()
  pwm: omap-dmtimer: Simplify error handling
  x86/sysfb: Fix check for bad VRAM size
  jbd2: clear JBD2_ABORT flag before journal_reset to update log tail info when load journal
  kselftest: Minimise dependency of get_size on C library interfaces
  clocksource/drivers/bcm2835_timer: Fix memory leak of timer
  usb: dwc2: Fix IN FIFO allocation
  usb: gadget: udc: fix possible sleep-in-atomic-context bugs in gr_probe()
  uio: fix a sleep-in-atomic-context bug in uio_dmem_genirq_irqcontrol()
  sparc: Add .exit.data section.
  MIPS: Loongson: Fix potential NULL dereference in loongson3_platform_init()
  efi/x86: Map the entire EFI vendor string before copying it
  pinctrl: baytrail: Do not clear IRQ flags on direct-irq enabled pins
  media: sti: bdisp: fix a possible sleep-in-atomic-context bug in bdisp_device_run()
  char/random: silence a lockdep splat with printk()
  iommu/vt-d: Fix off-by-one in PASID allocation
  gpio: gpio-grgpio: fix possible sleep-in-atomic-context bugs in grgpio_irq_map/unmap()
  powerpc/powernv/iov: Ensure the pdn for VFs always contains a valid PE number
  media: i2c: mt9v032: fix enum mbus codes and frame sizes
  pxa168fb: Fix the function used to release some memory in an error handling path
  pinctrl: sh-pfc: sh7264: Fix CAN function GPIOs
  gianfar: Fix TX timestamping with a stacked DSA driver
  ALSA: ctl: allow TLV read operation for callback type of element in locked case
  ext4: fix ext4_dax_read/write inode locking sequence for IOCB_NOWAIT
  leds: pca963x: Fix open-drain initialization
  brcmfmac: Fix use after free in brcmf_sdio_readframes()
  cpu/hotplug, stop_machine: Fix stop_machine vs hotplug order
  drm/gma500: Fixup fbdev stolen size usage evaluation
  KVM: nVMX: Use correct root level for nested EPT shadow page tables
  Revert "KVM: VMX: Add non-canonical check on writes to RTIT address MSRs"
  Revert "KVM: nVMX: Use correct root level for nested EPT shadow page tables"
  net/sched: flower: add missing validation of TCA_FLOWER_FLAGS
  net/sched: matchall: add missing validation of TCA_MATCHALL_FLAGS
  net: dsa: tag_qca: Make sure there is headroom for tag
  net/smc: fix leak of kernel memory to user space
  enic: prevent waking up stopped tx queues over watchdog reset
  core: Don't skip generic XDP program execution for cloned SKBs
  ANDROID: arm64: update the abi with the new gki_defconfig
  ANDROID: arm64: gki_defconfig: disable CONFIG_DEBUG_PREEMPT
  ANDROID: GKI: arm64: gki_defconfig: follow-up to removing DRM_MSM driver
  ANDROID: drm/msm: Remove Kconfig default
  ANDROID: GKI: arm64: gki_defconfig: remove qcom,cmd-db driver
  ANDROID: GKI: drivers: qcom: cmd-db: Allow compiling qcom,cmd-db driver as module
  ANDROID: GKI: arm64: gki_defconfig: remove qcom,rpmh-rsc driver
  ANDROID: GKI: drivers: qcom: rpmh-rsc: Add tristate support for qcom,rpmh-rsc driver
  ANDROID: ufs, block: fix crypto power management and move into block layer
  ANDROID: rtc: class: support hctosys from modular RTC drivers
  ANDROID: Incremental fs: Support xattrs
  ANDROID: abi update for 4.19.105
  UPSTREAM: random: ignore GRND_RANDOM in getentropy(2)
  UPSTREAM: random: add GRND_INSECURE to return best-effort non-cryptographic bytes
  UPSTREAM: linux/random.h: Mark CONFIG_ARCH_RANDOM functions __must_check
  UPSTREAM: linux/random.h: Use false with bool
  UPSTREAM: linux/random.h: Remove arch_has_random, arch_has_random_seed
  UPSTREAM: random: remove some dead code of poolinfo
  UPSTREAM: random: fix typo in add_timer_randomness()
  UPSTREAM: random: Add and use pr_fmt()
  UPSTREAM: random: convert to ENTROPY_BITS for better code readability
  UPSTREAM: random: remove unnecessary unlikely()
  UPSTREAM: random: remove kernel.random.read_wakeup_threshold
  UPSTREAM: random: delete code to pull data into pools
  UPSTREAM: random: remove the blocking pool
  UPSTREAM: random: make /dev/random be almost like /dev/urandom
  UPSTREAM: random: Add a urandom_read_nowait() for random APIs that don't warn
  UPSTREAM: random: Don't wake crng_init_wait when crng_init == 1
  UPSTREAM: char/random: silence a lockdep splat with printk()
  BACKPORT: fdt: add support for rng-seed
  BACKPORT: arm64: map FDT as RW for early_init_dt_scan()
  UPSTREAM: random: fix soft lockup when trying to read from an uninitialized blocking pool
  UPSTREAM: random: document get_random_int() family
  UPSTREAM: random: move rand_initialize() earlier
  UPSTREAM: random: only read from /dev/random after its pool has received 128 bits
  UPSTREAM: drivers/char/random.c: make primary_crng static
  UPSTREAM: drivers/char/random.c: remove unused stuct poolinfo::poolbits
  UPSTREAM: drivers/char/random.c: constify poolinfo_table
  ANDROID: clang: update to 10.0.4
  Linux 4.19.105
  KVM: x86/mmu: Fix struct guest_walker arrays for 5-level paging
  jbd2: do not clear the BH_Mapped flag when forgetting a metadata buffer
  jbd2: move the clearing of b_modified flag to the journal_unmap_buffer()
  NFSv4.1 make cachethis=no for writes
  hwmon: (pmbus/ltc2978) Fix PMBus polling of MFR_COMMON definitions.
  perf/x86/intel: Fix inaccurate period in context switch for auto-reload
  s390/time: Fix clk type in get_tod_clock
  RDMA/core: Fix protection fault in get_pkey_idx_qp_list
  RDMA/rxe: Fix soft lockup problem due to using tasklets in softirq
  RDMA/hfi1: Fix memory leak in _dev_comp_vect_mappings_create
  RDMA/core: Fix invalid memory access in spec_filter_size
  IB/rdmavt: Reset all QPs when the device is shut down
  IB/hfi1: Close window for pq and request coliding
  IB/hfi1: Acquire lock to release TID entries when user file is closed
  nvme: fix the parameter order for nvme_get_log in nvme_get_fw_slot_info
  perf/x86/amd: Add missing L2 misses event spec to AMD Family 17h's event map
  KVM: nVMX: Use correct root level for nested EPT shadow page tables
  arm64: ssbs: Fix context-switch when SSBS is present on all CPUs
  ARM: npcm: Bring back GPIOLIB support
  btrfs: log message when rw remount is attempted with unclean tree-log
  btrfs: print message when tree-log replay starts
  btrfs: ref-verify: fix memory leaks
  Btrfs: fix race between using extent maps and merging them
  ext4: improve explanation of a mount failure caused by a misconfigured kernel
  ext4: add cond_resched() to ext4_protect_reserved_inode
  ext4: fix checksum errors with indexed dirs
  ext4: fix support for inode sizes > 1024 bytes
  ext4: don't assume that mmp_nodename/bdevname have NUL
  ALSA: usb-audio: Add clock validity quirk for Denon MC7000/MCX8000
  ALSA: usb-audio: sound: usb: usb true/false for bool return type
  arm64: nofpsmid: Handle TIF_FOREIGN_FPSTATE flag cleanly
  arm64: cpufeature: Set the FP/SIMD compat HWCAP bits properly
  ALSA: usb-audio: Apply sample rate quirk for Audioengine D1
  ALSA: hda/realtek - Fix silent output on MSI-GL73
  ALSA: usb-audio: Fix UAC2/3 effect unit parsing
  Input: synaptics - remove the LEN0049 dmi id from topbuttonpad list
  Input: synaptics - enable SMBus on ThinkPad L470
  Input: synaptics - switch T470s to RMI4 by default
  ANDROID: Fix ABI representation after enabling CONFIG_NET_NS
  ANDROID: gki_defconfig: Enable CONFIG_NET_NS
  ANDROID: gki_defconfig: Enable XDP_SOCKETS
  UPSTREAM: sched/topology: Introduce a sysctl for Energy Aware Scheduling
  ANDROID: gki_defconfig: Enable MAC80211_RC_MINSTREL
  ANDROID: f2fs: remove unused function
  ANDROID: virtio: virtio_input: pass _DIRECT only if the device advertises _DIRECT
  ANDROID: cf build: Use merge_configs
  ANDROID: net: bpf: Allow TC programs to call BPF_FUNC_skb_change_head
  ANDROID: gki_defconfig: Disable SDCARD_FS
  Linux 4.19.104
  padata: fix null pointer deref of pd->pinst
  serial: uartps: Move the spinlock after the read of the tx empty
  x86/stackframe, x86/ftrace: Add pt_regs frame annotations
  x86/stackframe: Move ENCODE_FRAME_POINTER to asm/frame.h
  scsi: megaraid_sas: Do not initiate OCR if controller is not in ready state
  libertas: make lbs_ibss_join_existing() return error code on rates overflow
  libertas: don't exit from lbs_ibss_join_existing() with RCU read lock held
  mwifiex: Fix possible buffer overflows in mwifiex_cmd_append_vsie_tlv()
  mwifiex: Fix possible buffer overflows in mwifiex_ret_wmm_get_status()
  pinctrl: sh-pfc: r8a7778: Fix duplicate SDSELF_B and SD1_CLK_B
  media: i2c: adv748x: Fix unsafe macros
  crypto: atmel-sha - fix error handling when setting hmac key
  crypto: artpec6 - return correct error code for failed setkey()
  mtd: sharpslpart: Fix unsigned comparison to zero
  mtd: onenand_base: Adjust indentation in onenand_read_ops_nolock
  KVM: arm64: pmu: Don't increment SW_INCR if PMCR.E is unset
  KVM: arm: Make inject_abt32() inject an external abort instead
  KVM: arm: Fix DFSR setting for non-LPAE aarch32 guests
  KVM: arm/arm64: Fix young bit from mmu notifier
  arm64: ptrace: nofpsimd: Fail FP/SIMD regset operations
  arm64: cpufeature: Fix the type of no FP/SIMD capability
  ARM: 8949/1: mm: mark free_memmap as __init
  KVM: arm/arm64: vgic-its: Fix restoration of unmapped collections
  iommu/arm-smmu-v3: Populate VMID field for CMDQ_OP_TLBI_NH_VA
  powerpc/pseries: Allow not having ibm, hypertas-functions::hcall-multi-tce for DDW
  powerpc/pseries/vio: Fix iommu_table use-after-free refcount warning
  tools/power/acpi: fix compilation error
  ARM: dts: at91: sama5d3: define clock rate range for tcb1
  ARM: dts: at91: sama5d3: fix maximum peripheral clock rates
  ARM: dts: am43xx: add support for clkout1 clock
  ARM: dts: at91: Reenable UART TX pull-ups
  platform/x86: intel_mid_powerbtn: Take a copy of ddata
  ARC: [plat-axs10x]: Add missing multicast filter number to GMAC node
  rtc: cmos: Stop using shared IRQ
  rtc: hym8563: Return -EINVAL if the time is known to be invalid
  spi: spi-mem: Fix inverted logic in op sanity check
  spi: spi-mem: Add extra sanity checks on the op param
  gpio: zynq: Report gpio direction at boot
  serial: uartps: Add a timeout to the tx empty wait
  NFSv4: try lease recovery on NFS4ERR_EXPIRED
  NFS/pnfs: Fix pnfs_generic_prepare_to_resend_writes()
  NFS: Revalidate the file size on a fatal write error
  nfs: NFS_SWAP should depend on SWAP
  PCI: Don't disable bridge BARs when assigning bus resources
  PCI/switchtec: Fix vep_vector_number ioread width
  ath10k: pci: Only dump ATH10K_MEM_REGION_TYPE_IOREG when safe
  PCI/IOV: Fix memory leak in pci_iov_add_virtfn()
  scsi: ufs: Fix ufshcd_probe_hba() reture value in case ufshcd_scsi_add_wlus() fails
  RDMA/uverbs: Verify MR access flags
  RDMA/core: Fix locking in ib_uverbs_event_read
  RDMA/netlink: Do not always generate an ACK for some netlink operations
  IB/mlx4: Fix memory leak in add_gid error flow
  hv_sock: Remove the accept port restriction
  ASoC: pcm: update FE/BE trigger order based on the command
  ANDROID: gki_defconfig: Add CONFIG_UNICODE
  ANDROID: added memory initialization tests to cuttlefish config
  ANDROID: gki_defconfig: enable CONFIG_RUNTIME_TESTING_MENU
  fs-verity: use u64_to_user_ptr()
  fs-verity: use mempool for hash requests
  fs-verity: implement readahead of Merkle tree pages
  fs-verity: implement readahead for FS_IOC_ENABLE_VERITY
  fscrypt: improve format of no-key names
  ubifs: allow both hash and disk name to be provided in no-key names
  ubifs: don't trigger assertion on invalid no-key filename
  fscrypt: clarify what is meant by a per-file key
  fscrypt: derive dirhash key for casefolded directories
  fscrypt: don't allow v1 policies with casefolding
  fscrypt: add "fscrypt_" prefix to fname_encrypt()
  fscrypt: don't print name of busy file when removing key
  fscrypt: document gfp_flags for bounce page allocation
  fscrypt: optimize fscrypt_zeroout_range()
  fscrypt: remove redundant bi_status check
  fscrypt: Allow modular crypto algorithms
  FROMLIST: rename missed uaccess .fixup section
  ANDROID: f2fs: fix missing blk-crypto changes
  ANDROID: gki_defconfig: enable heap and stack initialization.
  UPSTREAM: lib/test_stackinit: Handle Clang auto-initialization pattern
  UPSTREAM: lib: Introduce test_stackinit module
  fscrypt: include <linux/ioctl.h> in UAPI header
  fscrypt: don't check for ENOKEY from fscrypt_get_encryption_info()
  fscrypt: remove fscrypt_is_direct_key_policy()
  fscrypt: move fscrypt_valid_enc_modes() to policy.c
  fscrypt: check for appropriate use of DIRECT_KEY flag earlier
  fscrypt: split up fscrypt_supported_policy() by policy version
  fscrypt: introduce fscrypt_needs_contents_encryption()
  fscrypt: move fscrypt_d_revalidate() to fname.c
  fscrypt: constify inode parameter to filename encryption functions
  fscrypt: constify struct fscrypt_hkdf parameter to fscrypt_hkdf_expand()
  fscrypt: verify that the crypto_skcipher has the correct ivsize
  fscrypt: use crypto_skcipher_driver_name()
  fscrypt: support passing a keyring key to FS_IOC_ADD_ENCRYPTION_KEY
  keys: Export lookup_user_key to external users
  UPSTREAM: dynamic_debug: allow to work if debugfs is disabled
  UPSTREAM: lib: dynamic_debug: no need to check return value of debugfs_create functions
  ANDROID: ABI/Whitelist: update for Cuttlefish
  ANDROID: update ABI representation and GKI whitelist
  ANDROID: gki_defconfig: Set CONFIG_ANDROID_BINDERFS=y
  Linux 4.19.103
  rxrpc: Fix service call disconnection
  perf/core: Fix mlock accounting in perf_mmap()
  clocksource: Prevent double add_timer_on() for watchdog_timer
  x86/apic/msi: Plug non-maskable MSI affinity race
  cifs: fail i/o on soft mounts if sessionsetup errors out
  mm/page_alloc.c: fix uninitialized memmaps on a partially populated last section
  mm: return zero_resv_unavail optimization
  mm: zero remaining unavailable struct pages
  KVM: Play nice with read-only memslots when querying host page size
  KVM: Use vcpu-specific gva->hva translation when querying host page size
  KVM: nVMX: vmread should not set rflags to specify success in case of #PF
  KVM: VMX: Add non-canonical check on writes to RTIT address MSRs
  KVM: x86: Use gpa_t for cr2/gpa to fix TDP support on 32-bit KVM
  KVM: x86/mmu: Apply max PA check for MMIO sptes to 32-bit KVM
  btrfs: flush write bio if we loop in extent_write_cache_pages
  drm/dp_mst: Remove VCPI while disabling topology mgr
  drm: atmel-hlcdc: enable clock before configuring timing engine
  btrfs: free block groups after free'ing fs trees
  btrfs: use bool argument in free_root_pointers()
  ext4: fix deadlock allocating crypto bounce page from mempool
  net: dsa: b53: Always use dev->vlan_enabled in b53_configure_vlan()
  net: macb: Limit maximum GEM TX length in TSO
  net: macb: Remove unnecessary alignment check for TSO
  net/mlx5: IPsec, fix memory leak at mlx5_fpga_ipsec_delete_sa_ctx
  net/mlx5: IPsec, Fix esp modify function attribute
  net: systemport: Avoid RBUF stuck in Wake-on-LAN mode
  net_sched: fix a resource leak in tcindex_set_parms()
  net: mvneta: move rx_dropped and rx_errors in per-cpu stats
  net: dsa: bcm_sf2: Only 7278 supports 2Gb/sec IMP port
  bonding/alb: properly access headers in bond_alb_xmit()
  mfd: rn5t618: Mark ADC control register volatile
  mfd: da9062: Fix watchdog compatible string
  ubi: Fix an error pointer dereference in error handling code
  ubi: fastmap: Fix inverted logic in seen selfcheck
  nfsd: Return the correct number of bytes written to the file
  nfsd: fix jiffies/time_t mixup in LRU list
  nfsd: fix delay timer on 32-bit architectures
  IB/core: Fix ODP get user pages flow
  IB/mlx5: Fix outstanding_pi index for GSI qps
  net: tulip: Adjust indentation in {dmfe, uli526x}_init_module
  net: smc911x: Adjust indentation in smc911x_phy_configure
  ppp: Adjust indentation into ppp_async_input
  NFC: pn544: Adjust indentation in pn544_hci_check_presence
  drm: msm: mdp4: Adjust indentation in mdp4_dsi_encoder_enable
  powerpc/44x: Adjust indentation in ibm4xx_denali_fixup_memsize
  ext2: Adjust indentation in ext2_fill_super
  phy: qualcomm: Adjust indentation in read_poll_timeout
  scsi: ufs: Recheck bkops level if bkops is disabled
  scsi: qla4xxx: Adjust indentation in qla4xxx_mem_free
  scsi: csiostor: Adjust indentation in csio_device_reset
  scsi: qla2xxx: Fix the endianness of the qla82xx_get_fw_size() return type
  percpu: Separate decrypted varaibles anytime encryption can be enabled
  drm/amd/dm/mst: Ignore payload update failures
  clk: tegra: Mark fuse clock as critical
  KVM: s390: do not clobber registers during guest reset/store status
  KVM: x86: Free wbinvd_dirty_mask if vCPU creation fails
  KVM: x86: Don't let userspace set host-reserved cr4 bits
  x86/kvm: Be careful not to clear KVM_VCPU_FLUSH_TLB bit
  KVM: PPC: Book3S PR: Free shared page if mmu initialization fails
  KVM: PPC: Book3S HV: Uninit vCPU if vcore creation fails
  KVM: x86: Fix potential put_fpu() w/o load_fpu() on MPX platform
  KVM: x86: Protect MSR-based index computations in fixed_msr_to_seg_unit() from Spectre-v1/L1TF attacks
  KVM: x86: Protect x86_decode_insn from Spectre-v1/L1TF attacks
  KVM: x86: Protect MSR-based index computations from Spectre-v1/L1TF attacks in x86.c
  KVM: x86: Protect ioapic_read_indirect() from Spectre-v1/L1TF attacks
  KVM: x86: Protect MSR-based index computations in pmu.h from Spectre-v1/L1TF attacks
  KVM: x86: Protect ioapic_write_indirect() from Spectre-v1/L1TF attacks
  KVM: x86: Protect kvm_hv_msr_[get|set]_crash_data() from Spectre-v1/L1TF attacks
  KVM: x86: Protect kvm_lapic_reg_write() from Spectre-v1/L1TF attacks
  KVM: x86: Protect DR-based index computations from Spectre-v1/L1TF attacks
  KVM: x86: Protect pmu_intel.c from Spectre-v1/L1TF attacks
  KVM: x86: Refactor prefix decoding to prevent Spectre-v1/L1TF attacks
  KVM: x86: Refactor picdev_write() to prevent Spectre-v1/L1TF attacks
  aio: prevent potential eventfd recursion on poll
  eventfd: track eventfd_signal() recursion depth
  bcache: add readahead cache policy options via sysfs interface
  watchdog: fix UAF in reboot notifier handling in watchdog core code
  xen/balloon: Support xend-based toolstack take two
  tools/kvm_stat: Fix kvm_exit filter name
  media: rc: ensure lirc is initialized before registering input device
  drm/rect: Avoid division by zero
  gfs2: fix O_SYNC write handling
  gfs2: move setting current->backing_dev_info
  sunrpc: expiry_time should be seconds not timeval
  mwifiex: fix unbalanced locking in mwifiex_process_country_ie()
  iwlwifi: don't throw error when trying to remove IGTK
  ARM: tegra: Enable PLLP bypass during Tegra124 LP1
  Btrfs: fix race between adding and putting tree mod seq elements and nodes
  btrfs: set trans->drity in btrfs_commit_transaction
  Btrfs: fix missing hole after hole punching and fsync when using NO_HOLES
  jbd2_seq_info_next should increase position index
  NFS: Directory page cache pages need to be locked when read
  NFS: Fix memory leaks and corruption in readdir
  scsi: qla2xxx: Fix unbound NVME response length
  crypto: picoxcell - adjust the position of tasklet_init and fix missed tasklet_kill
  crypto: api - Fix race condition in crypto_spawn_alg
  crypto: atmel-aes - Fix counter overflow in CTR mode
  crypto: pcrypt - Do not clear MAY_SLEEP flag in original request
  crypto: ccp - set max RSA modulus size for v3 platform devices as well
  samples/bpf: Don't try to remove user's homedir on clean
  ftrace: Protect ftrace_graph_hash with ftrace_sync
  ftrace: Add comment to why rcu_dereference_sched() is open coded
  tracing: Annotate ftrace_graph_notrace_hash pointer with __rcu
  tracing: Annotate ftrace_graph_hash pointer with __rcu
  padata: Remove broken queue flushing
  dm writecache: fix incorrect flush sequence when doing SSD mode commit
  dm: fix potential for q->make_request_fn NULL pointer
  dm crypt: fix benbi IV constructor crash if used in authenticated mode
  dm space map common: fix to ensure new block isn't already in use
  dm zoned: support zone sizes smaller than 128MiB
  of: Add OF_DMA_DEFAULT_COHERENT & select it on powerpc
  PM: core: Fix handling of devices deleted during system-wide resume
  f2fs: code cleanup for f2fs_statfs_project()
  f2fs: fix miscounted block limit in f2fs_statfs_project()
  f2fs: choose hardlimit when softlimit is larger than hardlimit in f2fs_statfs_project()
  ovl: fix wrong WARN_ON() in ovl_cache_update_ino()
  power: supply: ltc2941-battery-gauge: fix use-after-free
  scsi: qla2xxx: Fix mtcp dump collection failure
  scripts/find-unused-docs: Fix massive false positives
  crypto: ccree - fix PM race condition
  crypto: ccree - fix pm wrongful error reporting
  crypto: ccree - fix backlog memory leak
  crypto: api - Check spawn->alg under lock in crypto_drop_spawn
  mfd: axp20x: Mark AXP20X_VBUS_IPSOUT_MGMT as volatile
  hv_balloon: Balloon up according to request page number
  mmc: sdhci-of-at91: fix memleak on clk_get failure
  PCI: keystone: Fix link training retries initiation
  crypto: geode-aes - convert to skcipher API and make thread-safe
  ubifs: Fix deadlock in concurrent bulk-read and writepage
  ubifs: Fix FS_IOC_SETFLAGS unexpectedly clearing encrypt flag
  ubifs: don't trigger assertion on invalid no-key filename
  ubifs: Reject unsupported ioctl flags explicitly
  alarmtimer: Unregister wakeup source when module get fails
  ACPI / battery: Deal better with neither design nor full capacity not being reported
  ACPI / battery: Use design-cap for capacity calculations if full-cap is not available
  ACPI / battery: Deal with design or full capacity being reported as -1
  ACPI: video: Do not export a non working backlight interface on MSI MS-7721 boards
  mmc: spi: Toggle SPI polarity, do not hardcode it
  PCI: tegra: Fix return value check of pm_runtime_get_sync()
  smb3: fix signing verification of large reads
  powerpc/pseries: Advance pfn if section is not present in lmb_is_removable()
  powerpc/xmon: don't access ASDR in VMs
  s390/mm: fix dynamic pagetable upgrade for hugetlbfs
  MIPS: boot: fix typo in 'vmlinux.lzma.its' target
  MIPS: fix indentation of the 'RELOCS' message
  KVM: arm64: Only sign-extend MMIO up to register width
  KVM: arm/arm64: Correct AArch32 SPSR on exception entry
  KVM: arm/arm64: Correct CPSR on exception entry
  KVM: arm64: Correct PSTATE on exception entry
  ALSA: hda: Add Clevo W65_67SB the power_save blacklist
  platform/x86: intel_scu_ipc: Fix interrupt support
  irqdomain: Fix a memory leak in irq_domain_push_irq()
  lib/test_kasan.c: fix memory leak in kmalloc_oob_krealloc_more()
  media: v4l2-rect.h: fix v4l2_rect_map_inside() top/left adjustments
  media: v4l2-core: compat: ignore native command codes
  media/v4l2-core: set pages dirty upon releasing DMA buffers
  mm: move_pages: report the number of non-attempted pages
  mm/memory_hotplug: fix remove_memory() lockdep splat
  ALSA: dummy: Fix PCM format loop in proc output
  ALSA: usb-audio: Fix endianess in descriptor validation
  usb: gadget: f_ecm: Use atomic_t to track in-flight request
  usb: gadget: f_ncm: Use atomic_t to track in-flight request
  usb: gadget: legacy: set max_speed to super-speed
  usb: typec: tcpci: mask event interrupts when remove driver
  brcmfmac: Fix memory leak in brcmf_usbdev_qinit
  rcu: Avoid data-race in rcu_gp_fqs_check_wake()
  tracing: Fix sched switch start/stop refcount racy updates
  ipc/msg.c: consolidate all xxxctl_down() functions
  mfd: dln2: More sanity checking for endpoints
  media: uvcvideo: Avoid cyclic entity chains due to malformed USB descriptors
  rxrpc: Fix NULL pointer deref due to call->conn being cleared on disconnect
  rxrpc: Fix missing active use pinning of rxrpc_local object
  rxrpc: Fix insufficient receive notification generation
  rxrpc: Fix use-after-free in rxrpc_put_local()
  tcp: clear tp->segs_{in|out} in tcp_disconnect()
  tcp: clear tp->data_segs{in|out} in tcp_disconnect()
  tcp: clear tp->delivered in tcp_disconnect()
  tcp: clear tp->total_retrans in tcp_disconnect()
  bnxt_en: Fix TC queue mapping.
  net: stmmac: Delete txtimer in suspend()
  net_sched: fix an OOB access in cls_tcindex
  net: hsr: fix possible NULL deref in hsr_handle_frame()
  l2tp: Allow duplicate session creation with UDP
  gtp: use __GFP_NOWARN to avoid memalloc warning
  cls_rsvp: fix rsvp_policy
  sparc32: fix struct ipc64_perm type definition
  iwlwifi: mvm: fix NVM check for 3168 devices
  printk: fix exclusive_console replaying
  udf: Allow writing to 'Rewritable' partitions
  x86/cpu: Update cached HLE state on write to TSX_CTRL_CPUID_CLEAR
  ocfs2: fix oops when writing cloned file
  media: iguanair: fix endpoint sanity check
  kernel/module: Fix memleak in module_add_modinfo_attrs()
  ovl: fix lseek overflow on 32bit
  Revert "drm/sun4i: dsi: Change the start delay calculation"
  ANDROID: Revert "ANDROID: gki_defconfig: removed CONFIG_PM_WAKELOCKS"
  ANDROID: dm: prevent default-key from being enabled without needed hooks
  ANDROID: gki: x86: Enable PCI_MSI, WATCHDOG, HPET
  ANDROID: Incremental fs: Fix crash on failed lookup
  ANDROID: Incremental fs: Make files writeable
  ANDROID: update abi for 4.19.102
  ANDROID: Incremental fs: Remove C++-style comments
  Linux 4.19.102
  mm/migrate.c: also overwrite error when it is bigger than zero
  perf report: Fix no libunwind compiled warning break s390 issue
  btrfs: do not zero f_bavail if we have available space
  net: Fix skb->csum update in inet_proto_csum_replace16().
  l2t_seq_next should increase position index
  seq_tab_next() should increase position index
  net: fsl/fman: rename IF_MODE_XGMII to IF_MODE_10G
  net/fsl: treat fsl,erratum-a011043
  powerpc/fsl/dts: add fsl,erratum-a011043
  qlcnic: Fix CPU soft lockup while collecting firmware dump
  ARM: dts: am43x-epos-evm: set data pin directions for spi0 and spi1
  r8152: get default setting of WOL before initializing
  airo: Add missing CAP_NET_ADMIN check in AIROOLDIOCTL/SIOCDEVPRIVATE
  airo: Fix possible info leak in AIROOLDIOCTL/SIOCDEVPRIVATE
  tee: optee: Fix compilation issue with nommu
  ARM: 8955/1: virt: Relax arch timer version check during early boot
  scsi: fnic: do not queue commands during fwreset
  xfrm: interface: do not confirm neighbor when do pmtu update
  xfrm interface: fix packet tx through bpf_redirect()
  vti[6]: fix packet tx through bpf_redirect()
  ARM: dts: am335x-boneblack-common: fix memory size
  iwlwifi: Don't ignore the cap field upon mcc update
  riscv: delete temporary files
  bnxt_en: Fix ipv6 RFS filter matching logic.
  net: dsa: bcm_sf2: Configure IMP port for 2Gb/sec
  netfilter: nft_tunnel: ERSPAN_VERSION must not be null
  wireless: wext: avoid gcc -O3 warning
  mac80211: Fix TKIP replay protection immediately after key setup
  cfg80211: Fix radar event during another phy CAC
  wireless: fix enabling channel 12 for custom regulatory domain
  parisc: Use proper printk format for resource_size_t
  qmi_wwan: Add support for Quectel RM500Q
  ASoC: sti: fix possible sleep-in-atomic
  platform/x86: GPD pocket fan: Allow somewhat lower/higher temperature limits
  igb: Fix SGMII SFP module discovery for 100FX/LX.
  ixgbe: Fix calculation of queue with VFs and flow director on interface flap
  ixgbevf: Remove limit of 10 entries for unicast filter list
  ASoC: rt5640: Fix NULL dereference on module unload
  clk: mmp2: Fix the order of timer mux parents
  mac80211: mesh: restrict airtime metric to peered established plinks
  clk: sunxi-ng: h6-r: Fix AR100/R_APB2 parent order
  rseq: Unregister rseq for clone CLONE_VM
  tools lib traceevent: Fix memory leakage in filter_event
  soc: ti: wkup_m3_ipc: Fix race condition with rproc_boot
  ARM: dts: beagle-x15-common: Model 5V0 regulator
  ARM: dts: am57xx-beagle-x15/am57xx-idk: Remove "gpios" for endpoint dt nodes
  ARM: dts: sun8i: a83t: Correct USB3503 GPIOs polarity
  media: si470x-i2c: Move free() past last use of 'radio'
  cgroup: Prevent double killing of css when enabling threaded cgroup
  Bluetooth: Fix race condition in hci_release_sock()
  ttyprintk: fix a potential deadlock in interrupt context issue
  tomoyo: Use atomic_t for statistics counter
  media: dvb-usb/dvb-usb-urb.c: initialize actlen to 0
  media: gspca: zero usb_buf
  media: vp7045: do not read uninitialized values if usb transfer fails
  media: af9005: uninitialized variable printked
  media: digitv: don't continue if remote control state can't be read
  reiserfs: Fix memory leak of journal device string
  mm/mempolicy.c: fix out of bounds write in mpol_parse_str()
  ext4: validate the debug_want_extra_isize mount option at parse time
  arm64: kbuild: remove compressed images on 'make ARCH=arm64 (dist)clean'
  tools lib: Fix builds when glibc contains strlcpy()
  PM / devfreq: Add new name attribute for sysfs
  perf c2c: Fix return type for histogram sorting comparision functions
  rsi: fix use-after-free on failed probe and unbind
  rsi: add hci detach for hibernation and poweroff
  crypto: pcrypt - Fix user-after-free on module unload
  x86/resctrl: Fix a deadlock due to inaccurate reference
  x86/resctrl: Fix use-after-free due to inaccurate refcount of rdtgroup
  x86/resctrl: Fix use-after-free when deleting resource groups
  vfs: fix do_last() regression
  ANDROID: update abi definitions
  BACKPORT: clk: core: clarify the check for runtime PM
  UPSTREAM: sched/fair/util_est: Implement faster ramp-up EWMA on utilization increases
  ANDROID: Re-use SUGOV_RT_MAX_FREQ to control uclamp rt behavior
  BACKPORT: sched/fair: Make EAS wakeup placement consider uclamp restrictions
  BACKPORT: sched/fair: Make task_fits_capacity() consider uclamp restrictions
  ANDROID: sched/core: Move SchedTune task API into UtilClamp wrappers
  ANDROID: sched/core: Add a latency-sensitive flag to uclamp
  ANDROID: sched/tune: Move SchedTune cpu API into UtilClamp wrappers
  ANDROID: init: kconfig: Only allow sched tune if !uclamp
  FROMGIT: sched/core: Fix size of rq::uclamp initialization
  FROMGIT: sched/uclamp: Fix a bug in propagating uclamp value in new cgroups
  FROMGIT: sched/uclamp: Rename uclamp_util_with() into uclamp_rq_util_with()
  FROMGIT: sched/uclamp: Make uclamp util helpers use and return UL values
  FROMGIT: sched/uclamp: Remove uclamp_util()
  BACKPORT: sched/rt: Make RT capacity-aware
  UPSTREAM: tools headers UAPI: Sync sched.h with the kernel
  UPSTREAM: sched/uclamp: Fix overzealous type replacement
  UPSTREAM: sched/uclamp: Fix incorrect condition
  UPSTREAM: sched/core: Fix compilation error when cgroup not selected
  UPSTREAM: sched/core: Fix uclamp ABI bug, clean up and robustify sched_read_attr() ABI logic and code
  UPSTREAM: sched/uclamp: Always use 'enum uclamp_id' for clamp_id values
  UPSTREAM: sched/uclamp: Update CPU's refcount on TG's clamp changes
  UPSTREAM: sched/uclamp: Use TG's clamps to restrict TASK's clamps
  UPSTREAM: sched/uclamp: Propagate system defaults to the root group
  UPSTREAM: sched/uclamp: Propagate parent clamps
  UPSTREAM: sched/uclamp: Extend CPU's cgroup controller
  BACKPORT: sched/uclamp: Add uclamp support to energy_compute()
  UPSTREAM: sched/uclamp: Add uclamp_util_with()
  BACKPORT: sched/cpufreq, sched/uclamp: Add clamps for FAIR and RT tasks
  UPSTREAM: sched/uclamp: Set default clamps for RT tasks
  UPSTREAM: sched/uclamp: Reset uclamp values on RESET_ON_FORK
  UPSTREAM: sched/uclamp: Extend sched_setattr() to support utilization clamping
  UPSTREAM: sched/core: Allow sched_setattr() to use the current policy
  UPSTREAM: sched/uclamp: Add system default clamps
  UPSTREAM: sched/uclamp: Enforce last task's UCLAMP_MAX
  UPSTREAM: sched/uclamp: Add bucket local max tracking
  UPSTREAM: sched/uclamp: Add CPU's clamp buckets refcounting
  UPSTREAM: cgroup: add cgroup_parse_float()
  Linux 4.19.101
  KVM: arm64: Write arch.mdcr_el2 changes since last vcpu_load on VHE
  block: fix 32 bit overflow in __blkdev_issue_discard()
  block: cleanup __blkdev_issue_discard()
  random: try to actively add entropy rather than passively wait for it
  crypto: af_alg - Use bh_lock_sock in sk_destruct
  rsi: fix non-atomic allocation in completion handler
  rsi: fix memory leak on failed URB submission
  rsi: fix use-after-free on probe errors
  sched/fair: Fix insertion in rq->leaf_cfs_rq_list
  sched/fair: Add tmp_alone_branch assertion
  usb-storage: Disable UAS on JMicron SATA enclosure
  ARM: OMAP2+: SmartReflex: add omap_sr_pdata definition
  iommu/amd: Support multiple PCI DMA aliases in IRQ Remapping
  PCI: Add DMA alias quirk for Intel VCA NTB
  platform/x86: dell-laptop: disable kbd backlight on Inspiron 10xx
  HID: steam: Fix input device disappearing
  atm: eni: fix uninitialized variable warning
  gpio: max77620: Add missing dependency on GPIOLIB_IRQCHIP
  net: wan: sdla: Fix cast from pointer to integer of different size
  drivers/net/b44: Change to non-atomic bit operations on pwol_mask
  spi: spi-dw: Add lock protect dw_spi rx/tx to prevent concurrent calls
  watchdog: rn5t618_wdt: fix module aliases
  watchdog: max77620_wdt: fix potential build errors
  phy: cpcap-usb: Prevent USB line glitches from waking up modem
  phy: qcom-qmp: Increase PHY ready timeout
  drivers/hid/hid-multitouch.c: fix a possible null pointer access.
  HID: Add quirk for incorrect input length on Lenovo Y720
  HID: ite: Add USB id match for Acer SW5-012 keyboard dock
  HID: Add quirk for Xin-Mo Dual Controller
  arc: eznps: fix allmodconfig kconfig warning
  HID: multitouch: Add LG MELF0410 I2C touchscreen support
  net_sched: fix ops->bind_class() implementations
  net_sched: ematch: reject invalid TCF_EM_SIMPLE
  zd1211rw: fix storage endpoint lookup
  rtl8xxxu: fix interface sanity check
  brcmfmac: fix interface sanity check
  ath9k: fix storage endpoint lookup
  cifs: Fix memory allocation in __smb2_handle_cancelled_cmd()
  crypto: chelsio - fix writing tfm flags to wrong place
  iio: st_gyro: Correct data for LSM9DS0 gyro
  mei: me: add comet point (lake) H device ids
  component: do not dereference opaque pointer in debugfs
  serial: 8250_bcm2835aux: Fix line mismatch on driver unbind
  staging: vt6656: Fix false Tx excessive retries reporting.
  staging: vt6656: use NULLFUCTION stack on mac80211
  staging: vt6656: correct packet types for CTS protect, mode.
  staging: wlan-ng: ensure error return is actually returned
  staging: most: net: fix buffer overflow
  usb: dwc3: turn off VBUS when leaving host mode
  USB: serial: ir-usb: fix IrLAP framing
  USB: serial: ir-usb: fix link-speed handling
  USB: serial: ir-usb: add missing endpoint sanity check
  usb: dwc3: pci: add ID for the Intel Comet Lake -V variant
  rsi_91x_usb: fix interface sanity check
  orinoco_usb: fix interface sanity check
  ANDROID: gki: Removed cf modules from gki_defconfig
  ANDROID: Remove default y for VIRTIO_PCI_LEGACY
  ANDROID: gki_defconfig: Remove SND_8X0
  ANDROID: gki: Fixed some typos in Kconfig.gki
  ANDROID: modularize BLK_MQ_VIRTIO
  ANDROID: kallsyms: strip hashes from function names with ThinLTO
  ANDROID: Incremental fs: Remove unneeded compatibility typedef
  ANDROID: Incremental fs: Enable incrementalfs in GKI
  ANDROID: Incremental fs: Fix sparse errors
  ANDROID: Fixing incremental fs style issues
  ANDROID: Make incfs selftests pass
  ANDROID: Initial commit of Incremental FS
  ANDROID: gki_defconfig: Enable req modules in GKI
  ANDROID: gki_defconfig: Set IKHEADERS back to =y
  UPSTREAM: UAPI: ndctl: Remove use of PAGE_SIZE
  Linux 4.19.100
  mm/memory_hotplug: shrink zones when offlining memory
  mm/memory_hotplug: fix try_offline_node()
  mm/memunmap: don't access uninitialized memmap in memunmap_pages()
  drivers/base/node.c: simplify unregister_memory_block_under_nodes()
  mm/hotplug: kill is_dev_zone() usage in __remove_pages()
  mm/memory_hotplug: remove "zone" parameter from sparse_remove_one_section
  mm/memory_hotplug: make unregister_memory_block_under_nodes() never fail
  mm/memory_hotplug: remove memory block devices before arch_remove_memory()
  mm/memory_hotplug: create memory block devices after arch_add_memory()
  drivers/base/memory: pass a block_id to init_memory_block()
  mm/memory_hotplug: allow arch_remove_memory() without CONFIG_MEMORY_HOTREMOVE
  s390x/mm: implement arch_remove_memory()
  mm/memory_hotplug: make __remove_pages() and arch_remove_memory() never fail
  powerpc/mm: Fix section mismatch warning
  mm/memory_hotplug: make __remove_section() never fail
  mm/memory_hotplug: make unregister_memory_section() never fail
  mm, memory_hotplug: update a comment in unregister_memory()
  drivers/base/memory.c: clean up relics in function parameters
  mm/memory_hotplug: release memory resource after arch_remove_memory()
  mm, memory_hotplug: add nid parameter to arch_remove_memory
  drivers/base/memory.c: remove an unnecessary check on NR_MEM_SECTIONS
  mm, sparse: pass nid instead of pgdat to sparse_add_one_section()
  mm, sparse: drop pgdat_resize_lock in sparse_add/remove_one_section()
  mm/memory_hotplug: make remove_memory() take the device_hotplug_lock
  net/x25: fix nonblocking connect
  netfilter: nf_tables: add __nft_chain_type_get()
  netfilter: ipset: use bitmap infrastructure completely
  scsi: iscsi: Avoid potential deadlock in iscsi_if_rx func
  media: v4l2-ioctl.c: zero reserved fields for S/TRY_FMT
  libertas: Fix two buffer overflows at parsing bss descriptor
  coresight: tmc-etf: Do not call smp_processor_id from preemptible
  coresight: etb10: Do not call smp_processor_id from preemptible
  crypto: geode-aes - switch to skcipher for cbc(aes) fallback
  sd: Fix REQ_OP_ZONE_REPORT completion handling
  tracing: Fix histogram code when expression has same var as value
  tracing: Remove open-coding of hist trigger var_ref management
  tracing: Use hist trigger's var_ref array to destroy var_refs
  net/sonic: Prevent tx watchdog timeout
  net/sonic: Fix CAM initialization
  net/sonic: Fix command register usage
  net/sonic: Quiesce SONIC before re-initializing descriptor memory
  net/sonic: Fix receive buffer replenishment
  net/sonic: Improve receive descriptor status flag check
  net/sonic: Avoid needless receive descriptor EOL flag updates
  net/sonic: Fix receive buffer handling
  net/sonic: Fix interface error stats collection
  net/sonic: Use MMIO accessors
  net/sonic: Clear interrupt flags immediately
  net/sonic: Add mutual exclusion for accessing shared state
  do_last(): fetch directory ->i_mode and ->i_uid before it's too late
  tracing: xen: Ordered comparison of function pointers
  scsi: RDMA/isert: Fix a recently introduced regression related to logout
  hwmon: (nct7802) Fix voltage limits to wrong registers
  netfilter: nft_osf: add missing check for DREG attribute
  Input: sun4i-ts - add a check for devm_thermal_zone_of_sensor_register
  Input: pegasus_notetaker - fix endpoint sanity check
  Input: aiptek - fix endpoint sanity check
  Input: gtco - fix endpoint sanity check
  Input: sur40 - fix interface sanity checks
  Input: pm8xxx-vib - fix handling of separate enable register
  Documentation: Document arm64 kpti control
  mmc: sdhci: fix minimum clock rate for v3 controller
  mmc: tegra: fix SDR50 tuning override
  ARM: 8950/1: ftrace/recordmcount: filter relocation types
  Revert "Input: synaptics-rmi4 - don't increment rmiaddr for SMBus transfers"
  Input: keyspan-remote - fix control-message timeouts
  tracing: trigger: Replace unneeded RCU-list traversals
  PCI: Mark AMD Navi14 GPU rev 0xc5 ATS as broken
  hwmon: (core) Do not use device managed functions for memory allocations
  hwmon: (adt7475) Make volt2reg return same reg as reg2volt input
  afs: Fix characters allowed into cell names
  tun: add mutex_unlock() call and napi.skb clearing in tun_get_user()
  tcp: do not leave dangling pointers in tp->highest_sack
  tcp_bbr: improve arithmetic division in bbr_update_bw()
  Revert "udp: do rmem bulk free even if the rx sk queue is empty"
  net: usb: lan78xx: Add .ndo_features_check
  net-sysfs: Fix reference count leak
  net-sysfs: Call dev_hold always in rx_queue_add_kobject
  net-sysfs: Call dev_hold always in netdev_queue_add_kobject
  net-sysfs: fix netdev_queue_add_kobject() breakage
  net-sysfs: Fix reference count leak in rx|netdev_queue_add_kobject
  net_sched: fix datalen for ematch
  net: rtnetlink: validate IFLA_MTU attribute in rtnl_create_link()
  net, ip_tunnel: fix namespaces move
  net, ip6_tunnel: fix namespaces move
  net: ip6_gre: fix moving ip6gre between namespaces
  net: cxgb3_main: Add CAP_NET_ADMIN check to CHELSIO_GET_MEM
  net: bcmgenet: Use netif_tx_napi_add() for TX NAPI
  ipv6: sr: remove SKB_GSO_IPXIP6 on End.D* actions
  gtp: make sure only SOCK_DGRAM UDP sockets are accepted
  firestream: fix memory leaks
  can, slip: Protect tty->disc_data in write_wakeup and close with RCU
  ANDROID: update abi definitions
  UPSTREAM: staging: most: net: fix buffer overflow
  ANDROID: gki_defconfig: Enable CONFIG_BTT
  ANDROID: gki_defconfig: Temporarily disable CFI
  f2fs: fix race conditions in ->d_compare() and ->d_hash()
  f2fs: fix dcache lookup of !casefolded directories
  f2fs: Add f2fs stats to sysfs
  f2fs: delete duplicate information on sysfs nodes
  f2fs: change to use rwsem for gc_mutex
  f2fs: update f2fs document regarding to fsync_mode
  f2fs: add a way to turn off ipu bio cache
  f2fs: code cleanup for f2fs_statfs_project()
  f2fs: fix miscounted block limit in f2fs_statfs_project()
  f2fs: show the CP_PAUSE reason in checkpoint traces
  f2fs: fix deadlock allocating bio_post_read_ctx from mempool
  f2fs: remove unneeded check for error allocating bio_post_read_ctx
  f2fs: convert inline_dir early before starting rename
  f2fs: fix memleak of kobject
  f2fs: fix to add swap extent correctly
  mm: export add_swap_extent()
  f2fs: run fsck when getting bad inode during GC
  f2fs: support data compression
  f2fs: free sysfs kobject
  f2fs: declare nested quota_sem and remove unnecessary sems
  f2fs: don't put new_page twice in f2fs_rename
  f2fs: set I_LINKABLE early to avoid wrong access by vfs
  f2fs: don't keep META_MAPPING pages used for moving verity file blocks
  f2fs: introduce private bioset
  f2fs: cleanup duplicate stats for atomic files
  f2fs: set GFP_NOFS when moving inline dentries
  f2fs: should avoid recursive filesystem ops
  f2fs: keep quota data on write_begin failure
  f2fs: call f2fs_balance_fs outside of locked page
  f2fs: preallocate DIO blocks when forcing buffered_io
  Linux 4.19.99
  m68k: Call timer_interrupt() with interrupts disabled
  arm64: dts: meson-gxm-khadas-vim2: fix uart_A bluetooth node
  serial: stm32: fix clearing interrupt error flags
  IB/iser: Fix dma_nents type definition
  usb: dwc3: Allow building USB_DWC3_QCOM without EXTCON
  samples/bpf: Fix broken xdp_rxq_info due to map order assumptions
  arm64: dts: juno: Fix UART frequency
  drm/radeon: fix bad DMA from INTERRUPT_CNTL2
  dmaengine: ti: edma: fix missed failure handling
  afs: Remove set but not used variables 'before', 'after'
  affs: fix a memory leak in affs_remount
  mmc: core: fix wl1251 sdio quirks
  mmc: sdio: fix wl1251 vendor id
  i2c: stm32f7: report dma error during probe
  packet: fix data-race in fanout_flow_is_huge()
  net: neigh: use long type to store jiffies delta
  hv_netvsc: flag software created hash value
  MIPS: Loongson: Fix return value of loongson_hwmon_init
  dpaa_eth: avoid timestamp read on error paths
  dpaa_eth: perform DMA unmapping before read
  hwrng: omap3-rom - Fix missing clock by probing with device tree
  drm: panel-lvds: Potential Oops in probe error handling
  afs: Fix large file support
  hv_netvsc: Fix send_table offset in case of a host bug
  hv_netvsc: Fix offset usage in netvsc_send_table()
  net: qca_spi: Move reset_count to struct qcaspi
  afs: Fix missing timeout reset
  bpf, offload: Unlock on error in bpf_offload_dev_create()
  xsk: Fix registration of Rx-only sockets
  net: netem: correct the parent's backlog when corrupted packet was dropped
  net: netem: fix error path for corrupted GSO frames
  arm64: hibernate: check pgd table allocation
  firmware: dmi: Fix unlikely out-of-bounds read in save_mem_devices
  dmaengine: imx-sdma: fix size check for sdma script_number
  vhost/test: stop device before reset
  drm/msm/dsi: Implement reset correctly
  net/smc: receive pending data after RCV_SHUTDOWN
  net/smc: receive returns without data
  tcp: annotate lockless access to tcp_memory_pressure
  net: add {READ|WRITE}_ONCE() annotations on ->rskq_accept_head
  net: avoid possible false sharing in sk_leave_memory_pressure()
  act_mirred: Fix mirred_init_module error handling
  s390/qeth: Fix initialization of vnicc cmd masks during set online
  s390/qeth: Fix error handling during VNICC initialization
  sctp: add chunks to sk_backlog when the newsk sk_socket is not set
  net: stmmac: fix disabling flexible PPS output
  net: stmmac: fix length of PTP clock's name string
  ip6erspan: remove the incorrect mtu limit for ip6erspan
  llc: fix sk_buff refcounting in llc_conn_state_process()
  llc: fix another potential sk_buff leak in llc_ui_sendmsg()
  mac80211: accept deauth frames in IBSS mode
  rxrpc: Fix trace-after-put looking at the put connection record
  net: stmmac: gmac4+: Not all Unicast addresses may be available
  nvme: retain split access workaround for capability reads
  net: sched: cbs: Avoid division by zero when calculating the port rate
  net: ethernet: stmmac: Fix signedness bug in ipq806x_gmac_of_parse()
  net: nixge: Fix a signedness bug in nixge_probe()
  of: mdio: Fix a signedness bug in of_phy_get_and_connect()
  net: axienet: fix a signedness bug in probe
  net: stmmac: dwmac-meson8b: Fix signedness bug in probe
  net: socionext: Fix a signedness bug in ave_probe()
  net: netsec: Fix signedness bug in netsec_probe()
  net: broadcom/bcmsysport: Fix signedness in bcm_sysport_probe()
  net: hisilicon: Fix signedness bug in hix5hd2_dev_probe()
  cxgb4: Signedness bug in init_one()
  net: aquantia: Fix aq_vec_isr_legacy() return value
  iommu/amd: Wait for completion of IOTLB flush in attach_device
  crypto: hisilicon - Matching the dma address for dma_pool_free()
  bpf: fix BTF limits
  powerpc/mm/mce: Keep irqs disabled during lockless page table walk
  clk: actions: Fix factor clk struct member access
  mailbox: qcom-apcs: fix max_register value
  f2fs: fix to avoid accessing uninitialized field of inode page in is_alive()
  bnxt_en: Increase timeout for HWRM_DBG_COREDUMP_XX commands
  um: Fix off by one error in IRQ enumeration
  net/rds: Fix 'ib_evt_handler_call' element in 'rds_ib_stat_names'
  RDMA/cma: Fix false error message
  ath10k: adjust skb length in ath10k_sdio_mbox_rx_packet
  gpio/aspeed: Fix incorrect number of banks
  pinctrl: iproc-gpio: Fix incorrect pinconf configurations
  net: sonic: replace dev_kfree_skb in sonic_send_packet
  hwmon: (shtc1) fix shtc1 and shtw1 id mask
  ixgbe: sync the first fragment unconditionally
  btrfs: use correct count in btrfs_file_write_iter()
  Btrfs: fix inode cache waiters hanging on path allocation failure
  Btrfs: fix inode cache waiters hanging on failure to start caching thread
  Btrfs: fix hang when loading existing inode cache off disk
  scsi: fnic: fix msix interrupt allocation
  f2fs: fix error path of f2fs_convert_inline_page()
  f2fs: fix wrong error injection path in inc_valid_block_count()
  ARM: dts: logicpd-som-lv: Fix i2c2 and i2c3 Pin mux
  rtlwifi: Fix file release memory leak
  net: hns3: fix error VF index when setting VLAN offload
  net: sonic: return NETDEV_TX_OK if failed to map buffer
  led: triggers: Fix dereferencing of null pointer
  xsk: avoid store-tearing when assigning umem
  xsk: avoid store-tearing when assigning queues
  ARM: dts: aspeed-g5: Fixe gpio-ranges upper limit
  tty: serial: fsl_lpuart: Use appropriate lpuart32_* I/O funcs
  wcn36xx: use dynamic allocation for large variables
  ath9k: dynack: fix possible deadlock in ath_dynack_node_{de}init
  netfilter: ctnetlink: honor IPS_OFFLOAD flag
  iio: dac: ad5380: fix incorrect assignment to val
  bcache: Fix an error code in bch_dump_read()
  usb: typec: tps6598x: Fix build error without CONFIG_REGMAP_I2C
  bcma: fix incorrect update of BCMA_CORE_PCI_MDIO_DATA
  irqdomain: Add the missing assignment of domain->fwnode for named fwnode
  staging: greybus: light: fix a couple double frees
  x86, perf: Fix the dependency of the x86 insn decoder selftest
  power: supply: Init device wakeup after device_add()
  net/sched: cbs: Set default link speed to 10 Mbps in cbs_set_port_rate
  hwmon: (lm75) Fix write operations for negative temperatures
  Partially revert "kfifo: fix kfifo_alloc() and kfifo_init()"
  rxrpc: Fix lack of conn cleanup when local endpoint is cleaned up [ver #2]
  ahci: Do not export local variable ahci_em_messages
  iommu/mediatek: Fix iova_to_phys PA start for 4GB mode
  media: em28xx: Fix exception handling in em28xx_alloc_urbs()
  mips: avoid explicit UB in assignment of mips_io_port_base
  rtc: pcf2127: bugfix: read rtc disables watchdog
  ARM: 8896/1: VDSO: Don't leak kernel addresses
  media: atmel: atmel-isi: fix timeout value for stop streaming
  i40e: reduce stack usage in i40e_set_fc
  mac80211: minstrel_ht: fix per-group max throughput rate initialization
  rtc: rv3029: revert error handling patch to rv3029_eeprom_write()
  dmaengine: dw: platform: Switch to acpi_dma_controller_register()
  ASoC: sun4i-i2s: RX and TX counter registers are swapped
  powerpc/64s/radix: Fix memory hot-unplug page table split
  signal: Allow cifs and drbd to receive their terminating signals
  bnxt_en: Fix handling FRAG_ERR when NVM_INSTALL_UPDATE cmd fails
  drm: rcar-du: lvds: Fix bridge_to_rcar_lvds
  tools: bpftool: fix format strings and arguments for jsonw_printf()
  tools: bpftool: fix arguments for p_err() in do_event_pipe()
  net/rds: Add a few missing rds_stat_names entries
  ASoC: wm8737: Fix copy-paste error in wm8737_snd_controls
  ASoC: cs4349: Use PM ops 'cs4349_runtime_pm'
  ASoC: es8328: Fix copy-paste error in es8328_right_line_controls
  RDMA/hns: bugfix for slab-out-of-bounds when loading hip08 driver
  RDMA/hns: Bugfix for slab-out-of-bounds when unloading hip08 driver
  ext4: set error return correctly when ext4_htree_store_dirent fails
  crypto: caam - free resources in case caam_rng registration failed
  cxgb4: smt: Add lock for atomic_dec_and_test
  spi: bcm-qspi: Fix BSPI QUAD and DUAL mode support when using flex mode
  net: fix bpf_xdp_adjust_head regression for generic-XDP
  iio: tsl2772: Use devm_add_action_or_reset for tsl2772_chip_off
  cifs: fix rmmod regression in cifs.ko caused by force_sig changes
  net/mlx5: Fix mlx5_ifc_query_lag_out_bits
  ARM: dts: stm32: add missing vdda-supply to adc on stm32h743i-eval
  tipc: reduce risk of wakeup queue starvation
  arm64: dts: renesas: r8a77995: Fix register range of display node
  ALSA: aoa: onyx: always initialize register read value
  crypto: ccp - Reduce maximum stack usage
  x86/kgbd: Use NMI_VECTOR not APIC_DM_NMI
  mic: avoid statically declaring a 'struct device'.
  media: rcar-vin: Clean up correct notifier in error path
  usb: host: xhci-hub: fix extra endianness conversion
  qed: reduce maximum stack frame size
  libertas_tf: Use correct channel range in lbtf_geo_init
  PM: sleep: Fix possible overflow in pm_system_cancel_wakeup()
  clk: sunxi-ng: v3s: add the missing PLL_DDR1
  drm/panel: make drm_panel.h self-contained
  xfrm interface: ifname may be wrong in logs
  scsi: libfc: fix null pointer dereference on a null lport
  ARM: stm32: use "depends on" instead of "if" after prompt
  xdp: fix possible cq entry leak
  x86/pgtable/32: Fix LOWMEM_PAGES constant
  net/tls: fix socket wmem accounting on fallback with netem
  net: pasemi: fix an use-after-free in pasemi_mac_phy_init()
  ceph: fix "ceph.dir.rctime" vxattr value
  PCI: mobiveil: Fix the valid check for inbound and outbound windows
  PCI: mobiveil: Fix devfn check in mobiveil_pcie_valid_device()
  PCI: mobiveil: Remove the flag MSI_FLAG_MULTI_PCI_MSI
  RDMA/hns: Fixs hw access invalid dma memory error
  fsi: sbefifo: Don't fail operations when in SBE IPL state
  devres: allow const resource arguments
  fsi/core: Fix error paths on CFAM init
  ACPI: PM: Introduce "poweroff" callbacks for ACPI PM domain and LPSS
  ACPI: PM: Simplify and fix PM domain hibernation callbacks
  PM: ACPI/PCI: Resume all devices during hibernation
  um: Fix IRQ controller regression on console read
  xprtrdma: Fix use-after-free in rpcrdma_post_recvs
  rxrpc: Fix uninitialized error code in rxrpc_send_data_packet()
  mfd: intel-lpss: Release IDA resources
  iommu/amd: Make iommu_disable safer
  bnxt_en: Suppress error messages when querying DSCP DCB capabilities.
  bnxt_en: Fix ethtool selftest crash under error conditions.
  fork,memcg: alloc_thread_stack_node needs to set tsk->stack
  backlight: pwm_bl: Fix heuristic to determine number of brightness levels
  tools: bpftool: use correct argument in cgroup errors
  nvmem: imx-ocotp: Change TIMING calculation to u-boot algorithm
  nvmem: imx-ocotp: Ensure WAIT bits are preserved when setting timing
  clk: qcom: Fix -Wunused-const-variable
  dmaengine: hsu: Revert "set HSU_CH_MTSR to memory width"
  perf/ioctl: Add check for the sample_period value
  ip6_fib: Don't discard nodes with valid routing information in fib6_locate_1()
  drm/msm/a3xx: remove TPL1 regs from snapshot
  arm64: dts: allwinner: h6: Pine H64: Add interrupt line for RTC
  net/sched: cbs: Fix error path of cbs_module_init
  ARM: dts: iwg20d-q7-common: Fix SDHI1 VccQ regularor
  rtc: pcf8563: Clear event flags and disable interrupts before requesting irq
  rtc: pcf8563: Fix interrupt trigger method
  ASoC: ti: davinci-mcasp: Fix slot mask settings when using multiple AXRs
  net/af_iucv: always register net_device notifier
  net/af_iucv: build proper skbs for HiperTransport
  net/udp_gso: Allow TX timestamp with UDP GSO
  net: netem: fix backlog accounting for corrupted GSO frames
  drm/msm/mdp5: Fix mdp5_cfg_init error return
  IB/hfi1: Handle port down properly in pio
  bpf: fix the check that forwarding is enabled in bpf_ipv6_fib_lookup
  powerpc/pseries/mobility: rebuild cacheinfo hierarchy post-migration
  powerpc/cacheinfo: add cacheinfo_teardown, cacheinfo_rebuild
  qed: iWARP - fix uninitialized callback
  qed: iWARP - Use READ_ONCE and smp_store_release to access ep->state
  ASoC: meson: axg-tdmout: right_j is not supported
  ASoC: meson: axg-tdmin: right_j is not supported
  ntb_hw_switchtec: potential shift wrapping bug in switchtec_ntb_init_sndev()
  firmware: arm_scmi: update rate_discrete in clock_describe_rates_get
  firmware: arm_scmi: fix bitfield definitions for SENSOR_DESC attributes
  phy: usb: phy-brcm-usb: Remove sysfs attributes upon driver removal
  iommu/vt-d: Duplicate iommu_resv_region objects per device list
  arm64: dts: meson-gxm-khadas-vim2: fix Bluetooth support
  arm64: dts: meson-gxm-khadas-vim2: fix gpio-keys-polled node
  serial: stm32: fix a recursive locking in stm32_config_rs485
  mpls: fix warning with multi-label encap
  arm64: dts: renesas: ebisu: Remove renesas, no-ether-link property
  crypto: inside-secure - fix queued len computation
  crypto: inside-secure - fix zeroing of the request in ahash_exit_inv
  media: vivid: fix incorrect assignment operation when setting video mode
  clk: sunxi-ng: sun50i-h6-r: Fix incorrect W1 clock gate register
  cpufreq: brcmstb-avs-cpufreq: Fix types for voltage/frequency
  cpufreq: brcmstb-avs-cpufreq: Fix initial command check
  phy: qcom-qusb2: fix missing assignment of ret when calling clk_prepare_enable
  net: don't clear sock->sk early to avoid trouble in strparser
  RDMA/uverbs: check for allocation failure in uapi_add_elm()
  net: core: support XDP generic on stacked devices.
  netvsc: unshare skb in VF rx handler
  crypto: talitos - fix AEAD processing.
  net: hns3: fix a memory leak issue for hclge_map_unmap_ring_to_vf_vector
  inet: frags: call inet_frags_fini() after unregister_pernet_subsys()
  signal/cifs: Fix cifs_put_tcp_session to call send_sig instead of force_sig
  signal/bpfilter: Fix bpfilter_kernl to use send_sig not force_sig
  iommu: Use right function to get group for device
  iommu: Add missing new line for dma type
  misc: sgi-xp: Properly initialize buf in xpc_get_rsvd_page_pa
  serial: stm32: fix wakeup source initialization
  serial: stm32: Add support of TC bit status check
  serial: stm32: fix transmit_chars when tx is stopped
  serial: stm32: fix rx data length when parity enabled
  serial: stm32: fix rx error handling
  serial: stm32: fix word length configuration
  crypto: ccp - Fix 3DES complaint from ccp-crypto module
  crypto: ccp - fix AES CFB error exposed by new test vectors
  spi: spi-fsl-spi: call spi_finalize_current_message() at the end
  RDMA/qedr: Fix incorrect device rate.
  arm64: dts: meson: libretech-cc: set eMMC as removable
  dmaengine: tegra210-adma: Fix crash during probe
  clk: meson: axg: spread spectrum is on mpll2
  clk: meson: gxbb: no spread spectrum on mpll0
  ARM: dts: sun8i-h3: Fix wifi in Beelink X2 DT
  afs: Fix double inc of vnode->cb_break
  afs: Fix lock-wait/callback-break double locking
  afs: Don't invalidate callback if AFS_VNODE_DIR_VALID not set
  afs: Fix key leak in afs_release() and afs_evict_inode()
  EDAC/mc: Fix edac_mc_find() in case no device is found
  thermal: cpu_cooling: Actually trace CPU load in thermal_power_cpu_get_power
  thermal: rcar_gen3_thermal: fix interrupt type
  backlight: lm3630a: Return 0 on success in update_status functions
  netfilter: nf_tables: correct NFT_LOGLEVEL_MAX value
  kdb: do a sanity check on the cpu in kdb_per_cpu()
  nfp: bpf: fix static check error through tightening shift amount adjustment
  ARM: riscpc: fix lack of keyboard interrupts after irq conversion
  pwm: meson: Don't disable PWM when setting duty repeatedly
  pwm: meson: Consider 128 a valid pre-divider
  netfilter: ebtables: CONFIG_COMPAT: reject trailing data after last rule
  crypto: caam - fix caam_dump_sg that iterates through scatterlist
  platform/x86: alienware-wmi: printing the wrong error code
  media: davinci/vpbe: array underflow in vpbe_enum_outputs()
  media: omap_vout: potential buffer overflow in vidioc_dqbuf()
  ALSA: aica: Fix a long-time build breakage
  l2tp: Fix possible NULL pointer dereference
  vfio/mdev: Fix aborting mdev child device removal if one fails
  vfio/mdev: Follow correct remove sequence
  vfio/mdev: Avoid release parent reference during error path
  afs: Fix the afs.cell and afs.volume xattr handlers
  ath10k: Fix encoding for protected management frames
  lightnvm: pblk: fix lock order in pblk_rb_tear_down_check
  mmc: core: fix possible use after free of host
  watchdog: rtd119x_wdt: Fix remove function
  dmaengine: tegra210-adma: restore channel status
  net: ena: fix ena_com_fill_hash_function() implementation
  net: ena: fix incorrect test of supported hash function
  net: ena: fix: Free napi resources when ena_up() fails
  net: ena: fix swapped parameters when calling ena_com_indirect_table_fill_entry
  iommu/vt-d: Make kernel parameter igfx_off work with vIOMMU
  RDMA/rxe: Consider skb reserve space based on netdev of GID
  IB/mlx5: Add missing XRC options to QP optional params mask
  dwc2: gadget: Fix completed transfer size calculation in DDMA
  usb: gadget: fsl: fix link error against usb-gadget module
  ASoC: fix valid stream condition
  packet: in recvmsg msg_name return at least sizeof sockaddr_ll
  ARM: dts: logicpd-som-lv: Fix MMC1 card detect
  PCI: iproc: Enable iProc config read for PAXBv2
  netfilter: nft_flow_offload: add entry to flowtable after confirmation
  KVM: PPC: Book3S HV: Fix lockdep warning when entering the guest
  scsi: qla2xxx: Avoid that qlt_send_resp_ctio() corrupts memory
  scsi: qla2xxx: Fix error handling in qlt_alloc_qfull_cmd()
  scsi: qla2xxx: Fix a format specifier
  irqchip/gic-v3-its: fix some definitions of inner cacheability attributes
  s390/kexec_file: Fix potential segment overlap in ELF loader
  coresight: catu: fix clang build warning
  NFS: Don't interrupt file writeout due to fatal errors
  afs: Further fix file locking
  afs: Fix AFS file locking to allow fine grained locks
  ALSA: usb-audio: Handle the error from snd_usb_mixer_apply_create_quirk()
  dmaengine: axi-dmac: Don't check the number of frames for alignment
  6lowpan: Off by one handling ->nexthdr
  media: ov2659: fix unbalanced mutex_lock/unlock
  ARM: dts: ls1021: Fix SGMII PCS link remaining down after PHY disconnect
  powerpc: vdso: Make vdso32 installation conditional in vdso_install
  net: hns3: fix loop condition of hns3_get_tx_timeo_queue_info()
  selftests/ipc: Fix msgque compiler warnings
  usb: typec: tcpm: Notify the tcpc to start connection-detection for SRPs
  tipc: set sysctl_tipc_rmem and named_timeout right range
  platform/x86: alienware-wmi: fix kfree on potentially uninitialized pointer
  soc: amlogic: meson-gx-pwrc-vpu: Fix power on/off register bitmask
  PCI: dwc: Fix dw_pcie_ep_find_capability() to return correct capability offset
  staging: android: vsoc: fix copy_from_user overrun
  perf/core: Fix the address filtering fix
  hwmon: (w83627hf) Use request_muxed_region for Super-IO accesses
  net: hns3: fix for vport->bw_limit overflow problem
  PCI: rockchip: Fix rockchip_pcie_ep_assert_intx() bitwise operations
  ARM: pxa: ssp: Fix "WARNING: invalid free of devm_ allocated data"
  brcmfmac: fix leak of mypkt on error return path
  scsi: target/core: Fix a race condition in the LUN lookup code
  rxrpc: Fix detection of out of order acks
  firmware: arm_scmi: fix of_node leak in scmi_mailbox_check
  ACPI: button: reinitialize button state upon resume
  clk: qcom: Skip halt checks on gcc_pcie_0_pipe_clk for 8998
  net/sched: cbs: fix port_rate miscalculation
  of: use correct function prototype for of_overlay_fdt_apply()
  scsi: qla2xxx: Unregister chrdev if module initialization fails
  drm/vmwgfx: Remove set but not used variable 'restart'
  bpf: Add missed newline in verifier verbose log
  ehea: Fix a copy-paste err in ehea_init_port_res
  rtc: mt6397: Don't call irq_dispose_mapping.
  rtc: Fix timestamp value for RTC_TIMESTAMP_BEGIN_1900
  arm64/vdso: don't leak kernel addresses
  drm/fb-helper: generic: Call drm_client_add() after setup is done
  spi: bcm2835aux: fix driver to not allow 65535 (=-1) cs-gpios
  soc/fsl/qe: Fix an error code in qe_pin_request()
  bus: ti-sysc: Fix sysc_unprepare() when no clocks have been allocated
  spi: tegra114: configure dma burst size to fifo trig level
  spi: tegra114: flush fifos
  spi: tegra114: terminate dma and reset on transfer timeout
  spi: tegra114: fix for unpacked mode transfers
  spi: tegra114: clear packed bit for unpacked mode
  media: tw5864: Fix possible NULL pointer dereference in tw5864_handle_frame
  media: davinci-isif: avoid uninitialized variable use
  soc: qcom: cmd-db: Fix an error code in cmd_db_dev_probe()
  net: dsa: Avoid null pointer when failing to connect to PHY
  ARM: OMAP2+: Fix potentially uninitialized return value for _setup_reset()
  net: phy: don't clear BMCR in genphy_soft_reset
  ARM: dts: sun9i: optimus: Fix fixed-regulators
  arm64: dts: allwinner: a64: Add missing PIO clocks
  ARM: dts: sun8i: a33: Reintroduce default pinctrl muxing
  m68k: mac: Fix VIA timer counter accesses
  tipc: tipc clang warning
  jfs: fix bogus variable self-initialization
  crypto: ccree - reduce kernel stack usage with clang
  regulator: tps65086: Fix tps65086_ldoa1_ranges for selector 0xB
  media: cx23885: check allocation return
  media: wl128x: Fix an error code in fm_download_firmware()
  media: cx18: update *pos correctly in cx18_read_pos()
  media: ivtv: update *pos correctly in ivtv_read_pos()
  soc: amlogic: gx-socinfo: Add mask for each SoC packages
  regulator: lp87565: Fix missing register for LP87565_BUCK_0
  net: sh_eth: fix a missing check of of_get_phy_mode
  net/mlx5e: IPoIB, Fix RX checksum statistics update
  net/mlx5: Fix multiple updates of steering rules in parallel
  xen, cpu_hotplug: Prevent an out of bounds access
  drivers/rapidio/rio_cm.c: fix potential oops in riocm_ch_listen()
  nfp: fix simple vNIC mailbox length
  scsi: megaraid_sas: reduce module load time
  x86/mm: Remove unused variable 'cpu'
  nios2: ksyms: Add missing symbol exports
  PCI: Fix "try" semantics of bus and slot reset
  rbd: clear ->xferred on error from rbd_obj_issue_copyup()
  media: dvb/earth-pt1: fix wrong initialization for demod blocks
  powerpc/mm: Check secondary hash page table
  net: aquantia: fixed instack structure overflow
  NFSv4/flexfiles: Fix invalid deref in FF_LAYOUT_DEVID_NODE()
  NFS: Add missing encode / decode sequence_maxsz to v4.2 operations
  iommu/vt-d: Fix NULL pointer reference in intel_svm_bind_mm()
  hwrng: bcm2835 - fix probe as platform device
  net: sched: act_csum: Fix csum calc for tagged packets
  netfilter: nft_set_hash: bogus element self comparison from deactivation path
  netfilter: nft_set_hash: fix lookups with fixed size hash on big endian
  ath10k: Fix length of wmi tlv command for protected mgmt frames
  regulator: wm831x-dcdc: Fix list of wm831x_dcdc_ilim from mA to uA
  ARM: 8849/1: NOMMU: Fix encodings for PMSAv8's PRBAR4/PRLAR4
  ARM: 8848/1: virt: Align GIC version check with arm64 counterpart
  ARM: 8847/1: pm: fix HYP/SVC mode mismatch when MCPM is used
  iommu: Fix IOMMU debugfs fallout
  mmc: sdhci-brcmstb: handle mmc_of_parse() errors during probe
  NFS/pnfs: Bulk destroy of layouts needs to be safe w.r.t. umount
  platform/x86: wmi: fix potential null pointer dereference
  clocksource/drivers/exynos_mct: Fix error path in timer resources initialization
  clocksource/drivers/sun5i: Fail gracefully when clock rate is unavailable
  perf, pt, coresight: Fix address filters for vmas with non-zero offset
  perf: Copy parent's address filter offsets on clone
  NFS: Fix a soft lockup in the delegation recovery code
  powerpc/64s: Fix logic when handling unknown CPU features
  staging: rtlwifi: Use proper enum for return in halmac_parse_psd_data_88xx
  fs/nfs: Fix nfs_parse_devname to not modify it's argument
  net: dsa: fix unintended change of bridge interface STP state
  ASoC: qcom: Fix of-node refcount unbalance in apq8016_sbc_parse_of()
  driver core: Fix PM-runtime for links added during consumer probe
  drm/nouveau: fix missing break in switch statement
  drm/nouveau/pmu: don't print reply values if exec is false
  drm/nouveau/bios/ramcfg: fix missing parentheses when calculating RON
  net/mlx5: Delete unused FPGA QPN variable
  net: dsa: qca8k: Enable delay for RGMII_ID mode
  regulator: pv88090: Fix array out-of-bounds access
  regulator: pv88080: Fix array out-of-bounds access
  regulator: pv88060: Fix array out-of-bounds access
  brcmfmac: create debugfs files for bus-specific layer
  cdc-wdm: pass return value of recover_from_urb_loss
  dmaengine: mv_xor: Use correct device for DMA API
  staging: r8822be: check kzalloc return or bail
  KVM: PPC: Release all hardware TCE tables attached to a group
  mdio_bus: Fix PTR_ERR() usage after initialization to constant
  hwmon: (pmbus/tps53679) Fix driver info initialization in probe routine
  vfio_pci: Enable memory accesses before calling pci_map_rom
  media: sh: migor: Include missing dma-mapping header
  mt76: usb: fix possible memory leak in mt76u_buf_free
  net: dsa: b53: Do not program CPU port's PVID
  net: dsa: b53: Properly account for VLAN filtering
  net: dsa: b53: Fix default VLAN ID
  keys: Timestamp new keys
  block: don't use bio->bi_vcnt to figure out segment number
  usb: phy: twl6030-usb: fix possible use-after-free on remove
  PCI: endpoint: functions: Use memcpy_fromio()/memcpy_toio()
  driver core: Fix possible supplier PM-usage counter imbalance
  RDMA/mlx5: Fix memory leak in case we fail to add an IB device
  pinctrl: sh-pfc: sh73a0: Fix fsic_spdif pin groups
  pinctrl: sh-pfc: r8a7792: Fix vin1_data18_b pin group
  pinctrl: sh-pfc: r8a7791: Fix scifb2_data_c pin group
  pinctrl: sh-pfc: emev2: Add missing pinmux functions
  ntb_hw_switchtec: NT req id mapping table register entry number should be 512
  ntb_hw_switchtec: debug print 64bit aligned crosslink BAR Numbers
  drm/etnaviv: potential NULL dereference
  xsk: add missing smp_rmb() in xsk_mmap
  ipmi: kcs_bmc: handle devm_kasprintf() failure case
  iw_cxgb4: use tos when finding ipv6 routes
  iw_cxgb4: use tos when importing the endpoint
  fbdev: chipsfb: remove set but not used variable 'size'
  rtc: pm8xxx: fix unintended sign extension
  rtc: 88pm80x: fix unintended sign extension
  rtc: 88pm860x: fix unintended sign extension
  net/smc: original socket family in inet_sock_diag
  rtc: ds1307: rx8130: Fix alarm handling
  net: phy: fixed_phy: Fix fixed_phy not checking GPIO
  ath10k: fix dma unmap direction for management frames
  arm64: dts: msm8916: remove bogus argument to the cpu clock
  thermal: mediatek: fix register index error
  rtc: ds1672: fix unintended sign extension
  clk: ingenic: jz4740: Fix gating of UDC clock
  staging: most: cdev: add missing check for cdev_add failure
  iwlwifi: mvm: fix RSS config command
  drm/xen-front: Fix mmap attributes for display buffers
  ARM: dts: lpc32xx: phy3250: fix SD card regulator voltage
  ARM: dts: lpc32xx: fix ARM PrimeCell LCD controller clocks property
  ARM: dts: lpc32xx: fix ARM PrimeCell LCD controller variant
  ARM: dts: lpc32xx: reparent keypad controller to SIC1
  ARM: dts: lpc32xx: add required clocks property to keypad device node
  driver core: Do not call rpm_put_suppliers() in pm_runtime_drop_link()
  driver core: Fix handling of runtime PM flags in device_link_add()
  driver core: Do not resume suppliers under device_links_write_lock()
  driver core: Avoid careless re-use of existing device links
  driver core: Fix DL_FLAG_AUTOREMOVE_SUPPLIER device link flag handling
  crypto: crypto4xx - Fix wrong ppc4xx_trng_probe()/ppc4xx_trng_remove() arguments
  driver: uio: fix possible use-after-free in __uio_register_device
  driver: uio: fix possible memory leak in __uio_register_device
  tty: ipwireless: Fix potential NULL pointer dereference
  bus: ti-sysc: Fix timer handling with drop pm_runtime_irq_safe()
  iwlwifi: mvm: fix A-MPDU reference assignment
  arm64: dts: allwinner: h6: Move GIC device node fix base address ordering
  ip_tunnel: Fix route fl4 init in ip_md_tunnel_xmit
  net/mlx5: Take lock with IRQs disabled to avoid deadlock
  iwlwifi: mvm: avoid possible access out of array.
  clk: sunxi-ng: sun8i-a23: Enable PLL-MIPI LDOs when ungating it
  ARM: dts: sun8i-a23-a33: Move NAND controller device node to sort by address
  net: hns3: fix bug of ethtool_ops.get_channels for VF
  spi/topcliff_pch: Fix potential NULL dereference on allocation error
  rtc: cmos: ignore bogus century byte
  IB/mlx5: Don't override existing ip_protocol
  media: tw9910: Unregister subdevice with v4l2-async
  net: hns3: fix wrong combined count returned by ethtool -l
  IB/iser: Pass the correct number of entries for dma mapped SGL
  ASoC: imx-sgtl5000: put of nodes if finding codec fails
  crypto: tgr192 - fix unaligned memory access
  crypto: brcm - Fix some set-but-not-used warning
  kbuild: mark prepare0 as PHONY to fix external module build
  media: s5p-jpeg: Correct step and max values for V4L2_CID_JPEG_RESTART_INTERVAL
  drm/etnaviv: NULL vs IS_ERR() buf in etnaviv_core_dump()
  memory: tegra: Don't invoke Tegra30+ specific memory timing setup on Tegra20
  net: phy: micrel: set soft_reset callback to genphy_soft_reset for KSZ9031
  RDMA/iw_cxgb4: Fix the unchecked ep dereference
  spi: cadence: Correct initialisation of runtime PM
  arm64: dts: apq8016-sbc: Increase load on l11 for SDCARD
  drm/shmob: Fix return value check in shmob_drm_probe
  RDMA/qedr: Fix out of bounds index check in query pkey
  RDMA/ocrdma: Fix out of bounds index check in query pkey
  IB/usnic: Fix out of bounds index check in query pkey
  fork, memcg: fix cached_stacks case
  drm/fb-helper: generic: Fix setup error path
  drm/etnaviv: fix some off by one bugs
  ARM: dts: r8a7743: Remove generic compatible string from iic3
  drm: Fix error handling in drm_legacy_addctx
  remoteproc: qcom: q6v5-mss: Add missing regulator for MSM8996
  remoteproc: qcom: q6v5-mss: Add missing clocks for MSM8996
  arm64: defconfig: Re-enable bcm2835-thermal driver
  MIPS: BCM63XX: drop unused and broken DSP platform device
  clk: dove: fix refcount leak in dove_clk_init()
  clk: mv98dx3236: fix refcount leak in mv98dx3236_clk_init()
  clk: armada-xp: fix refcount leak in axp_clk_init()
  clk: kirkwood: fix refcount leak in kirkwood_clk_init()
  clk: armada-370: fix refcount leak in a370_clk_init()
  clk: vf610: fix refcount leak in vf610_clocks_init()
  clk: imx7d: fix refcount leak in imx7d_clocks_init()
  clk: imx6sx: fix refcount leak in imx6sx_clocks_init()
  clk: imx6q: fix refcount leak in imx6q_clocks_init()
  clk: samsung: exynos4: fix refcount leak in exynos4_get_xom()
  clk: socfpga: fix refcount leak
  clk: ti: fix refcount leak in ti_dt_clocks_register()
  clk: qoriq: fix refcount leak in clockgen_init()
  clk: highbank: fix refcount leak in hb_clk_init()
  fork,memcg: fix crash in free_thread_stack on memcg charge fail
  Input: nomadik-ske-keypad - fix a loop timeout test
  vxlan: changelink: Fix handling of default remotes
  net: hns3: fix error handling int the hns3_get_vector_ring_chain
  pinctrl: sh-pfc: sh7734: Remove bogus IPSR10 value
  pinctrl: sh-pfc: sh7269: Add missing PCIOR0 field
  pinctrl: sh-pfc: r8a77995: Remove bogus SEL_PWM[0-3]_3 configurations
  pinctrl: sh-pfc: sh7734: Add missing IPSR11 field
  pinctrl: sh-pfc: r8a77980: Add missing MOD_SEL0 field
  pinctrl: sh-pfc: r8a77970: Add missing MOD_SEL0 field
  pinctrl: sh-pfc: r8a7794: Remove bogus IPSR9 field
  pinctrl: sh-pfc: sh73a0: Add missing TO pin to tpu4_to3 group
  pinctrl: sh-pfc: r8a7791: Remove bogus marks from vin1_b_data18 group
  pinctrl: sh-pfc: r8a7791: Remove bogus ctrl marks from qspi_data4_b group
  pinctrl: sh-pfc: r8a7740: Add missing LCD0 marks to lcd0_data24_1 group
  pinctrl: sh-pfc: r8a7740: Add missing REF125CK pin to gether_gmii group
  ipv6: add missing tx timestamping on IPPROTO_RAW
  switchtec: Remove immediate status check after submitting MRPC command
  staging: bcm2835-camera: fix module autoloading
  staging: bcm2835-camera: Abort probe if there is no camera
  mailbox: ti-msgmgr: Off by one in ti_msgmgr_of_xlate()
  IB/rxe: Fix incorrect cache cleanup in error flow
  OPP: Fix missing debugfs supply directory for OPPs
  IB/hfi1: Correctly process FECN and BECN in packets
  net: phy: Fix not to call phy_resume() if PHY is not attached
  arm64: dts: renesas: r8a7795-es1: Add missing power domains to IPMMU nodes
  arm64: dts: meson-gx: Add hdmi_5v regulator as hdmi tx supply
  drm/dp_mst: Skip validating ports during destruction, just ref
  net: always initialize pagedlen
  drm: rcar-du: Fix vblank initialization
  drm: rcar-du: Fix the return value in case of error in 'rcar_du_crtc_set_crc_source()'
  exportfs: fix 'passing zero to ERR_PTR()' warning
  bus: ti-sysc: Add mcasp optional clocks flag
  pinctrl: meson-gxl: remove invalid GPIOX tsin_a pins
  ASoC: sun8i-codec: add missing route for ADC
  pcrypt: use format specifier in kobject_add
  ARM: dts: bcm283x: Correct mailbox register sizes
  ASoC: wm97xx: fix uninitialized regmap pointer problem
  NTB: ntb_hw_idt: replace IS_ERR_OR_NULL with regular NULL checks
  mlxsw: spectrum: Set minimum shaper on MC TCs
  mlxsw: reg: QEEC: Add minimum shaper fields
  net: hns3: add error handler for hns3_nic_init_vector_data()
  drm/sun4i: hdmi: Fix double flag assignation
  net: socionext: Add dummy PHY register read in phy_write()
  tipc: eliminate message disordering during binding table update
  powerpc/kgdb: add kgdb_arch_set/remove_breakpoint()
  netfilter: nf_flow_table: do not remove offload when other netns's interface is down
  RDMA/bnxt_re: Add missing spin lock initialization
  rtlwifi: rtl8821ae: replace _rtl8821ae_mrate_idx_to_arfr_id with generic version
  powerpc/pseries/memory-hotplug: Fix return value type of find_aa_index
  pwm: lpss: Release runtime-pm reference from the driver's remove callback
  netfilter: nft_osf: usage from output path is not valid
  staging: comedi: ni_mio_common: protect register write overflow
  iwlwifi: nvm: get num of hw addresses from firmware
  ALSA: usb-audio: update quirk for B&W PX to remove microphone
  of: Fix property name in of_node_get_device_type
  drm/msm: fix unsigned comparison with less than zero
  mei: replace POLL* with EPOLL* for write queues.
  cfg80211: regulatory: make initialization more robust
  usb: gadget: fsl_udc_core: check allocation return value and cleanup on failure
  usb: dwc3: add EXTCON dependency for qcom
  genirq/debugfs: Reinstate full OF path for domain name
  IB/hfi1: Add mtu check for operational data VLs
  IB/rxe: replace kvfree with vfree
  mailbox: mediatek: Add check for possible failure of kzalloc
  ASoC: wm9712: fix unused variable warning
  signal/ia64: Use the force_sig(SIGSEGV,...) in ia64_rt_sigreturn
  signal/ia64: Use the generic force_sigsegv in setup_frame
  drm/hisilicon: hibmc: Don't overwrite fb helper surface depth
  bridge: br_arp_nd_proxy: set icmp6_router if neigh has NTF_ROUTER
  PCI: iproc: Remove PAXC slot check to allow VF support
  firmware: coreboot: Let OF core populate platform device
  ARM: qcom_defconfig: Enable MAILBOX
  apparmor: don't try to replace stale label in ptrace access check
  ALSA: hda: fix unused variable warning
  apparmor: Fix network performance issue in aa_label_sk_perm
  iio: fix position relative kernel version
  drm/virtio: fix bounds check in virtio_gpu_cmd_get_capset()
  ixgbe: don't clear IPsec sa counters on HW clearing
  ARM: dts: at91: nattis: make the SD-card slot work
  ARM: dts: at91: nattis: set the PRLUD and HIPOW signals low
  drm/sti: do not remove the drm_bridge that was never added
  ipmi: Fix memory leak in __ipmi_bmc_register
  watchdog: sprd: Fix the incorrect pointer getting from driver data
  soc: aspeed: Fix snoop_file_poll()'s return type
  perf map: No need to adjust the long name of modules
  crypto: sun4i-ss - fix big endian issues
  mt7601u: fix bbp version check in mt7601u_wait_bbp_ready
  tipc: fix wrong timeout input for tipc_wait_for_cond()
  tipc: update mon's self addr when node addr generated
  powerpc/archrandom: fix arch_get_random_seed_int()
  powerpc/pseries: Enable support for ibm,drc-info property
  SUNRPC: Fix svcauth_gss_proxy_init()
  mfd: intel-lpss: Add default I2C device properties for Gemini Lake
  i2c: i2c-stm32f7: fix 10-bits check in slave free id search loop
  i2c: stm32f7: rework slave_id allocation
  xfs: Sanity check flags of Q_XQUOTARM call
  Revert "efi: Fix debugobjects warning on 'efi_rts_work'"
  FROMGIT: ext4: Add EXT4_IOC_FSGETXATTR/EXT4_IOC_FSSETXATTR to compat_ioctl.
  ANDROID: gki_defconfig: Set IKHEADERS back to =m
  ANDROID: gki_defconfig: enable NVDIMM/PMEM options
  UPSTREAM: virtio-pmem: Add virtio pmem driver
  UPSTREAM: libnvdimm: nd_region flush callback support
  UPSTREAM: libnvdimm/of_pmem: Provide a unique name for bus provider
  UPSTREAM: libnvdimm/of_pmem: Fix platform_no_drv_owner.cocci warnings
  ANDROID: x86: gki_defconfig: enable LTO and CFI
  ANDROID: x86: map CFI jump tables in pti_clone_entry_text
  ANDROID: BACKPORT: x86, module: Ignore __typeid__ relocations
  ANDROID: BACKPORT: x86, relocs: Ignore __typeid__ relocations
  ANDROID: BACKPORT: x86/extable: Do not mark exception callback as CFI
  FROMLIST: crypto, x86/sha: Eliminate casts on asm implementations
  UPSTREAM: crypto: x86 - Rename functions to avoid conflict with crypto/sha256.h
  UPSTREAM: x86/vmlinux: Actually use _etext for the end of the text segment
  ANDROID: update ABI following inline crypto changes
  ANDROID: gki_defconfig: enable dm-default-key
  ANDROID: dm: add dm-default-key target for metadata encryption
  ANDROID: dm: enable may_passthrough_inline_crypto on some targets
  ANDROID: dm: add support for passing through inline crypto support
  ANDROID: block: Introduce passthrough keyslot manager
  ANDROID: ext4, f2fs: enable direct I/O with inline encryption
  FROMLIST: scsi: ufs: add program_key() variant op
  ANDROID: block: export symbols needed for modules to use inline crypto
  ANDROID: block: fix some inline crypto bugs
  UPSTREAM: mm/page_io.c: annotate refault stalls from swap_readpage
  UPSTREAM: lib/test_meminit.c: add bulk alloc/free tests
  UPSTREAM: lib/test_meminit: add a kmem_cache_alloc_bulk() test
  UPSTREAM: mm/slub.c: init_on_free=1 should wipe freelist ptr for bulk allocations
  ANDROID: mm/cma.c: Export symbols
  ANDROID: gki_defconfig: Set CONFIG_ION=m
  ANDROID: lib/plist: Export symbol plist_add
  ANDROID: staging: android: ion: enable modularizing the ion driver
  Revert "ANDROID: security,perf: Allow further restriction of perf_event_open"
  ANDROID: selinux: modify RTM_GETLINK permission
  FROMLIST: security: selinux: allow per-file labelling for binderfs
  BACKPORT: tracing: Remove unnecessary DEBUG_FS dependency
  BACKPORT: debugfs: Fix !DEBUG_FS debugfs_create_automount
  ANDROID: update abi for 4.19.98
  Linux 4.19.98
  hwmon: (pmbus/ibm-cffps) Switch LEDs to blocking brightness call
  regulator: ab8500: Remove SYSCLKREQ from enum ab8505_regulator_id
  clk: sprd: Use IS_ERR() to validate the return value of syscon_regmap_lookup_by_phandle()
  perf probe: Fix wrong address verification
  scsi: core: scsi_trace: Use get_unaligned_be*()
  scsi: qla2xxx: fix rports not being mark as lost in sync fabric scan
  scsi: qla2xxx: Fix qla2x00_request_irqs() for MSI
  scsi: target: core: Fix a pr_debug() argument
  scsi: bnx2i: fix potential use after free
  scsi: qla4xxx: fix double free bug
  scsi: esas2r: unlock on error in esas2r_nvram_read_direct()
  reiserfs: fix handling of -EOPNOTSUPP in reiserfs_for_each_xattr
  drm/nouveau/mmu: qualify vmm during dtor
  drm/nouveau/bar/gf100: ensure BAR is mapped
  drm/nouveau/bar/nv50: check bar1 vmm return value
  mtd: devices: fix mchp23k256 read and write
  Revert "arm64: dts: juno: add dma-ranges property"
  arm64: dts: marvell: Fix CP110 NAND controller node multi-line comment alignment
  tick/sched: Annotate lockless access to last_jiffies_update
  cfg80211: check for set_wiphy_params
  arm64: dts: meson-gxl-s905x-khadas-vim: fix gpio-keys-polled node
  cw1200: Fix a signedness bug in cw1200_load_firmware()
  irqchip: Place CONFIG_SIFIVE_PLIC into the menu
  tcp: refine rule to allow EPOLLOUT generation under mem pressure
  xen/blkfront: Adjust indentation in xlvbd_alloc_gendisk
  mlxsw: spectrum_qdisc: Include MC TCs in Qdisc counters
  mlxsw: spectrum: Wipe xstats.backlog of down ports
  sh_eth: check sh_eth_cpu_data::dual_port when dumping registers
  tcp: fix marked lost packets not being retransmitted
  r8152: add missing endpoint sanity check
  ptp: free ptp device pin descriptors properly
  net/wan/fsl_ucc_hdlc: fix out of bounds write on array utdm_info
  net: usb: lan78xx: limit size of local TSO packets
  net: hns: fix soft lockup when there is not enough memory
  net: dsa: tag_qca: fix doubled Tx statistics
  hv_netvsc: Fix memory leak when removing rndis device
  macvlan: use skb_reset_mac_header() in macvlan_queue_xmit()
  batman-adv: Fix DAT candidate selection on little endian systems
  NFC: pn533: fix bulk-message timeout
  netfilter: nf_tables: fix flowtable list del corruption
  netfilter: nf_tables: store transaction list locally while requesting module
  netfilter: nf_tables: remove WARN and add NLA_STRING upper limits
  netfilter: nft_tunnel: fix null-attribute check
  netfilter: arp_tables: init netns pointer in xt_tgdtor_param struct
  netfilter: fix a use-after-free in mtype_destroy()
  cfg80211: fix page refcount issue in A-MSDU decap
  cfg80211: fix memory leak in cfg80211_cqm_rssi_update
  cfg80211: fix deadlocks in autodisconnect work
  bpf: Fix incorrect verifier simulation of ARSH under ALU32
  arm64: dts: agilex/stratix10: fix pmu interrupt numbers
  mm/huge_memory.c: thp: fix conflict of above-47bit hint address and PMD alignment
  mm/huge_memory.c: make __thp_get_unmapped_area static
  net: stmmac: Enable 16KB buffer size
  net: stmmac: 16KB buffer must be 16 byte aligned
  ARM: dts: imx7: Fix Toradex Colibri iMX7S 256MB NAND flash support
  ARM: dts: imx6q-icore-mipi: Use 1.5 version of i.Core MX6DL
  ARM: dts: imx6qdl: Add Engicam i.Core 1.5 MX6
  mm/page-writeback.c: avoid potential division by zero in wb_min_max_ratio()
  btrfs: fix memory leak in qgroup accounting
  btrfs: do not delete mismatched root refs
  btrfs: fix invalid removal of root ref
  btrfs: rework arguments of btrfs_unlink_subvol
  mm: memcg/slab: call flush_memcg_workqueue() only if memcg workqueue is valid
  mm/shmem.c: thp, shmem: fix conflict of above-47bit hint address and PMD alignment
  perf report: Fix incorrectly added dimensions as switch perf data file
  perf hists: Fix variable name's inconsistency in hists__for_each() macro
  x86/resctrl: Fix potential memory leak
  drm/i915: Add missing include file <linux/math64.h>
  x86/efistub: Disable paging at mixed mode entry
  x86/CPU/AMD: Ensure clearing of SME/SEV features is maintained
  x86/resctrl: Fix an imbalance in domain_remove_cpu()
  usb: core: hub: Improved device recognition on remote wakeup
  ptrace: reintroduce usage of subjective credentials in ptrace_has_cap()
  LSM: generalize flag passing to security_capable
  ARM: dts: am571x-idk: Fix gpios property to have the correct gpio number
  block: fix an integer overflow in logical block size
  Fix built-in early-load Intel microcode alignment
  arm64: dts: allwinner: a64: olinuxino: Fix SDIO supply regulator
  ALSA: usb-audio: fix sync-ep altsetting sanity check
  ALSA: seq: Fix racy access for queue timer in proc read
  ALSA: dice: fix fallback from protocol extension into limited functionality
  ARM: dts: imx6q-dhcom: Fix SGTL5000 VDDIO regulator connection
  ASoC: msm8916-wcd-analog: Fix MIC BIAS Internal1
  ASoC: msm8916-wcd-analog: Fix selected events for MIC BIAS External1
  scsi: mptfusion: Fix double fetch bug in ioctl
  scsi: fnic: fix invalid stack access
  USB: serial: quatech2: handle unbound ports
  USB: serial: keyspan: handle unbound ports
  USB: serial: io_edgeport: add missing active-port sanity check
  USB: serial: io_edgeport: handle unbound ports on URB completion
  USB: serial: ch341: handle unbound port at reset_resume
  USB: serial: suppress driver bind attributes
  USB: serial: option: add support for Quectel RM500Q in QDL mode
  USB: serial: opticon: fix control-message timeouts
  USB: serial: option: Add support for Quectel RM500Q
  USB: serial: simple: Add Motorola Solutions TETRA MTP3xxx and MTP85xx
  iio: buffer: align the size of scan bytes to size of the largest element
  ASoC: msm8916-wcd-digital: Reset RX interpolation path after use
  clk: Don't try to enable critical clocks if prepare failed
  ARM: dts: imx6q-dhcom: fix rtc compatible
  dt-bindings: reset: meson8b: fix duplicate reset IDs
  clk: qcom: gcc-sdm845: Add missing flag to votable GDSCs
  ARM: dts: meson8: fix the size of the PMU registers
  ANDROID: gki: Make GKI specific modules builtins
  ANDROID: fscrypt: add support for hardware-wrapped keys
  ANDROID: block: add KSM op to derive software secret from wrapped key
  ANDROID: block: provide key size as input to inline crypto APIs
  ANDROID: ufshcd-crypto: export cap find API
  ANDROID: build config for cuttlefish ramdisk
  ANDROID: Update ABI representation and whitelist
  Linux 4.19.97
  ocfs2: call journal flush to mark journal as empty after journal recovery when mount
  hexagon: work around compiler crash
  hexagon: parenthesize registers in asm predicates
  ioat: ioat_alloc_ring() failure handling.
  dmaengine: k3dma: Avoid null pointer traversal
  drm/arm/mali: make malidp_mw_connector_helper_funcs static
  MIPS: Prevent link failure with kcov instrumentation
  mips: cacheinfo: report shared CPU map
  rseq/selftests: Turn off timeout setting
  selftests: firmware: Fix it to do root uid check and skip
  scsi: libcxgbi: fix NULL pointer dereference in cxgbi_device_destroy()
  gpio: mpc8xxx: Add platform device to gpiochip->parent
  rtc: brcmstb-waketimer: add missed clk_disable_unprepare
  rtc: msm6242: Fix reading of 10-hour digit
  f2fs: fix potential overflow
  rtlwifi: Remove unnecessary NULL check in rtl_regd_init
  spi: atmel: fix handling of cs_change set on non-last xfer
  mtd: spi-nor: fix silent truncation in spi_nor_read_raw()
  mtd: spi-nor: fix silent truncation in spi_nor_read()
  iommu/mediatek: Correct the flush_iotlb_all callback
  media: exynos4-is: Fix recursive locking in isp_video_release()
  media: v4l: cadence: Fix how unsued lanes are handled in 'csi2rx_start()'
  media: rcar-vin: Fix incorrect return statement in rvin_try_format()
  media: ov6650: Fix .get_fmt() V4L2_SUBDEV_FORMAT_TRY support
  media: ov6650: Fix some format attributes not under control
  media: ov6650: Fix incorrect use of JPEG colorspace
  tty: serial: pch_uart: correct usage of dma_unmap_sg
  tty: serial: imx: use the sg count from dma_map_sg
  powerpc/powernv: Disable native PCIe port management
  PCI/PTM: Remove spurious "d" from granularity message
  PCI: dwc: Fix find_next_bit() usage
  compat_ioctl: handle SIOCOUTQNSD
  af_unix: add compat_ioctl support
  arm64: dts: apq8096-db820c: Increase load on l21 for SDCARD
  scsi: sd: enable compat ioctls for sed-opal
  pinctrl: lewisburg: Update pin list according to v1.1v6
  pinctl: ti: iodelay: fix error checking on pinctrl_count_index_with_args call
  clk: samsung: exynos5420: Preserve CPU clocks configuration during suspend/resume
  mei: fix modalias documentation
  iio: imu: adis16480: assign bias value only if operation succeeded
  NFSv4.x: Drop the slot if nfs4_delegreturn_prepare waits for layoutreturn
  NFSv2: Fix a typo in encode_sattr()
  crypto: virtio - implement missing support for output IVs
  xprtrdma: Fix completion wait during device removal
  platform/x86: GPD pocket fan: Use default values when wrong modparams are given
  platform/x86: asus-wmi: Fix keyboard brightness cannot be set to 0
  scsi: sd: Clear sdkp->protection_type if disk is reformatted without PI
  scsi: enclosure: Fix stale device oops with hot replug
  RDMA/srpt: Report the SCSI residual to the initiator
  RDMA/mlx5: Return proper error value
  btrfs: simplify inode locking for RWF_NOWAIT
  drm/ttm: fix incrementing the page pointer for huge pages
  drm/ttm: fix start page for huge page check in ttm_put_pages()
  afs: Fix missing cell comparison in afs_test_super()
  cifs: Adjust indentation in smb2_open_file
  s390/qeth: Fix vnicc_is_in_use if rx_bcast not set
  s390/qeth: fix false reporting of VNIC CHAR config failure
  hsr: reset network header when supervision frame is created
  gpio: Fix error message on out-of-range GPIO in lookup table
  iommu: Remove device link to group on failure
  gpio: zynq: Fix for bug in zynq_gpio_restore_context API
  mtd: onenand: omap2: Pass correct flags for prep_dma_memcpy
  ASoC: stm32: spdifrx: fix race condition in irq handler
  ASoC: stm32: spdifrx: fix inconsistent lock state
  ASoC: soc-core: Set dpcm_playback / dpcm_capture
  RDMA/bnxt_re: Fix Send Work Entry state check while polling completions
  RDMA/bnxt_re: Avoid freeing MR resources if dereg fails
  rtc: mt6397: fix alarm register overwrite
  drm/i915: Fix use-after-free when destroying GEM context
  dccp: Fix memleak in __feat_register_sp
  RDMA: Fix goto target to release the allocated memory
  iwlwifi: pcie: fix memory leaks in iwl_pcie_ctxt_info_gen3_init
  iwlwifi: dbg_ini: fix memory leak in alloc_sgtable
  media: usb:zr364xx:Fix KASAN:null-ptr-deref Read in zr364xx_vidioc_querycap
  f2fs: check if file namelen exceeds max value
  f2fs: check memory boundary by insane namelen
  f2fs: Move err variable to function scope in f2fs_fill_dentries()
  mac80211: Do not send Layer 2 Update frame before authorization
  cfg80211/mac80211: make ieee80211_send_layer2_update a public function
  fs/select: avoid clang stack usage warning
  ethtool: reduce stack usage with clang
  HID: hidraw, uhid: Always report EPOLLOUT
  HID: hidraw: Fix returning EPOLLOUT from hidraw_poll
  hidraw: Return EPOLLOUT from hidraw_poll
  ANDROID: update ABI whitelist
  ANDROID: update kernel ABI for CONFIG_DUMMY
  GKI: enable CONFIG_DUMMY=y
  UPSTREAM: kcov: fix struct layout for kcov_remote_arg
  UPSTREAM: vhost, kcov: collect coverage from vhost_worker
  UPSTREAM: usb, kcov: collect coverage from hub_event
  ANDROID: update kernel ABI for kcov changes
  UPSTREAM: kcov: remote coverage support
  UPSTREAM: kcov: improve CONFIG_ARCH_HAS_KCOV help text
  UPSTREAM: kcov: convert kcov.refcount to refcount_t
  UPSTREAM: kcov: no need to check return value of debugfs_create functions
  GKI: enable CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y
  Linux 4.19.96
  drm/i915/gen9: Clear residual context state on context switch
  netfilter: ipset: avoid null deref when IPSET_ATTR_LINENO is present
  netfilter: conntrack: dccp, sctp: handle null timeout argument
  netfilter: arp_tables: init netns pointer in xt_tgchk_param struct
  phy: cpcap-usb: Fix flakey host idling and enumerating of devices
  phy: cpcap-usb: Fix error path when no host driver is loaded
  USB: Fix: Don't skip endpoint descriptors with maxpacket=0
  HID: hiddev: fix mess in hiddev_open()
  ath10k: fix memory leak
  rtl8xxxu: prevent leaking urb
  scsi: bfa: release allocated memory in case of error
  mwifiex: pcie: Fix memory leak in mwifiex_pcie_alloc_cmdrsp_buf
  mwifiex: fix possible heap overflow in mwifiex_process_country_ie()
  tty: always relink the port
  tty: link tty and port before configuring it as console
  serdev: Don't claim unsupported ACPI serial devices
  staging: rtl8188eu: Add device code for TP-Link TL-WN727N v5.21
  staging: comedi: adv_pci1710: fix AI channels 16-31 for PCI-1713
  usb: musb: dma: Correct parameter passed to IRQ handler
  usb: musb: Disable pullup at init
  usb: musb: fix idling for suspend after disconnect interrupt
  USB: serial: option: add ZLP support for 0x1bc7/0x9010
  staging: vt6656: set usb_set_intfdata on driver fail.
  gpiolib: acpi: Add honor_wakeup module-option + quirk mechanism
  gpiolib: acpi: Turn dmi_system_id table into a generic quirk table
  can: can_dropped_invalid_skb(): ensure an initialized headroom in outgoing CAN sk_buffs
  can: mscan: mscan_rx_poll(): fix rx path lockup when returning from polling to irq mode
  can: gs_usb: gs_usb_probe(): use descriptors of current altsetting
  can: kvaser_usb: fix interface sanity check
  drm/dp_mst: correct the shifting in DP_REMOTE_I2C_READ
  drm/fb-helper: Round up bits_per_pixel if possible
  drm/sun4i: tcon: Set RGB DCLK min. divider based on hardware model
  Input: input_event - fix struct padding on sparc64
  Input: add safety guards to input_set_keycode()
  HID: hid-input: clear unmapped usages
  HID: uhid: Fix returning EPOLLOUT from uhid_char_poll
  HID: Fix slab-out-of-bounds read in hid_field_extract
  tracing: Change offset type to s32 in preempt/irq tracepoints
  tracing: Have stack tracer compile when MCOUNT_INSN_SIZE is not defined
  kernel/trace: Fix do not unregister tracepoints when register sched_migrate_task fail
  ALSA: hda/realtek - Add quirk for the bass speaker on Lenovo Yoga X1 7th gen
  ALSA: hda/realtek - Set EAPD control to default for ALC222
  ALSA: hda/realtek - Add new codec supported for ALCS1200A
  ALSA: usb-audio: Apply the sample rate quirk for Bose Companion 5
  usb: chipidea: host: Disable port power only if previously enabled
  i2c: fix bus recovery stop mode timing
  chardev: Avoid potential use-after-free in 'chrdev_open()'
  ANDROID: Enable HID_STEAM, HID_SONY, JOYSTICK_XPAD as y
  ANDROID: gki_defconfig: Enable blk-crypto fallback
  BACKPORT: FROMLIST: Update Inline Encryption from v5 to v6 of patch series
  docs: fs-verity: mention statx() support
  f2fs: support STATX_ATTR_VERITY
  ext4: support STATX_ATTR_VERITY
  statx: define STATX_ATTR_VERITY
  docs: fs-verity: document first supported kernel version
  f2fs: add support for IV_INO_LBLK_64 encryption policies
  ext4: add support for IV_INO_LBLK_64 encryption policies
  fscrypt: add support for IV_INO_LBLK_64 policies
  fscrypt: avoid data race on fscrypt_mode::logged_impl_name
  fscrypt: zeroize fscrypt_info before freeing
  fscrypt: remove struct fscrypt_ctx
  fscrypt: invoke crypto API for ESSIV handling

Conflicts:
	Documentation/devicetree/bindings
	Documentation/devicetree/bindings/bus/ti-sysc.txt
	Documentation/devicetree/bindings/thermal/thermal.txt
	Documentation/sysctl/vm.txt
	arch/arm64/mm/mmu.c
	block/blk-crypto-fallback.c
	block/blk-merge.c
	block/keyslot-manager.c
	drivers/char/Kconfig
	drivers/clk/qcom/clk-rcg2.c
	drivers/gpio/gpiolib.c
	drivers/hid/hid-quirks.c
	drivers/irqchip/Kconfig
	drivers/md/Kconfig
	drivers/md/dm-default-key.c
	drivers/md/dm.c
	drivers/nvmem/core.c
	drivers/of/Kconfig
	drivers/of/fdt.c
	drivers/of/irq.c
	drivers/scsi/ufs/ufshcd-crypto.c
	drivers/scsi/ufs/ufshcd.c
	drivers/scsi/ufs/ufshcd.h
	drivers/scsi/ufs/ufshci.h
	drivers/usb/dwc3/gadget.c
	drivers/usb/gadget/composite.c
	drivers/usb/gadget/function/f_fs.c
	fs/crypto/bio.c
	fs/crypto/fname.c
	fs/crypto/fscrypt_private.h
	fs/crypto/keyring.c
	fs/crypto/keysetup.c
	fs/f2fs/data.c
	fs/f2fs/file.c
	include/crypto/skcipher.h
	include/linux/gfp.h
	include/linux/keyslot-manager.h
	include/linux/of_fdt.h
	include/sound/soc.h
	kernel/sched/cpufreq_schedutil.c
	kernel/sched/fair.c
	kernel/sched/psi.c
	kernel/sched/rt.c
	kernel/sched/sched.h
	kernel/sched/topology.c
	kernel/sched/tune.h
	kernel/sysctl.c
	mm/compaction.c
	mm/page_alloc.c
	mm/vmscan.c
	security/commoncap.c
	security/selinux/avc.c

Change-Id: I9a08175c4892e533ecde8da847f75dc4874b303a
Signed-off-by: Ivaylo Georgiev <irgeorgiev@codeaurora.org>
2020-05-23 05:08:22 -07:00

4455 lines
113 KiB
C

/*
Copyright (C) 2002 Richard Henderson
Copyright (C) 2001 Rusty Russell, 2002, 2010 Rusty Russell IBM.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/export.h>
#include <linux/extable.h>
#include <linux/moduleloader.h>
#include <linux/trace_events.h>
#include <linux/init.h>
#include <linux/kallsyms.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/sysfs.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/elf.h>
#include <linux/proc_fs.h>
#include <linux/security.h>
#include <linux/seq_file.h>
#include <linux/syscalls.h>
#include <linux/fcntl.h>
#include <linux/rcupdate.h>
#include <linux/capability.h>
#include <linux/cpu.h>
#include <linux/moduleparam.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <linux/vermagic.h>
#include <linux/notifier.h>
#include <linux/sched.h>
#include <linux/device.h>
#include <linux/string.h>
#include <linux/mutex.h>
#include <linux/rculist.h>
#include <linux/uaccess.h>
#include <asm/cacheflush.h>
#include <linux/set_memory.h>
#include <asm/mmu_context.h>
#include <linux/license.h>
#include <asm/sections.h>
#include <linux/tracepoint.h>
#include <linux/ftrace.h>
#include <linux/livepatch.h>
#include <linux/async.h>
#include <linux/percpu.h>
#include <linux/kmemleak.h>
#include <linux/jump_label.h>
#include <linux/pfn.h>
#include <linux/bsearch.h>
#include <linux/dynamic_debug.h>
#include <linux/audit.h>
#include <uapi/linux/module.h>
#include "module-internal.h"
#define CREATE_TRACE_POINTS
#include <trace/events/module.h>
#ifndef ARCH_SHF_SMALL
#define ARCH_SHF_SMALL 0
#endif
/*
* Modules' sections will be aligned on page boundaries
* to ensure complete separation of code and data
*/
# define debug_align(X) ALIGN(X, PAGE_SIZE)
/* If this is set, the section belongs in the init part of the module */
#define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG-1))
/*
* Mutex protects:
* 1) List of modules (also safely readable with preempt_disable),
* 2) module_use links,
* 3) module_addr_min/module_addr_max.
* (delete and add uses RCU list operations). */
DEFINE_MUTEX(module_mutex);
EXPORT_SYMBOL_GPL(module_mutex);
static LIST_HEAD(modules);
#ifdef CONFIG_MODULES_TREE_LOOKUP
/*
* Use a latched RB-tree for __module_address(); this allows us to use
* RCU-sched lookups of the address from any context.
*
* This is conditional on PERF_EVENTS || TRACING because those can really hit
* __module_address() hard by doing a lot of stack unwinding; potentially from
* NMI context.
*/
static __always_inline unsigned long __mod_tree_val(struct latch_tree_node *n)
{
struct module_layout *layout = container_of(n, struct module_layout, mtn.node);
return (unsigned long)layout->base;
}
static __always_inline unsigned long __mod_tree_size(struct latch_tree_node *n)
{
struct module_layout *layout = container_of(n, struct module_layout, mtn.node);
return (unsigned long)layout->size;
}
static __always_inline bool
mod_tree_less(struct latch_tree_node *a, struct latch_tree_node *b)
{
return __mod_tree_val(a) < __mod_tree_val(b);
}
static __always_inline int
mod_tree_comp(void *key, struct latch_tree_node *n)
{
unsigned long val = (unsigned long)key;
unsigned long start, end;
start = __mod_tree_val(n);
if (val < start)
return -1;
end = start + __mod_tree_size(n);
if (val >= end)
return 1;
return 0;
}
static const struct latch_tree_ops mod_tree_ops = {
.less = mod_tree_less,
.comp = mod_tree_comp,
};
static struct mod_tree_root {
struct latch_tree_root root;
unsigned long addr_min;
unsigned long addr_max;
} mod_tree __cacheline_aligned = {
.addr_min = -1UL,
};
#define module_addr_min mod_tree.addr_min
#define module_addr_max mod_tree.addr_max
static noinline void __mod_tree_insert(struct mod_tree_node *node)
{
latch_tree_insert(&node->node, &mod_tree.root, &mod_tree_ops);
}
static void __mod_tree_remove(struct mod_tree_node *node)
{
latch_tree_erase(&node->node, &mod_tree.root, &mod_tree_ops);
}
/*
* These modifications: insert, remove_init and remove; are serialized by the
* module_mutex.
*/
static void mod_tree_insert(struct module *mod)
{
mod->core_layout.mtn.mod = mod;
mod->init_layout.mtn.mod = mod;
__mod_tree_insert(&mod->core_layout.mtn);
if (mod->init_layout.size)
__mod_tree_insert(&mod->init_layout.mtn);
}
static void mod_tree_remove_init(struct module *mod)
{
if (mod->init_layout.size)
__mod_tree_remove(&mod->init_layout.mtn);
}
static void mod_tree_remove(struct module *mod)
{
__mod_tree_remove(&mod->core_layout.mtn);
mod_tree_remove_init(mod);
}
static struct module *mod_find(unsigned long addr)
{
struct latch_tree_node *ltn;
ltn = latch_tree_find((void *)addr, &mod_tree.root, &mod_tree_ops);
if (!ltn)
return NULL;
return container_of(ltn, struct mod_tree_node, node)->mod;
}
#else /* MODULES_TREE_LOOKUP */
static unsigned long module_addr_min = -1UL, module_addr_max = 0;
static void mod_tree_insert(struct module *mod) { }
static void mod_tree_remove_init(struct module *mod) { }
static void mod_tree_remove(struct module *mod) { }
static struct module *mod_find(unsigned long addr)
{
struct module *mod;
list_for_each_entry_rcu(mod, &modules, list) {
if (within_module(addr, mod))
return mod;
}
return NULL;
}
#endif /* MODULES_TREE_LOOKUP */
/*
* Bounds of module text, for speeding up __module_address.
* Protected by module_mutex.
*/
static void __mod_update_bounds(void *base, unsigned int size)
{
unsigned long min = (unsigned long)base;
unsigned long max = min + size;
if (min < module_addr_min)
module_addr_min = min;
if (max > module_addr_max)
module_addr_max = max;
}
static void mod_update_bounds(struct module *mod)
{
__mod_update_bounds(mod->core_layout.base, mod->core_layout.size);
if (mod->init_layout.size)
__mod_update_bounds(mod->init_layout.base, mod->init_layout.size);
}
#ifdef CONFIG_KGDB_KDB
struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
#endif /* CONFIG_KGDB_KDB */
static void module_assert_mutex(void)
{
lockdep_assert_held(&module_mutex);
}
static void module_assert_mutex_or_preempt(void)
{
#ifdef CONFIG_LOCKDEP
if (unlikely(!debug_locks))
return;
WARN_ON_ONCE(!rcu_read_lock_sched_held() &&
!lockdep_is_held(&module_mutex));
#endif
}
static bool sig_enforce = IS_ENABLED(CONFIG_MODULE_SIG_FORCE);
module_param(sig_enforce, bool_enable_only, 0644);
/*
* Export sig_enforce kernel cmdline parameter to allow other subsystems rely
* on that instead of directly to CONFIG_MODULE_SIG_FORCE config.
*/
bool is_module_sig_enforced(void)
{
return sig_enforce;
}
EXPORT_SYMBOL(is_module_sig_enforced);
/* Block module loading/unloading? */
int modules_disabled = 0;
core_param(nomodule, modules_disabled, bint, 0);
/* Waiting for a module to finish initializing? */
static DECLARE_WAIT_QUEUE_HEAD(module_wq);
static BLOCKING_NOTIFIER_HEAD(module_notify_list);
int register_module_notifier(struct notifier_block *nb)
{
return blocking_notifier_chain_register(&module_notify_list, nb);
}
EXPORT_SYMBOL(register_module_notifier);
int unregister_module_notifier(struct notifier_block *nb)
{
return blocking_notifier_chain_unregister(&module_notify_list, nb);
}
EXPORT_SYMBOL(unregister_module_notifier);
/*
* We require a truly strong try_module_get(): 0 means success.
* Otherwise an error is returned due to ongoing or failed
* initialization etc.
*/
static inline int strong_try_module_get(struct module *mod)
{
BUG_ON(mod && mod->state == MODULE_STATE_UNFORMED);
if (mod && mod->state == MODULE_STATE_COMING)
return -EBUSY;
if (try_module_get(mod))
return 0;
else
return -ENOENT;
}
static inline void add_taint_module(struct module *mod, unsigned flag,
enum lockdep_ok lockdep_ok)
{
add_taint(flag, lockdep_ok);
set_bit(flag, &mod->taints);
}
/*
* A thread that wants to hold a reference to a module only while it
* is running can call this to safely exit. nfsd and lockd use this.
*/
void __noreturn __module_put_and_exit(struct module *mod, long code)
{
module_put(mod);
do_exit(code);
}
EXPORT_SYMBOL(__module_put_and_exit);
/* Find a module section: 0 means not found. */
static unsigned int find_sec(const struct load_info *info, const char *name)
{
unsigned int i;
for (i = 1; i < info->hdr->e_shnum; i++) {
Elf_Shdr *shdr = &info->sechdrs[i];
/* Alloc bit cleared means "ignore it." */
if ((shdr->sh_flags & SHF_ALLOC)
&& strcmp(info->secstrings + shdr->sh_name, name) == 0)
return i;
}
return 0;
}
/* Find a module section, or NULL. */
static void *section_addr(const struct load_info *info, const char *name)
{
/* Section 0 has sh_addr 0. */
return (void *)info->sechdrs[find_sec(info, name)].sh_addr;
}
/* Find a module section, or NULL. Fill in number of "objects" in section. */
static void *section_objs(const struct load_info *info,
const char *name,
size_t object_size,
unsigned int *num)
{
unsigned int sec = find_sec(info, name);
/* Section 0 has sh_addr 0 and sh_size 0. */
*num = info->sechdrs[sec].sh_size / object_size;
return (void *)info->sechdrs[sec].sh_addr;
}
/* Provided by the linker */
extern const struct kernel_symbol __start___ksymtab[];
extern const struct kernel_symbol __stop___ksymtab[];
extern const struct kernel_symbol __start___ksymtab_gpl[];
extern const struct kernel_symbol __stop___ksymtab_gpl[];
extern const struct kernel_symbol __start___ksymtab_gpl_future[];
extern const struct kernel_symbol __stop___ksymtab_gpl_future[];
extern const s32 __start___kcrctab[];
extern const s32 __start___kcrctab_gpl[];
extern const s32 __start___kcrctab_gpl_future[];
#ifdef CONFIG_UNUSED_SYMBOLS
extern const struct kernel_symbol __start___ksymtab_unused[];
extern const struct kernel_symbol __stop___ksymtab_unused[];
extern const struct kernel_symbol __start___ksymtab_unused_gpl[];
extern const struct kernel_symbol __stop___ksymtab_unused_gpl[];
extern const s32 __start___kcrctab_unused[];
extern const s32 __start___kcrctab_unused_gpl[];
#endif
#ifndef CONFIG_MODVERSIONS
#define symversion(base, idx) NULL
#else
#define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL)
#endif
static bool each_symbol_in_section(const struct symsearch *arr,
unsigned int arrsize,
struct module *owner,
bool (*fn)(const struct symsearch *syms,
struct module *owner,
void *data),
void *data)
{
unsigned int j;
for (j = 0; j < arrsize; j++) {
if (fn(&arr[j], owner, data))
return true;
}
return false;
}
/* Returns true as soon as fn returns true, otherwise false. */
bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
struct module *owner,
void *data),
void *data)
{
struct module *mod;
static const struct symsearch arr[] = {
{ __start___ksymtab, __stop___ksymtab, __start___kcrctab,
NOT_GPL_ONLY, false },
{ __start___ksymtab_gpl, __stop___ksymtab_gpl,
__start___kcrctab_gpl,
GPL_ONLY, false },
{ __start___ksymtab_gpl_future, __stop___ksymtab_gpl_future,
__start___kcrctab_gpl_future,
WILL_BE_GPL_ONLY, false },
#ifdef CONFIG_UNUSED_SYMBOLS
{ __start___ksymtab_unused, __stop___ksymtab_unused,
__start___kcrctab_unused,
NOT_GPL_ONLY, true },
{ __start___ksymtab_unused_gpl, __stop___ksymtab_unused_gpl,
__start___kcrctab_unused_gpl,
GPL_ONLY, true },
#endif
};
module_assert_mutex_or_preempt();
if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data))
return true;
list_for_each_entry_rcu(mod, &modules, list) {
struct symsearch arr[] = {
{ mod->syms, mod->syms + mod->num_syms, mod->crcs,
NOT_GPL_ONLY, false },
{ mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms,
mod->gpl_crcs,
GPL_ONLY, false },
{ mod->gpl_future_syms,
mod->gpl_future_syms + mod->num_gpl_future_syms,
mod->gpl_future_crcs,
WILL_BE_GPL_ONLY, false },
#ifdef CONFIG_UNUSED_SYMBOLS
{ mod->unused_syms,
mod->unused_syms + mod->num_unused_syms,
mod->unused_crcs,
NOT_GPL_ONLY, true },
{ mod->unused_gpl_syms,
mod->unused_gpl_syms + mod->num_unused_gpl_syms,
mod->unused_gpl_crcs,
GPL_ONLY, true },
#endif
};
if (mod->state == MODULE_STATE_UNFORMED)
continue;
if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data))
return true;
}
return false;
}
EXPORT_SYMBOL_GPL(each_symbol_section);
struct find_symbol_arg {
/* Input */
const char *name;
bool gplok;
bool warn;
/* Output */
struct module *owner;
const s32 *crc;
const struct kernel_symbol *sym;
};
static bool check_symbol(const struct symsearch *syms,
struct module *owner,
unsigned int symnum, void *data)
{
struct find_symbol_arg *fsa = data;
if (!fsa->gplok) {
if (syms->licence == GPL_ONLY)
return false;
if (syms->licence == WILL_BE_GPL_ONLY && fsa->warn) {
pr_warn("Symbol %s is being used by a non-GPL module, "
"which will not be allowed in the future\n",
fsa->name);
}
}
#ifdef CONFIG_UNUSED_SYMBOLS
if (syms->unused && fsa->warn) {
pr_warn("Symbol %s is marked as UNUSED, however this module is "
"using it.\n", fsa->name);
pr_warn("This symbol will go away in the future.\n");
pr_warn("Please evaluate if this is the right api to use and "
"if it really is, submit a report to the linux kernel "
"mailing list together with submitting your code for "
"inclusion.\n");
}
#endif
fsa->owner = owner;
fsa->crc = symversion(syms->crcs, symnum);
fsa->sym = &syms->start[symnum];
return true;
}
static unsigned long kernel_symbol_value(const struct kernel_symbol *sym)
{
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
return (unsigned long)offset_to_ptr(&sym->value_offset);
#else
return sym->value;
#endif
}
static const char *kernel_symbol_name(const struct kernel_symbol *sym)
{
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
return offset_to_ptr(&sym->name_offset);
#else
return sym->name;
#endif
}
static int cmp_name(const void *va, const void *vb)
{
const char *a;
const struct kernel_symbol *b;
a = va; b = vb;
return strcmp(a, kernel_symbol_name(b));
}
static bool find_symbol_in_section(const struct symsearch *syms,
struct module *owner,
void *data)
{
struct find_symbol_arg *fsa = data;
struct kernel_symbol *sym;
sym = bsearch(fsa->name, syms->start, syms->stop - syms->start,
sizeof(struct kernel_symbol), cmp_name);
if (sym != NULL && check_symbol(syms, owner, sym - syms->start, data))
return true;
return false;
}
/* Find a symbol and return it, along with, (optional) crc and
* (optional) module which owns it. Needs preempt disabled or module_mutex. */
const struct kernel_symbol *find_symbol(const char *name,
struct module **owner,
const s32 **crc,
bool gplok,
bool warn)
{
struct find_symbol_arg fsa;
fsa.name = name;
fsa.gplok = gplok;
fsa.warn = warn;
if (each_symbol_section(find_symbol_in_section, &fsa)) {
if (owner)
*owner = fsa.owner;
if (crc)
*crc = fsa.crc;
return fsa.sym;
}
pr_debug("Failed to find symbol %s\n", name);
return NULL;
}
EXPORT_SYMBOL_GPL(find_symbol);
/*
* Search for module by name: must hold module_mutex (or preempt disabled
* for read-only access).
*/
static struct module *find_module_all(const char *name, size_t len,
bool even_unformed)
{
struct module *mod;
module_assert_mutex_or_preempt();
list_for_each_entry_rcu(mod, &modules, list) {
if (!even_unformed && mod->state == MODULE_STATE_UNFORMED)
continue;
if (strlen(mod->name) == len && !memcmp(mod->name, name, len))
return mod;
}
return NULL;
}
struct module *find_module(const char *name)
{
module_assert_mutex();
return find_module_all(name, strlen(name), false);
}
EXPORT_SYMBOL_GPL(find_module);
#ifdef CONFIG_SMP
static inline void __percpu *mod_percpu(struct module *mod)
{
return mod->percpu;
}
static int percpu_modalloc(struct module *mod, struct load_info *info)
{
Elf_Shdr *pcpusec = &info->sechdrs[info->index.pcpu];
unsigned long align = pcpusec->sh_addralign;
if (!pcpusec->sh_size)
return 0;
if (align > PAGE_SIZE) {
pr_warn("%s: per-cpu alignment %li > %li\n",
mod->name, align, PAGE_SIZE);
align = PAGE_SIZE;
}
mod->percpu = __alloc_reserved_percpu(pcpusec->sh_size, align);
if (!mod->percpu) {
pr_warn("%s: Could not allocate %lu bytes percpu data\n",
mod->name, (unsigned long)pcpusec->sh_size);
return -ENOMEM;
}
mod->percpu_size = pcpusec->sh_size;
return 0;
}
static void percpu_modfree(struct module *mod)
{
free_percpu(mod->percpu);
}
static unsigned int find_pcpusec(struct load_info *info)
{
return find_sec(info, ".data..percpu");
}
static void percpu_modcopy(struct module *mod,
const void *from, unsigned long size)
{
int cpu;
for_each_possible_cpu(cpu)
memcpy(per_cpu_ptr(mod->percpu, cpu), from, size);
}
bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr)
{
struct module *mod;
unsigned int cpu;
preempt_disable();
list_for_each_entry_rcu(mod, &modules, list) {
if (mod->state == MODULE_STATE_UNFORMED)
continue;
if (!mod->percpu_size)
continue;
for_each_possible_cpu(cpu) {
void *start = per_cpu_ptr(mod->percpu, cpu);
void *va = (void *)addr;
if (va >= start && va < start + mod->percpu_size) {
if (can_addr) {
*can_addr = (unsigned long) (va - start);
*can_addr += (unsigned long)
per_cpu_ptr(mod->percpu,
get_boot_cpu_id());
}
preempt_enable();
return true;
}
}
}
preempt_enable();
return false;
}
/**
* is_module_percpu_address - test whether address is from module static percpu
* @addr: address to test
*
* Test whether @addr belongs to module static percpu area.
*
* RETURNS:
* %true if @addr is from module static percpu area
*/
bool is_module_percpu_address(unsigned long addr)
{
return __is_module_percpu_address(addr, NULL);
}
#else /* ... !CONFIG_SMP */
static inline void __percpu *mod_percpu(struct module *mod)
{
return NULL;
}
static int percpu_modalloc(struct module *mod, struct load_info *info)
{
/* UP modules shouldn't have this section: ENOMEM isn't quite right */
if (info->sechdrs[info->index.pcpu].sh_size != 0)
return -ENOMEM;
return 0;
}
static inline void percpu_modfree(struct module *mod)
{
}
static unsigned int find_pcpusec(struct load_info *info)
{
return 0;
}
static inline void percpu_modcopy(struct module *mod,
const void *from, unsigned long size)
{
/* pcpusec should be 0, and size of that section should be 0. */
BUG_ON(size != 0);
}
bool is_module_percpu_address(unsigned long addr)
{
return false;
}
bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr)
{
return false;
}
#endif /* CONFIG_SMP */
#define MODINFO_ATTR(field) \
static void setup_modinfo_##field(struct module *mod, const char *s) \
{ \
mod->field = kstrdup(s, GFP_KERNEL); \
} \
static ssize_t show_modinfo_##field(struct module_attribute *mattr, \
struct module_kobject *mk, char *buffer) \
{ \
return scnprintf(buffer, PAGE_SIZE, "%s\n", mk->mod->field); \
} \
static int modinfo_##field##_exists(struct module *mod) \
{ \
return mod->field != NULL; \
} \
static void free_modinfo_##field(struct module *mod) \
{ \
kfree(mod->field); \
mod->field = NULL; \
} \
static struct module_attribute modinfo_##field = { \
.attr = { .name = __stringify(field), .mode = 0444 }, \
.show = show_modinfo_##field, \
.setup = setup_modinfo_##field, \
.test = modinfo_##field##_exists, \
.free = free_modinfo_##field, \
};
MODINFO_ATTR(version);
MODINFO_ATTR(srcversion);
static char last_unloaded_module[MODULE_NAME_LEN+1];
#ifdef CONFIG_MODULE_UNLOAD
EXPORT_TRACEPOINT_SYMBOL(module_get);
/* MODULE_REF_BASE is the base reference count by kmodule loader. */
#define MODULE_REF_BASE 1
/* Init the unload section of the module. */
static int module_unload_init(struct module *mod)
{
/*
* Initialize reference counter to MODULE_REF_BASE.
* refcnt == 0 means module is going.
*/
atomic_set(&mod->refcnt, MODULE_REF_BASE);
INIT_LIST_HEAD(&mod->source_list);
INIT_LIST_HEAD(&mod->target_list);
/* Hold reference count during initialization. */
atomic_inc(&mod->refcnt);
return 0;
}
/* Does a already use b? */
static int already_uses(struct module *a, struct module *b)
{
struct module_use *use;
list_for_each_entry(use, &b->source_list, source_list) {
if (use->source == a) {
pr_debug("%s uses %s!\n", a->name, b->name);
return 1;
}
}
pr_debug("%s does not use %s!\n", a->name, b->name);
return 0;
}
/*
* Module a uses b
* - we add 'a' as a "source", 'b' as a "target" of module use
* - the module_use is added to the list of 'b' sources (so
* 'b' can walk the list to see who sourced them), and of 'a'
* targets (so 'a' can see what modules it targets).
*/
static int add_module_usage(struct module *a, struct module *b)
{
struct module_use *use;
pr_debug("Allocating new usage for %s.\n", a->name);
use = kmalloc(sizeof(*use), GFP_ATOMIC);
if (!use)
return -ENOMEM;
use->source = a;
use->target = b;
list_add(&use->source_list, &b->source_list);
list_add(&use->target_list, &a->target_list);
return 0;
}
/* Module a uses b: caller needs module_mutex() */
int ref_module(struct module *a, struct module *b)
{
int err;
if (b == NULL || already_uses(a, b))
return 0;
/* If module isn't available, we fail. */
err = strong_try_module_get(b);
if (err)
return err;
err = add_module_usage(a, b);
if (err) {
module_put(b);
return err;
}
return 0;
}
EXPORT_SYMBOL_GPL(ref_module);
/* Clear the unload stuff of the module. */
static void module_unload_free(struct module *mod)
{
struct module_use *use, *tmp;
mutex_lock(&module_mutex);
list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) {
struct module *i = use->target;
pr_debug("%s unusing %s\n", mod->name, i->name);
module_put(i);
list_del(&use->source_list);
list_del(&use->target_list);
kfree(use);
}
mutex_unlock(&module_mutex);
}
#ifdef CONFIG_MODULE_FORCE_UNLOAD
static inline int try_force_unload(unsigned int flags)
{
int ret = (flags & O_TRUNC);
if (ret)
add_taint(TAINT_FORCED_RMMOD, LOCKDEP_NOW_UNRELIABLE);
return ret;
}
#else
static inline int try_force_unload(unsigned int flags)
{
return 0;
}
#endif /* CONFIG_MODULE_FORCE_UNLOAD */
/* Try to release refcount of module, 0 means success. */
static int try_release_module_ref(struct module *mod)
{
int ret;
/* Try to decrement refcnt which we set at loading */
ret = atomic_sub_return(MODULE_REF_BASE, &mod->refcnt);
BUG_ON(ret < 0);
if (ret)
/* Someone can put this right now, recover with checking */
ret = atomic_add_unless(&mod->refcnt, MODULE_REF_BASE, 0);
return ret;
}
static int try_stop_module(struct module *mod, int flags, int *forced)
{
/* If it's not unused, quit unless we're forcing. */
if (try_release_module_ref(mod) != 0) {
*forced = try_force_unload(flags);
if (!(*forced))
return -EWOULDBLOCK;
}
/* Mark it as dying. */
mod->state = MODULE_STATE_GOING;
return 0;
}
/**
* module_refcount - return the refcount or -1 if unloading
*
* @mod: the module we're checking
*
* Returns:
* -1 if the module is in the process of unloading
* otherwise the number of references in the kernel to the module
*/
int module_refcount(struct module *mod)
{
return atomic_read(&mod->refcnt) - MODULE_REF_BASE;
}
EXPORT_SYMBOL(module_refcount);
/* This exists whether we can unload or not */
static void free_module(struct module *mod);
SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
unsigned int, flags)
{
struct module *mod;
char name[MODULE_NAME_LEN];
int ret, forced = 0;
if (!capable(CAP_SYS_MODULE) || modules_disabled)
return -EPERM;
if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
return -EFAULT;
name[MODULE_NAME_LEN-1] = '\0';
audit_log_kern_module(name);
if (mutex_lock_interruptible(&module_mutex) != 0)
return -EINTR;
mod = find_module(name);
if (!mod) {
ret = -ENOENT;
goto out;
}
if (!list_empty(&mod->source_list)) {
/* Other modules depend on us: get rid of them first. */
ret = -EWOULDBLOCK;
goto out;
}
/* Doing init or already dying? */
if (mod->state != MODULE_STATE_LIVE) {
/* FIXME: if (force), slam module count damn the torpedoes */
pr_debug("%s already dying\n", mod->name);
ret = -EBUSY;
goto out;
}
/* If it has an init func, it must have an exit func to unload */
if (mod->init && !mod->exit) {
forced = try_force_unload(flags);
if (!forced) {
/* This module can't be removed */
ret = -EBUSY;
goto out;
}
}
/* Stop the machine so refcounts can't move and disable module. */
ret = try_stop_module(mod, flags, &forced);
if (ret != 0)
goto out;
mutex_unlock(&module_mutex);
/* Final destruction now no one is using it. */
if (mod->exit != NULL)
mod->exit();
blocking_notifier_call_chain(&module_notify_list,
MODULE_STATE_GOING, mod);
klp_module_going(mod);
ftrace_release_mod(mod);
async_synchronize_full();
/* Store the name of the last unloaded module for diagnostic purposes */
strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module));
free_module(mod);
/* someone could wait for the module in add_unformed_module() */
wake_up_all(&module_wq);
return 0;
out:
mutex_unlock(&module_mutex);
return ret;
}
static inline void print_unload_info(struct seq_file *m, struct module *mod)
{
struct module_use *use;
int printed_something = 0;
seq_printf(m, " %i ", module_refcount(mod));
/*
* Always include a trailing , so userspace can differentiate
* between this and the old multi-field proc format.
*/
list_for_each_entry(use, &mod->source_list, source_list) {
printed_something = 1;
seq_printf(m, "%s,", use->source->name);
}
if (mod->init != NULL && mod->exit == NULL) {
printed_something = 1;
seq_puts(m, "[permanent],");
}
if (!printed_something)
seq_puts(m, "-");
}
void __symbol_put(const char *symbol)
{
struct module *owner;
preempt_disable();
if (!find_symbol(symbol, &owner, NULL, true, false))
BUG();
module_put(owner);
preempt_enable();
}
EXPORT_SYMBOL(__symbol_put);
/* Note this assumes addr is a function, which it currently always is. */
void symbol_put_addr(void *addr)
{
struct module *modaddr;
unsigned long a = (unsigned long)dereference_function_descriptor(addr);
if (core_kernel_text(a))
return;
/*
* Even though we hold a reference on the module; we still need to
* disable preemption in order to safely traverse the data structure.
*/
preempt_disable();
modaddr = __module_text_address(a);
BUG_ON(!modaddr);
module_put(modaddr);
preempt_enable();
}
EXPORT_SYMBOL_GPL(symbol_put_addr);
static ssize_t show_refcnt(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer)
{
return sprintf(buffer, "%i\n", module_refcount(mk->mod));
}
static struct module_attribute modinfo_refcnt =
__ATTR(refcnt, 0444, show_refcnt, NULL);
void __module_get(struct module *module)
{
if (module) {
preempt_disable();
atomic_inc(&module->refcnt);
trace_module_get(module, _RET_IP_);
preempt_enable();
}
}
EXPORT_SYMBOL(__module_get);
bool try_module_get(struct module *module)
{
bool ret = true;
if (module) {
preempt_disable();
/* Note: here, we can fail to get a reference */
if (likely(module_is_live(module) &&
atomic_inc_not_zero(&module->refcnt) != 0))
trace_module_get(module, _RET_IP_);
else
ret = false;
preempt_enable();
}
return ret;
}
EXPORT_SYMBOL(try_module_get);
void module_put(struct module *module)
{
int ret;
if (module) {
preempt_disable();
ret = atomic_dec_if_positive(&module->refcnt);
WARN_ON(ret < 0); /* Failed to put refcount */
trace_module_put(module, _RET_IP_);
preempt_enable();
}
}
EXPORT_SYMBOL(module_put);
#else /* !CONFIG_MODULE_UNLOAD */
static inline void print_unload_info(struct seq_file *m, struct module *mod)
{
/* We don't know the usage count, or what modules are using. */
seq_puts(m, " - -");
}
static inline void module_unload_free(struct module *mod)
{
}
int ref_module(struct module *a, struct module *b)
{
return strong_try_module_get(b);
}
EXPORT_SYMBOL_GPL(ref_module);
static inline int module_unload_init(struct module *mod)
{
return 0;
}
#endif /* CONFIG_MODULE_UNLOAD */
static size_t module_flags_taint(struct module *mod, char *buf)
{
size_t l = 0;
int i;
for (i = 0; i < TAINT_FLAGS_COUNT; i++) {
if (taint_flags[i].module && test_bit(i, &mod->taints))
buf[l++] = taint_flags[i].c_true;
}
return l;
}
static ssize_t show_initstate(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer)
{
const char *state = "unknown";
switch (mk->mod->state) {
case MODULE_STATE_LIVE:
state = "live";
break;
case MODULE_STATE_COMING:
state = "coming";
break;
case MODULE_STATE_GOING:
state = "going";
break;
default:
BUG();
}
return sprintf(buffer, "%s\n", state);
}
static struct module_attribute modinfo_initstate =
__ATTR(initstate, 0444, show_initstate, NULL);
static ssize_t store_uevent(struct module_attribute *mattr,
struct module_kobject *mk,
const char *buffer, size_t count)
{
int rc;
rc = kobject_synth_uevent(&mk->kobj, buffer, count);
return rc ? rc : count;
}
struct module_attribute module_uevent =
__ATTR(uevent, 0200, NULL, store_uevent);
static ssize_t show_coresize(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer)
{
return sprintf(buffer, "%u\n", mk->mod->core_layout.size);
}
static struct module_attribute modinfo_coresize =
__ATTR(coresize, 0444, show_coresize, NULL);
static ssize_t show_initsize(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer)
{
return sprintf(buffer, "%u\n", mk->mod->init_layout.size);
}
static struct module_attribute modinfo_initsize =
__ATTR(initsize, 0444, show_initsize, NULL);
static ssize_t show_taint(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer)
{
size_t l;
l = module_flags_taint(mk->mod, buffer);
buffer[l++] = '\n';
return l;
}
static struct module_attribute modinfo_taint =
__ATTR(taint, 0444, show_taint, NULL);
static struct module_attribute *modinfo_attrs[] = {
&module_uevent,
&modinfo_version,
&modinfo_srcversion,
&modinfo_initstate,
&modinfo_coresize,
&modinfo_initsize,
&modinfo_taint,
#ifdef CONFIG_MODULE_UNLOAD
&modinfo_refcnt,
#endif
NULL,
};
static const char vermagic[] = VERMAGIC_STRING;
static int try_to_force_load(struct module *mod, const char *reason)
{
#ifdef CONFIG_MODULE_FORCE_LOAD
if (!test_taint(TAINT_FORCED_MODULE))
pr_warn("%s: %s: kernel tainted.\n", mod->name, reason);
add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE);
return 0;
#else
return -ENOEXEC;
#endif
}
#ifdef CONFIG_MODVERSIONS
static u32 resolve_rel_crc(const s32 *crc)
{
return *(u32 *)((void *)crc + *crc);
}
static int check_version(const struct load_info *info,
const char *symname,
struct module *mod,
const s32 *crc)
{
Elf_Shdr *sechdrs = info->sechdrs;
unsigned int versindex = info->index.vers;
unsigned int i, num_versions;
struct modversion_info *versions;
/* Exporting module didn't supply crcs? OK, we're already tainted. */
if (!crc)
return 1;
/* No versions at all? modprobe --force does this. */
if (versindex == 0)
return try_to_force_load(mod, symname) == 0;
versions = (void *) sechdrs[versindex].sh_addr;
num_versions = sechdrs[versindex].sh_size
/ sizeof(struct modversion_info);
for (i = 0; i < num_versions; i++) {
u32 crcval;
if (strcmp(versions[i].name, symname) != 0)
continue;
if (IS_ENABLED(CONFIG_MODULE_REL_CRCS))
crcval = resolve_rel_crc(crc);
else
crcval = *crc;
if (versions[i].crc == crcval)
return 1;
pr_debug("Found checksum %X vs module %lX\n",
crcval, versions[i].crc);
goto bad_version;
}
/* Broken toolchain. Warn once, then let it go.. */
pr_warn_once("%s: no symbol version for %s\n", info->name, symname);
return 1;
bad_version:
pr_warn("%s: disagrees about version of symbol %s\n",
info->name, symname);
return 0;
}
static inline int check_modstruct_version(const struct load_info *info,
struct module *mod)
{
const s32 *crc;
/*
* Since this should be found in kernel (which can't be removed), no
* locking is necessary -- use preempt_disable() to placate lockdep.
*/
preempt_disable();
if (!find_symbol("module_layout", NULL, &crc, true, false)) {
preempt_enable();
BUG();
}
preempt_enable();
return check_version(info, "module_layout", mod, crc);
}
/* First part is kernel version, which we ignore if module has crcs. */
static inline int same_magic(const char *amagic, const char *bmagic,
bool has_crcs)
{
if (has_crcs) {
amagic += strcspn(amagic, " ");
bmagic += strcspn(bmagic, " ");
}
return strcmp(amagic, bmagic) == 0;
}
#else
static inline int check_version(const struct load_info *info,
const char *symname,
struct module *mod,
const s32 *crc)
{
return 1;
}
static inline int check_modstruct_version(const struct load_info *info,
struct module *mod)
{
return 1;
}
static inline int same_magic(const char *amagic, const char *bmagic,
bool has_crcs)
{
return strcmp(amagic, bmagic) == 0;
}
#endif /* CONFIG_MODVERSIONS */
/* Resolve a symbol for this module. I.e. if we find one, record usage. */
static const struct kernel_symbol *resolve_symbol(struct module *mod,
const struct load_info *info,
const char *name,
char ownername[])
{
struct module *owner;
const struct kernel_symbol *sym;
const s32 *crc;
int err;
/*
* The module_mutex should not be a heavily contended lock;
* if we get the occasional sleep here, we'll go an extra iteration
* in the wait_event_interruptible(), which is harmless.
*/
sched_annotate_sleep();
mutex_lock(&module_mutex);
sym = find_symbol(name, &owner, &crc,
!(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
if (!sym)
goto unlock;
if (!check_version(info, name, mod, crc)) {
sym = ERR_PTR(-EINVAL);
goto getname;
}
err = ref_module(mod, owner);
if (err) {
sym = ERR_PTR(err);
goto getname;
}
getname:
/* We must make copy under the lock if we failed to get ref. */
strncpy(ownername, module_name(owner), MODULE_NAME_LEN);
unlock:
mutex_unlock(&module_mutex);
return sym;
}
static const struct kernel_symbol *
resolve_symbol_wait(struct module *mod,
const struct load_info *info,
const char *name)
{
const struct kernel_symbol *ksym;
char owner[MODULE_NAME_LEN];
if (wait_event_interruptible_timeout(module_wq,
!IS_ERR(ksym = resolve_symbol(mod, info, name, owner))
|| PTR_ERR(ksym) != -EBUSY,
30 * HZ) <= 0) {
pr_warn("%s: gave up waiting for init of module %s.\n",
mod->name, owner);
}
return ksym;
}
/*
* /sys/module/foo/sections stuff
* J. Corbet <corbet@lwn.net>
*/
#ifdef CONFIG_SYSFS
#ifdef CONFIG_KALLSYMS
static inline bool sect_empty(const Elf_Shdr *sect)
{
return !(sect->sh_flags & SHF_ALLOC) || sect->sh_size == 0;
}
struct module_sect_attr {
struct module_attribute mattr;
char *name;
unsigned long address;
};
struct module_sect_attrs {
struct attribute_group grp;
unsigned int nsections;
struct module_sect_attr attrs[0];
};
static ssize_t module_sect_show(struct module_attribute *mattr,
struct module_kobject *mk, char *buf)
{
struct module_sect_attr *sattr =
container_of(mattr, struct module_sect_attr, mattr);
return sprintf(buf, "0x%px\n", kptr_restrict < 2 ?
(void *)sattr->address : NULL);
}
static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
{
unsigned int section;
for (section = 0; section < sect_attrs->nsections; section++)
kfree(sect_attrs->attrs[section].name);
kfree(sect_attrs);
}
static void add_sect_attrs(struct module *mod, const struct load_info *info)
{
unsigned int nloaded = 0, i, size[2];
struct module_sect_attrs *sect_attrs;
struct module_sect_attr *sattr;
struct attribute **gattr;
/* Count loaded sections and allocate structures */
for (i = 0; i < info->hdr->e_shnum; i++)
if (!sect_empty(&info->sechdrs[i]))
nloaded++;
size[0] = ALIGN(sizeof(*sect_attrs)
+ nloaded * sizeof(sect_attrs->attrs[0]),
sizeof(sect_attrs->grp.attrs[0]));
size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.attrs[0]);
sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
if (sect_attrs == NULL)
return;
/* Setup section attributes. */
sect_attrs->grp.name = "sections";
sect_attrs->grp.attrs = (void *)sect_attrs + size[0];
sect_attrs->nsections = 0;
sattr = &sect_attrs->attrs[0];
gattr = &sect_attrs->grp.attrs[0];
for (i = 0; i < info->hdr->e_shnum; i++) {
Elf_Shdr *sec = &info->sechdrs[i];
if (sect_empty(sec))
continue;
sattr->address = sec->sh_addr;
sattr->name = kstrdup(info->secstrings + sec->sh_name,
GFP_KERNEL);
if (sattr->name == NULL)
goto out;
sect_attrs->nsections++;
sysfs_attr_init(&sattr->mattr.attr);
sattr->mattr.show = module_sect_show;
sattr->mattr.store = NULL;
sattr->mattr.attr.name = sattr->name;
sattr->mattr.attr.mode = S_IRUSR;
*(gattr++) = &(sattr++)->mattr.attr;
}
*gattr = NULL;
if (sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp))
goto out;
mod->sect_attrs = sect_attrs;
return;
out:
free_sect_attrs(sect_attrs);
}
static void remove_sect_attrs(struct module *mod)
{
if (mod->sect_attrs) {
sysfs_remove_group(&mod->mkobj.kobj,
&mod->sect_attrs->grp);
/* We are positive that no one is using any sect attrs
* at this point. Deallocate immediately. */
free_sect_attrs(mod->sect_attrs);
mod->sect_attrs = NULL;
}
}
/*
* /sys/module/foo/notes/.section.name gives contents of SHT_NOTE sections.
*/
struct module_notes_attrs {
struct kobject *dir;
unsigned int notes;
struct bin_attribute attrs[0];
};
static ssize_t module_notes_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t pos, size_t count)
{
/*
* The caller checked the pos and count against our size.
*/
memcpy(buf, bin_attr->private + pos, count);
return count;
}
static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
unsigned int i)
{
if (notes_attrs->dir) {
while (i-- > 0)
sysfs_remove_bin_file(notes_attrs->dir,
&notes_attrs->attrs[i]);
kobject_put(notes_attrs->dir);
}
kfree(notes_attrs);
}
static void add_notes_attrs(struct module *mod, const struct load_info *info)
{
unsigned int notes, loaded, i;
struct module_notes_attrs *notes_attrs;
struct bin_attribute *nattr;
/* failed to create section attributes, so can't create notes */
if (!mod->sect_attrs)
return;
/* Count notes sections and allocate structures. */
notes = 0;
for (i = 0; i < info->hdr->e_shnum; i++)
if (!sect_empty(&info->sechdrs[i]) &&
(info->sechdrs[i].sh_type == SHT_NOTE))
++notes;
if (notes == 0)
return;
notes_attrs = kzalloc(struct_size(notes_attrs, attrs, notes),
GFP_KERNEL);
if (notes_attrs == NULL)
return;
notes_attrs->notes = notes;
nattr = &notes_attrs->attrs[0];
for (loaded = i = 0; i < info->hdr->e_shnum; ++i) {
if (sect_empty(&info->sechdrs[i]))
continue;
if (info->sechdrs[i].sh_type == SHT_NOTE) {
sysfs_bin_attr_init(nattr);
nattr->attr.name = mod->sect_attrs->attrs[loaded].name;
nattr->attr.mode = S_IRUGO;
nattr->size = info->sechdrs[i].sh_size;
nattr->private = (void *) info->sechdrs[i].sh_addr;
nattr->read = module_notes_read;
++nattr;
}
++loaded;
}
notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
if (!notes_attrs->dir)
goto out;
for (i = 0; i < notes; ++i)
if (sysfs_create_bin_file(notes_attrs->dir,
&notes_attrs->attrs[i]))
goto out;
mod->notes_attrs = notes_attrs;
return;
out:
free_notes_attrs(notes_attrs, i);
}
static void remove_notes_attrs(struct module *mod)
{
if (mod->notes_attrs)
free_notes_attrs(mod->notes_attrs, mod->notes_attrs->notes);
}
#else
static inline void add_sect_attrs(struct module *mod,
const struct load_info *info)
{
}
static inline void remove_sect_attrs(struct module *mod)
{
}
static inline void add_notes_attrs(struct module *mod,
const struct load_info *info)
{
}
static inline void remove_notes_attrs(struct module *mod)
{
}
#endif /* CONFIG_KALLSYMS */
static void del_usage_links(struct module *mod)
{
#ifdef CONFIG_MODULE_UNLOAD
struct module_use *use;
mutex_lock(&module_mutex);
list_for_each_entry(use, &mod->target_list, target_list)
sysfs_remove_link(use->target->holders_dir, mod->name);
mutex_unlock(&module_mutex);
#endif
}
static int add_usage_links(struct module *mod)
{
int ret = 0;
#ifdef CONFIG_MODULE_UNLOAD
struct module_use *use;
mutex_lock(&module_mutex);
list_for_each_entry(use, &mod->target_list, target_list) {
ret = sysfs_create_link(use->target->holders_dir,
&mod->mkobj.kobj, mod->name);
if (ret)
break;
}
mutex_unlock(&module_mutex);
if (ret)
del_usage_links(mod);
#endif
return ret;
}
static void module_remove_modinfo_attrs(struct module *mod, int end);
static int module_add_modinfo_attrs(struct module *mod)
{
struct module_attribute *attr;
struct module_attribute *temp_attr;
int error = 0;
int i;
mod->modinfo_attrs = kzalloc((sizeof(struct module_attribute) *
(ARRAY_SIZE(modinfo_attrs) + 1)),
GFP_KERNEL);
if (!mod->modinfo_attrs)
return -ENOMEM;
temp_attr = mod->modinfo_attrs;
for (i = 0; (attr = modinfo_attrs[i]); i++) {
if (!attr->test || attr->test(mod)) {
memcpy(temp_attr, attr, sizeof(*temp_attr));
sysfs_attr_init(&temp_attr->attr);
error = sysfs_create_file(&mod->mkobj.kobj,
&temp_attr->attr);
if (error)
goto error_out;
++temp_attr;
}
}
return 0;
error_out:
if (i > 0)
module_remove_modinfo_attrs(mod, --i);
else
kfree(mod->modinfo_attrs);
return error;
}
static void module_remove_modinfo_attrs(struct module *mod, int end)
{
struct module_attribute *attr;
int i;
for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) {
if (end >= 0 && i > end)
break;
/* pick a field to test for end of list */
if (!attr->attr.name)
break;
sysfs_remove_file(&mod->mkobj.kobj, &attr->attr);
if (attr->free)
attr->free(mod);
}
kfree(mod->modinfo_attrs);
}
static void mod_kobject_put(struct module *mod)
{
DECLARE_COMPLETION_ONSTACK(c);
mod->mkobj.kobj_completion = &c;
kobject_put(&mod->mkobj.kobj);
wait_for_completion(&c);
}
static int mod_sysfs_init(struct module *mod)
{
int err;
struct kobject *kobj;
if (!module_sysfs_initialized) {
pr_err("%s: module sysfs not initialized\n", mod->name);
err = -EINVAL;
goto out;
}
kobj = kset_find_obj(module_kset, mod->name);
if (kobj) {
pr_err("%s: module is already loaded\n", mod->name);
kobject_put(kobj);
err = -EINVAL;
goto out;
}
mod->mkobj.mod = mod;
memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj));
mod->mkobj.kobj.kset = module_kset;
err = kobject_init_and_add(&mod->mkobj.kobj, &module_ktype, NULL,
"%s", mod->name);
if (err)
mod_kobject_put(mod);
/* delay uevent until full sysfs population */
out:
return err;
}
static int mod_sysfs_setup(struct module *mod,
const struct load_info *info,
struct kernel_param *kparam,
unsigned int num_params)
{
int err;
err = mod_sysfs_init(mod);
if (err)
goto out;
mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
if (!mod->holders_dir) {
err = -ENOMEM;
goto out_unreg;
}
err = module_param_sysfs_setup(mod, kparam, num_params);
if (err)
goto out_unreg_holders;
err = module_add_modinfo_attrs(mod);
if (err)
goto out_unreg_param;
err = add_usage_links(mod);
if (err)
goto out_unreg_modinfo_attrs;
add_sect_attrs(mod, info);
add_notes_attrs(mod, info);
kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
return 0;
out_unreg_modinfo_attrs:
module_remove_modinfo_attrs(mod, -1);
out_unreg_param:
module_param_sysfs_remove(mod);
out_unreg_holders:
kobject_put(mod->holders_dir);
out_unreg:
mod_kobject_put(mod);
out:
return err;
}
static void mod_sysfs_fini(struct module *mod)
{
remove_notes_attrs(mod);
remove_sect_attrs(mod);
mod_kobject_put(mod);
}
static void init_param_lock(struct module *mod)
{
mutex_init(&mod->param_lock);
}
#else /* !CONFIG_SYSFS */
static int mod_sysfs_setup(struct module *mod,
const struct load_info *info,
struct kernel_param *kparam,
unsigned int num_params)
{
return 0;
}
static void mod_sysfs_fini(struct module *mod)
{
}
static void module_remove_modinfo_attrs(struct module *mod, int end)
{
}
static void del_usage_links(struct module *mod)
{
}
static void init_param_lock(struct module *mod)
{
}
#endif /* CONFIG_SYSFS */
static void mod_sysfs_teardown(struct module *mod)
{
del_usage_links(mod);
module_remove_modinfo_attrs(mod, -1);
module_param_sysfs_remove(mod);
kobject_put(mod->mkobj.drivers_dir);
kobject_put(mod->holders_dir);
mod_sysfs_fini(mod);
}
#ifdef CONFIG_ARCH_HAS_STRICT_MODULE_RWX
/*
* LKM RO/NX protection: protect module's text/ro-data
* from modification and any data from execution.
*
* General layout of module is:
* [text] [read-only-data] [ro-after-init] [writable data]
* text_size -----^ ^ ^ ^
* ro_size ------------------------| | |
* ro_after_init_size -----------------------------| |
* size -----------------------------------------------------------|
*
* These values are always page-aligned (as is base)
*/
static void frob_text(const struct module_layout *layout,
int (*set_memory)(unsigned long start, int num_pages))
{
BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
BUG_ON((unsigned long)layout->text_size & (PAGE_SIZE-1));
set_memory((unsigned long)layout->base,
layout->text_size >> PAGE_SHIFT);
}
#ifdef CONFIG_STRICT_MODULE_RWX
static void frob_rodata(const struct module_layout *layout,
int (*set_memory)(unsigned long start, int num_pages))
{
BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
BUG_ON((unsigned long)layout->text_size & (PAGE_SIZE-1));
BUG_ON((unsigned long)layout->ro_size & (PAGE_SIZE-1));
set_memory((unsigned long)layout->base + layout->text_size,
(layout->ro_size - layout->text_size) >> PAGE_SHIFT);
}
static void frob_ro_after_init(const struct module_layout *layout,
int (*set_memory)(unsigned long start, int num_pages))
{
BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
BUG_ON((unsigned long)layout->ro_size & (PAGE_SIZE-1));
BUG_ON((unsigned long)layout->ro_after_init_size & (PAGE_SIZE-1));
set_memory((unsigned long)layout->base + layout->ro_size,
(layout->ro_after_init_size - layout->ro_size) >> PAGE_SHIFT);
}
static void frob_writable_data(const struct module_layout *layout,
int (*set_memory)(unsigned long start, int num_pages))
{
BUG_ON((unsigned long)layout->base & (PAGE_SIZE-1));
BUG_ON((unsigned long)layout->ro_after_init_size & (PAGE_SIZE-1));
BUG_ON((unsigned long)layout->size & (PAGE_SIZE-1));
set_memory((unsigned long)layout->base + layout->ro_after_init_size,
(layout->size - layout->ro_after_init_size) >> PAGE_SHIFT);
}
/* livepatching wants to disable read-only so it can frob module. */
void module_disable_ro(const struct module *mod)
{
if (!rodata_enabled)
return;
frob_text(&mod->core_layout, set_memory_rw);
frob_rodata(&mod->core_layout, set_memory_rw);
frob_ro_after_init(&mod->core_layout, set_memory_rw);
frob_text(&mod->init_layout, set_memory_rw);
frob_rodata(&mod->init_layout, set_memory_rw);
}
void module_enable_ro(const struct module *mod, bool after_init)
{
if (!rodata_enabled)
return;
frob_text(&mod->core_layout, set_memory_ro);
frob_rodata(&mod->core_layout, set_memory_ro);
frob_text(&mod->init_layout, set_memory_ro);
frob_rodata(&mod->init_layout, set_memory_ro);
if (after_init)
frob_ro_after_init(&mod->core_layout, set_memory_ro);
}
static void module_enable_nx(const struct module *mod)
{
frob_rodata(&mod->core_layout, set_memory_nx);
frob_ro_after_init(&mod->core_layout, set_memory_nx);
frob_writable_data(&mod->core_layout, set_memory_nx);
frob_rodata(&mod->init_layout, set_memory_nx);
frob_writable_data(&mod->init_layout, set_memory_nx);
}
static void module_disable_nx(const struct module *mod)
{
frob_rodata(&mod->core_layout, set_memory_x);
frob_ro_after_init(&mod->core_layout, set_memory_x);
frob_writable_data(&mod->core_layout, set_memory_x);
frob_rodata(&mod->init_layout, set_memory_x);
frob_writable_data(&mod->init_layout, set_memory_x);
}
/* Iterate through all modules and set each module's text as RW */
void set_all_modules_text_rw(void)
{
struct module *mod;
if (!rodata_enabled)
return;
mutex_lock(&module_mutex);
list_for_each_entry_rcu(mod, &modules, list) {
if (mod->state == MODULE_STATE_UNFORMED)
continue;
frob_text(&mod->core_layout, set_memory_rw);
frob_text(&mod->init_layout, set_memory_rw);
}
mutex_unlock(&module_mutex);
}
/* Iterate through all modules and set each module's text as RO */
void set_all_modules_text_ro(void)
{
struct module *mod;
if (!rodata_enabled)
return;
mutex_lock(&module_mutex);
list_for_each_entry_rcu(mod, &modules, list) {
/*
* Ignore going modules since it's possible that ro
* protection has already been disabled, otherwise we'll
* run into protection faults at module deallocation.
*/
if (mod->state == MODULE_STATE_UNFORMED ||
mod->state == MODULE_STATE_GOING)
continue;
frob_text(&mod->core_layout, set_memory_ro);
frob_text(&mod->init_layout, set_memory_ro);
}
mutex_unlock(&module_mutex);
}
static void disable_ro_nx(const struct module_layout *layout)
{
if (rodata_enabled) {
frob_text(layout, set_memory_rw);
frob_rodata(layout, set_memory_rw);
frob_ro_after_init(layout, set_memory_rw);
}
frob_rodata(layout, set_memory_x);
frob_ro_after_init(layout, set_memory_x);
frob_writable_data(layout, set_memory_x);
}
#else /* !CONFIG_STRICT_MODULE_RWX */
static void disable_ro_nx(const struct module_layout *layout) { }
static void module_enable_nx(const struct module *mod) { }
static void module_disable_nx(const struct module *mod) { }
#endif /* CONFIG_STRICT_MODULE_RWX */
static void module_enable_x(const struct module *mod)
{
frob_text(&mod->core_layout, set_memory_x);
frob_text(&mod->init_layout, set_memory_x);
}
#else /* !CONFIG_ARCH_HAS_STRICT_MODULE_RWX */
static void disable_ro_nx(const struct module_layout *layout) { }
static void module_enable_nx(const struct module *mod) { }
static void module_disable_nx(const struct module *mod) { }
static void module_enable_x(const struct module *mod) { }
#endif /* CONFIG_ARCH_HAS_STRICT_MODULE_RWX */
#ifdef CONFIG_LIVEPATCH
/*
* Persist Elf information about a module. Copy the Elf header,
* section header table, section string table, and symtab section
* index from info to mod->klp_info.
*/
static int copy_module_elf(struct module *mod, struct load_info *info)
{
unsigned int size, symndx;
int ret;
size = sizeof(*mod->klp_info);
mod->klp_info = kmalloc(size, GFP_KERNEL);
if (mod->klp_info == NULL)
return -ENOMEM;
/* Elf header */
size = sizeof(mod->klp_info->hdr);
memcpy(&mod->klp_info->hdr, info->hdr, size);
/* Elf section header table */
size = sizeof(*info->sechdrs) * info->hdr->e_shnum;
mod->klp_info->sechdrs = kmemdup(info->sechdrs, size, GFP_KERNEL);
if (mod->klp_info->sechdrs == NULL) {
ret = -ENOMEM;
goto free_info;
}
/* Elf section name string table */
size = info->sechdrs[info->hdr->e_shstrndx].sh_size;
mod->klp_info->secstrings = kmemdup(info->secstrings, size, GFP_KERNEL);
if (mod->klp_info->secstrings == NULL) {
ret = -ENOMEM;
goto free_sechdrs;
}
/* Elf symbol section index */
symndx = info->index.sym;
mod->klp_info->symndx = symndx;
/*
* For livepatch modules, core_kallsyms.symtab is a complete
* copy of the original symbol table. Adjust sh_addr to point
* to core_kallsyms.symtab since the copy of the symtab in module
* init memory is freed at the end of do_init_module().
*/
mod->klp_info->sechdrs[symndx].sh_addr = \
(unsigned long) mod->core_kallsyms.symtab;
return 0;
free_sechdrs:
kfree(mod->klp_info->sechdrs);
free_info:
kfree(mod->klp_info);
return ret;
}
static void free_module_elf(struct module *mod)
{
kfree(mod->klp_info->sechdrs);
kfree(mod->klp_info->secstrings);
kfree(mod->klp_info);
}
#else /* !CONFIG_LIVEPATCH */
static int copy_module_elf(struct module *mod, struct load_info *info)
{
return 0;
}
static void free_module_elf(struct module *mod)
{
}
#endif /* CONFIG_LIVEPATCH */
void __weak module_memfree(void *module_region)
{
vfree(module_region);
}
void __weak module_arch_cleanup(struct module *mod)
{
}
void __weak module_arch_freeing_init(struct module *mod)
{
}
static void cfi_cleanup(struct module *mod);
/* Free a module, remove from lists, etc. */
static void free_module(struct module *mod)
{
trace_module_free(mod);
mod_sysfs_teardown(mod);
/* We leave it in list to prevent duplicate loads, but make sure
* that noone uses it while it's being deconstructed. */
mutex_lock(&module_mutex);
mod->state = MODULE_STATE_UNFORMED;
mutex_unlock(&module_mutex);
/* Remove dynamic debug info */
ddebug_remove_module(mod->name);
/* Arch-specific cleanup. */
module_arch_cleanup(mod);
/* Module unload stuff */
module_unload_free(mod);
/* Free any allocated parameters. */
destroy_params(mod->kp, mod->num_kp);
if (is_livepatch_module(mod))
free_module_elf(mod);
/* Now we can delete it from the lists */
mutex_lock(&module_mutex);
/* Unlink carefully: kallsyms could be walking list. */
list_del_rcu(&mod->list);
mod_tree_remove(mod);
/* Remove this module from bug list, this uses list_del_rcu */
module_bug_cleanup(mod);
/* Wait for RCU-sched synchronizing before releasing mod->list and buglist. */
synchronize_sched();
mutex_unlock(&module_mutex);
/* This may be empty, but that's OK */
disable_ro_nx(&mod->init_layout);
/* Clean up CFI for the module. */
cfi_cleanup(mod);
module_arch_freeing_init(mod);
module_memfree(mod->init_layout.base);
kfree(mod->args);
percpu_modfree(mod);
/* Free lock-classes; relies on the preceding sync_rcu(). */
lockdep_free_key_range(mod->core_layout.base, mod->core_layout.size);
/* Finally, free the core (containing the module structure) */
disable_ro_nx(&mod->core_layout);
#ifdef CONFIG_DEBUG_MODULE_LOAD_INFO
pr_info("Unloaded %s: module core layout, start: 0x%pK size: 0x%x\n",
mod->name, mod->core_layout.base, mod->core_layout.size);
#endif
module_memfree(mod->core_layout.base);
}
void *__symbol_get(const char *symbol)
{
struct module *owner;
const struct kernel_symbol *sym;
preempt_disable();
sym = find_symbol(symbol, &owner, NULL, true, true);
if (sym && strong_try_module_get(owner))
sym = NULL;
preempt_enable();
return sym ? (void *)kernel_symbol_value(sym) : NULL;
}
EXPORT_SYMBOL_GPL(__symbol_get);
/*
* Ensure that an exported symbol [global namespace] does not already exist
* in the kernel or in some other module's exported symbol table.
*
* You must hold the module_mutex.
*/
static int verify_export_symbols(struct module *mod)
{
unsigned int i;
struct module *owner;
const struct kernel_symbol *s;
struct {
const struct kernel_symbol *sym;
unsigned int num;
} arr[] = {
{ mod->syms, mod->num_syms },
{ mod->gpl_syms, mod->num_gpl_syms },
{ mod->gpl_future_syms, mod->num_gpl_future_syms },
#ifdef CONFIG_UNUSED_SYMBOLS
{ mod->unused_syms, mod->num_unused_syms },
{ mod->unused_gpl_syms, mod->num_unused_gpl_syms },
#endif
};
for (i = 0; i < ARRAY_SIZE(arr); i++) {
for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) {
if (find_symbol(kernel_symbol_name(s), &owner, NULL,
true, false)) {
pr_err("%s: exports duplicate symbol %s"
" (owned by %s)\n",
mod->name, kernel_symbol_name(s),
module_name(owner));
return -ENOEXEC;
}
}
}
return 0;
}
/* Change all symbols so that st_value encodes the pointer directly. */
static int simplify_symbols(struct module *mod, const struct load_info *info)
{
Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
Elf_Sym *sym = (void *)symsec->sh_addr;
unsigned long secbase;
unsigned int i;
int ret = 0;
const struct kernel_symbol *ksym;
for (i = 1; i < symsec->sh_size / sizeof(Elf_Sym); i++) {
const char *name = info->strtab + sym[i].st_name;
switch (sym[i].st_shndx) {
case SHN_COMMON:
/* Ignore common symbols */
if (!strncmp(name, "__gnu_lto", 9))
break;
/* We compiled with -fno-common. These are not
supposed to happen. */
pr_debug("Common symbol: %s\n", name);
pr_warn("%s: please compile with -fno-common\n",
mod->name);
ret = -ENOEXEC;
break;
case SHN_ABS:
/* Don't need to do anything */
pr_debug("Absolute symbol: 0x%08lx\n",
(long)sym[i].st_value);
break;
case SHN_LIVEPATCH:
/* Livepatch symbols are resolved by livepatch */
break;
case SHN_UNDEF:
ksym = resolve_symbol_wait(mod, info, name);
/* Ok if resolved. */
if (ksym && !IS_ERR(ksym)) {
sym[i].st_value = kernel_symbol_value(ksym);
break;
}
/* Ok if weak. */
if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
break;
ret = PTR_ERR(ksym) ?: -ENOENT;
pr_warn("%s: Unknown symbol %s (err %d)\n",
mod->name, name, ret);
break;
default:
/* Divert to percpu allocation if a percpu var. */
if (sym[i].st_shndx == info->index.pcpu)
secbase = (unsigned long)mod_percpu(mod);
else
secbase = info->sechdrs[sym[i].st_shndx].sh_addr;
sym[i].st_value += secbase;
break;
}
}
return ret;
}
static int apply_relocations(struct module *mod, const struct load_info *info)
{
unsigned int i;
int err = 0;
/* Now do relocations. */
for (i = 1; i < info->hdr->e_shnum; i++) {
unsigned int infosec = info->sechdrs[i].sh_info;
/* Not a valid relocation section? */
if (infosec >= info->hdr->e_shnum)
continue;
/* Don't bother with non-allocated sections */
if (!(info->sechdrs[infosec].sh_flags & SHF_ALLOC))
continue;
/* Livepatch relocation sections are applied by livepatch */
if (info->sechdrs[i].sh_flags & SHF_RELA_LIVEPATCH)
continue;
if (info->sechdrs[i].sh_type == SHT_REL)
err = apply_relocate(info->sechdrs, info->strtab,
info->index.sym, i, mod);
else if (info->sechdrs[i].sh_type == SHT_RELA)
err = apply_relocate_add(info->sechdrs, info->strtab,
info->index.sym, i, mod);
if (err < 0)
break;
}
return err;
}
/* Additional bytes needed by arch in front of individual sections */
unsigned int __weak arch_mod_section_prepend(struct module *mod,
unsigned int section)
{
/* default implementation just returns zero */
return 0;
}
/* Update size with this section: return offset. */
static long get_offset(struct module *mod, unsigned int *size,
Elf_Shdr *sechdr, unsigned int section)
{
long ret;
*size += arch_mod_section_prepend(mod, section);
ret = ALIGN(*size, sechdr->sh_addralign ?: 1);
*size = ret + sechdr->sh_size;
return ret;
}
/* Lay out the SHF_ALLOC sections in a way not dissimilar to how ld
might -- code, read-only data, read-write data, small data. Tally
sizes, and place the offsets into sh_entsize fields: high bit means it
belongs in init. */
static void layout_sections(struct module *mod, struct load_info *info)
{
static unsigned long const masks[][2] = {
/* NOTE: all executable code must be the first section
* in this array; otherwise modify the text_size
* finder in the two loops below */
{ SHF_EXECINSTR | SHF_ALLOC, ARCH_SHF_SMALL },
{ SHF_ALLOC, SHF_WRITE | ARCH_SHF_SMALL },
{ SHF_RO_AFTER_INIT | SHF_ALLOC, ARCH_SHF_SMALL },
{ SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL },
{ ARCH_SHF_SMALL | SHF_ALLOC, 0 }
};
unsigned int m, i;
for (i = 0; i < info->hdr->e_shnum; i++)
info->sechdrs[i].sh_entsize = ~0UL;
pr_debug("Core section allocation order:\n");
for (m = 0; m < ARRAY_SIZE(masks); ++m) {
for (i = 0; i < info->hdr->e_shnum; ++i) {
Elf_Shdr *s = &info->sechdrs[i];
const char *sname = info->secstrings + s->sh_name;
if ((s->sh_flags & masks[m][0]) != masks[m][0]
|| (s->sh_flags & masks[m][1])
|| s->sh_entsize != ~0UL
|| strstarts(sname, ".init"))
continue;
s->sh_entsize = get_offset(mod, &mod->core_layout.size, s, i);
pr_debug("\t%s\n", sname);
}
switch (m) {
case 0: /* executable */
mod->core_layout.size = debug_align(mod->core_layout.size);
mod->core_layout.text_size = mod->core_layout.size;
break;
case 1: /* RO: text and ro-data */
mod->core_layout.size = debug_align(mod->core_layout.size);
mod->core_layout.ro_size = mod->core_layout.size;
break;
case 2: /* RO after init */
mod->core_layout.size = debug_align(mod->core_layout.size);
mod->core_layout.ro_after_init_size = mod->core_layout.size;
break;
case 4: /* whole core */
mod->core_layout.size = debug_align(mod->core_layout.size);
break;
}
}
pr_debug("Init section allocation order:\n");
for (m = 0; m < ARRAY_SIZE(masks); ++m) {
for (i = 0; i < info->hdr->e_shnum; ++i) {
Elf_Shdr *s = &info->sechdrs[i];
const char *sname = info->secstrings + s->sh_name;
if ((s->sh_flags & masks[m][0]) != masks[m][0]
|| (s->sh_flags & masks[m][1])
|| s->sh_entsize != ~0UL
|| !strstarts(sname, ".init"))
continue;
s->sh_entsize = (get_offset(mod, &mod->init_layout.size, s, i)
| INIT_OFFSET_MASK);
pr_debug("\t%s\n", sname);
}
switch (m) {
case 0: /* executable */
mod->init_layout.size = debug_align(mod->init_layout.size);
mod->init_layout.text_size = mod->init_layout.size;
break;
case 1: /* RO: text and ro-data */
mod->init_layout.size = debug_align(mod->init_layout.size);
mod->init_layout.ro_size = mod->init_layout.size;
break;
case 2:
/*
* RO after init doesn't apply to init_layout (only
* core_layout), so it just takes the value of ro_size.
*/
mod->init_layout.ro_after_init_size = mod->init_layout.ro_size;
break;
case 4: /* whole init */
mod->init_layout.size = debug_align(mod->init_layout.size);
break;
}
}
}
static void set_license(struct module *mod, const char *license)
{
if (!license)
license = "unspecified";
if (!license_is_gpl_compatible(license)) {
if (!test_taint(TAINT_PROPRIETARY_MODULE))
pr_warn("%s: module license '%s' taints kernel.\n",
mod->name, license);
add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
LOCKDEP_NOW_UNRELIABLE);
}
}
/* Parse tag=value strings from .modinfo section */
static char *next_string(char *string, unsigned long *secsize)
{
/* Skip non-zero chars */
while (string[0]) {
string++;
if ((*secsize)-- <= 1)
return NULL;
}
/* Skip any zero padding. */
while (!string[0]) {
string++;
if ((*secsize)-- <= 1)
return NULL;
}
return string;
}
static char *get_modinfo(struct load_info *info, const char *tag)
{
char *p;
unsigned int taglen = strlen(tag);
Elf_Shdr *infosec = &info->sechdrs[info->index.info];
unsigned long size = infosec->sh_size;
/*
* get_modinfo() calls made before rewrite_section_headers()
* must use sh_offset, as sh_addr isn't set!
*/
for (p = (char *)info->hdr + infosec->sh_offset; p; p = next_string(p, &size)) {
if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
return p + taglen + 1;
}
return NULL;
}
static void setup_modinfo(struct module *mod, struct load_info *info)
{
struct module_attribute *attr;
int i;
for (i = 0; (attr = modinfo_attrs[i]); i++) {
if (attr->setup)
attr->setup(mod, get_modinfo(info, attr->attr.name));
}
}
static void free_modinfo(struct module *mod)
{
struct module_attribute *attr;
int i;
for (i = 0; (attr = modinfo_attrs[i]); i++) {
if (attr->free)
attr->free(mod);
}
}
#ifdef CONFIG_KALLSYMS
/* lookup symbol in given range of kernel_symbols */
static const struct kernel_symbol *lookup_symbol(const char *name,
const struct kernel_symbol *start,
const struct kernel_symbol *stop)
{
return bsearch(name, start, stop - start,
sizeof(struct kernel_symbol), cmp_name);
}
static int is_exported(const char *name, unsigned long value,
const struct module *mod)
{
const struct kernel_symbol *ks;
if (!mod)
ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab);
else
ks = lookup_symbol(name, mod->syms, mod->syms + mod->num_syms);
return ks != NULL && kernel_symbol_value(ks) == value;
}
/* As per nm */
static char elf_type(const Elf_Sym *sym, const struct load_info *info)
{
const Elf_Shdr *sechdrs = info->sechdrs;
if (ELF_ST_BIND(sym->st_info) == STB_WEAK) {
if (ELF_ST_TYPE(sym->st_info) == STT_OBJECT)
return 'v';
else
return 'w';
}
if (sym->st_shndx == SHN_UNDEF)
return 'U';
if (sym->st_shndx == SHN_ABS || sym->st_shndx == info->index.pcpu)
return 'a';
if (sym->st_shndx >= SHN_LORESERVE)
return '?';
if (sechdrs[sym->st_shndx].sh_flags & SHF_EXECINSTR)
return 't';
if (sechdrs[sym->st_shndx].sh_flags & SHF_ALLOC
&& sechdrs[sym->st_shndx].sh_type != SHT_NOBITS) {
if (!(sechdrs[sym->st_shndx].sh_flags & SHF_WRITE))
return 'r';
else if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL)
return 'g';
else
return 'd';
}
if (sechdrs[sym->st_shndx].sh_type == SHT_NOBITS) {
if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL)
return 's';
else
return 'b';
}
if (strstarts(info->secstrings + sechdrs[sym->st_shndx].sh_name,
".debug")) {
return 'n';
}
return '?';
}
static bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs,
unsigned int shnum, unsigned int pcpundx)
{
const Elf_Shdr *sec;
if (src->st_shndx == SHN_UNDEF
|| src->st_shndx >= shnum
|| !src->st_name)
return false;
#ifdef CONFIG_KALLSYMS_ALL
if (src->st_shndx == pcpundx)
return true;
#endif
sec = sechdrs + src->st_shndx;
if (!(sec->sh_flags & SHF_ALLOC)
#ifndef CONFIG_KALLSYMS_ALL
|| !(sec->sh_flags & SHF_EXECINSTR)
#endif
|| (sec->sh_entsize & INIT_OFFSET_MASK))
return false;
return true;
}
/*
* We only allocate and copy the strings needed by the parts of symtab
* we keep. This is simple, but has the effect of making multiple
* copies of duplicates. We could be more sophisticated, see
* linux-kernel thread starting with
* <73defb5e4bca04a6431392cc341112b1@localhost>.
*/
static void layout_symtab(struct module *mod, struct load_info *info)
{
Elf_Shdr *symsect = info->sechdrs + info->index.sym;
Elf_Shdr *strsect = info->sechdrs + info->index.str;
const Elf_Sym *src;
unsigned int i, nsrc, ndst, strtab_size = 0;
/* Put symbol section at end of init part of module. */
symsect->sh_flags |= SHF_ALLOC;
symsect->sh_entsize = get_offset(mod, &mod->init_layout.size, symsect,
info->index.sym) | INIT_OFFSET_MASK;
pr_debug("\t%s\n", info->secstrings + symsect->sh_name);
src = (void *)info->hdr + symsect->sh_offset;
nsrc = symsect->sh_size / sizeof(*src);
/* Compute total space required for the core symbols' strtab. */
for (ndst = i = 0; i < nsrc; i++) {
if (i == 0 || is_livepatch_module(mod) ||
is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
info->index.pcpu)) {
strtab_size += strlen(&info->strtab[src[i].st_name])+1;
ndst++;
}
}
/* Append room for core symbols at end of core part. */
info->symoffs = ALIGN(mod->core_layout.size, symsect->sh_addralign ?: 1);
info->stroffs = mod->core_layout.size = info->symoffs + ndst * sizeof(Elf_Sym);
mod->core_layout.size += strtab_size;
mod->core_layout.size = debug_align(mod->core_layout.size);
/* Put string table section at end of init part of module. */
strsect->sh_flags |= SHF_ALLOC;
strsect->sh_entsize = get_offset(mod, &mod->init_layout.size, strsect,
info->index.str) | INIT_OFFSET_MASK;
pr_debug("\t%s\n", info->secstrings + strsect->sh_name);
/* We'll tack temporary mod_kallsyms on the end. */
mod->init_layout.size = ALIGN(mod->init_layout.size,
__alignof__(struct mod_kallsyms));
info->mod_kallsyms_init_off = mod->init_layout.size;
mod->init_layout.size += sizeof(struct mod_kallsyms);
mod->init_layout.size = debug_align(mod->init_layout.size);
}
/*
* We use the full symtab and strtab which layout_symtab arranged to
* be appended to the init section. Later we switch to the cut-down
* core-only ones.
*/
static void add_kallsyms(struct module *mod, const struct load_info *info)
{
unsigned int i, ndst;
const Elf_Sym *src;
Elf_Sym *dst;
char *s;
Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
/* Set up to point into init section. */
mod->kallsyms = mod->init_layout.base + info->mod_kallsyms_init_off;
mod->kallsyms->symtab = (void *)symsec->sh_addr;
mod->kallsyms->num_symtab = symsec->sh_size / sizeof(Elf_Sym);
/* Make sure we get permanent strtab: don't use info->strtab. */
mod->kallsyms->strtab = (void *)info->sechdrs[info->index.str].sh_addr;
/* Set types up while we still have access to sections. */
for (i = 0; i < mod->kallsyms->num_symtab; i++)
mod->kallsyms->symtab[i].st_info
= elf_type(&mod->kallsyms->symtab[i], info);
/* Now populate the cut down core kallsyms for after init. */
mod->core_kallsyms.symtab = dst = mod->core_layout.base + info->symoffs;
mod->core_kallsyms.strtab = s = mod->core_layout.base + info->stroffs;
src = mod->kallsyms->symtab;
for (ndst = i = 0; i < mod->kallsyms->num_symtab; i++) {
if (i == 0 || is_livepatch_module(mod) ||
is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
info->index.pcpu)) {
dst[ndst] = src[i];
dst[ndst++].st_name = s - mod->core_kallsyms.strtab;
s += strlcpy(s, &mod->kallsyms->strtab[src[i].st_name],
KSYM_NAME_LEN) + 1;
}
}
mod->core_kallsyms.num_symtab = ndst;
}
#else
static inline void layout_symtab(struct module *mod, struct load_info *info)
{
}
static void add_kallsyms(struct module *mod, const struct load_info *info)
{
}
#endif /* CONFIG_KALLSYMS */
static void dynamic_debug_setup(struct module *mod, struct _ddebug *debug, unsigned int num)
{
if (!debug)
return;
#ifdef CONFIG_DYNAMIC_DEBUG
if (ddebug_add_module(debug, num, mod->name))
pr_err("dynamic debug error adding module: %s\n",
debug->modname);
#endif
}
static void dynamic_debug_remove(struct module *mod, struct _ddebug *debug)
{
if (debug)
ddebug_remove_module(mod->name);
}
void * __weak module_alloc(unsigned long size)
{
return vmalloc_exec(size);
}
#ifdef CONFIG_DEBUG_KMEMLEAK
static void kmemleak_load_module(const struct module *mod,
const struct load_info *info)
{
unsigned int i;
/* only scan the sections containing data */
kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
for (i = 1; i < info->hdr->e_shnum; i++) {
/* Scan all writable sections that's not executable */
if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) ||
!(info->sechdrs[i].sh_flags & SHF_WRITE) ||
(info->sechdrs[i].sh_flags & SHF_EXECINSTR))
continue;
kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
info->sechdrs[i].sh_size, GFP_KERNEL);
}
}
#else
static inline void kmemleak_load_module(const struct module *mod,
const struct load_info *info)
{
}
#endif
#ifdef CONFIG_MODULE_SIG
static int module_sig_check(struct load_info *info, int flags)
{
int err = -ENOKEY;
const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1;
const void *mod = info->hdr;
/*
* Require flags == 0, as a module with version information
* removed is no longer the module that was signed
*/
if (flags == 0 &&
info->len > markerlen &&
memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) {
/* We truncate the module to discard the signature */
info->len -= markerlen;
err = mod_verify_sig(mod, info);
}
if (!err) {
info->sig_ok = true;
return 0;
}
/* Not having a signature is only an error if we're strict. */
if (err == -ENOKEY && !is_module_sig_enforced())
err = 0;
return err;
}
#else /* !CONFIG_MODULE_SIG */
static int module_sig_check(struct load_info *info, int flags)
{
return 0;
}
#endif /* !CONFIG_MODULE_SIG */
/* Sanity checks against invalid binaries, wrong arch, weird elf version. */
static int elf_header_check(struct load_info *info)
{
if (info->len < sizeof(*(info->hdr)))
return -ENOEXEC;
if (memcmp(info->hdr->e_ident, ELFMAG, SELFMAG) != 0
|| info->hdr->e_type != ET_REL
|| !elf_check_arch(info->hdr)
|| info->hdr->e_shentsize != sizeof(Elf_Shdr))
return -ENOEXEC;
if (info->hdr->e_shoff >= info->len
|| (info->hdr->e_shnum * sizeof(Elf_Shdr) >
info->len - info->hdr->e_shoff))
return -ENOEXEC;
return 0;
}
#define COPY_CHUNK_SIZE (16*PAGE_SIZE)
static int copy_chunked_from_user(void *dst, const void __user *usrc, unsigned long len)
{
do {
unsigned long n = min(len, COPY_CHUNK_SIZE);
if (copy_from_user(dst, usrc, n) != 0)
return -EFAULT;
cond_resched();
dst += n;
usrc += n;
len -= n;
} while (len);
return 0;
}
#ifdef CONFIG_LIVEPATCH
static int check_modinfo_livepatch(struct module *mod, struct load_info *info)
{
if (get_modinfo(info, "livepatch")) {
mod->klp = true;
add_taint_module(mod, TAINT_LIVEPATCH, LOCKDEP_STILL_OK);
pr_notice_once("%s: tainting kernel with TAINT_LIVEPATCH\n",
mod->name);
}
return 0;
}
#else /* !CONFIG_LIVEPATCH */
static int check_modinfo_livepatch(struct module *mod, struct load_info *info)
{
if (get_modinfo(info, "livepatch")) {
pr_err("%s: module is marked as livepatch module, but livepatch support is disabled",
mod->name);
return -ENOEXEC;
}
return 0;
}
#endif /* CONFIG_LIVEPATCH */
static void check_modinfo_retpoline(struct module *mod, struct load_info *info)
{
if (retpoline_module_ok(get_modinfo(info, "retpoline")))
return;
pr_warn("%s: loading module not compiled with retpoline compiler.\n",
mod->name);
}
/* Sets info->hdr and info->len. */
static int copy_module_from_user(const void __user *umod, unsigned long len,
struct load_info *info)
{
int err;
info->len = len;
if (info->len < sizeof(*(info->hdr)))
return -ENOEXEC;
err = security_kernel_load_data(LOADING_MODULE);
if (err)
return err;
/* Suck in entire file: we'll want most of it. */
info->hdr = __vmalloc(info->len,
GFP_KERNEL | __GFP_NOWARN, PAGE_KERNEL);
if (!info->hdr)
return -ENOMEM;
if (copy_chunked_from_user(info->hdr, umod, info->len) != 0) {
vfree(info->hdr);
return -EFAULT;
}
return 0;
}
static void free_copy(struct load_info *info)
{
vfree(info->hdr);
}
static int rewrite_section_headers(struct load_info *info, int flags)
{
unsigned int i;
/* This should always be true, but let's be sure. */
info->sechdrs[0].sh_addr = 0;
for (i = 1; i < info->hdr->e_shnum; i++) {
Elf_Shdr *shdr = &info->sechdrs[i];
if (shdr->sh_type != SHT_NOBITS
&& info->len < shdr->sh_offset + shdr->sh_size) {
pr_err("Module len %lu truncated\n", info->len);
return -ENOEXEC;
}
/* Mark all sections sh_addr with their address in the
temporary image. */
shdr->sh_addr = (size_t)info->hdr + shdr->sh_offset;
#ifndef CONFIG_MODULE_UNLOAD
/* Don't load .exit sections */
if (strstarts(info->secstrings+shdr->sh_name, ".exit"))
shdr->sh_flags &= ~(unsigned long)SHF_ALLOC;
#endif
}
/* Track but don't keep modinfo and version sections. */
info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC;
info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC;
return 0;
}
/*
* Set up our basic convenience variables (pointers to section headers,
* search for module section index etc), and do some basic section
* verification.
*
* Set info->mod to the temporary copy of the module in info->hdr. The final one
* will be allocated in move_module().
*/
static int setup_load_info(struct load_info *info, int flags)
{
unsigned int i;
/* Set up the convenience variables */
info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;
info->secstrings = (void *)info->hdr
+ info->sechdrs[info->hdr->e_shstrndx].sh_offset;
/* Try to find a name early so we can log errors with a module name */
info->index.info = find_sec(info, ".modinfo");
if (info->index.info)
info->name = get_modinfo(info, "name");
/* Find internal symbols and strings. */
for (i = 1; i < info->hdr->e_shnum; i++) {
if (info->sechdrs[i].sh_type == SHT_SYMTAB) {
info->index.sym = i;
info->index.str = info->sechdrs[i].sh_link;
info->strtab = (char *)info->hdr
+ info->sechdrs[info->index.str].sh_offset;
break;
}
}
if (info->index.sym == 0) {
pr_warn("%s: module has no symbols (stripped?)\n",
info->name ?: "(missing .modinfo section or name field)");
return -ENOEXEC;
}
info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
if (!info->index.mod) {
pr_warn("%s: No module found in object\n",
info->name ?: "(missing .modinfo section or name field)");
return -ENOEXEC;
}
/* This is temporary: point mod into copy of data. */
info->mod = (void *)info->hdr + info->sechdrs[info->index.mod].sh_offset;
/*
* If we didn't load the .modinfo 'name' field earlier, fall back to
* on-disk struct mod 'name' field.
*/
if (!info->name)
info->name = info->mod->name;
if (flags & MODULE_INIT_IGNORE_MODVERSIONS)
info->index.vers = 0; /* Pretend no __versions section! */
else
info->index.vers = find_sec(info, "__versions");
info->index.pcpu = find_pcpusec(info);
return 0;
}
static int check_modinfo(struct module *mod, struct load_info *info, int flags)
{
const char *modmagic = get_modinfo(info, "vermagic");
int err;
if (flags & MODULE_INIT_IGNORE_VERMAGIC)
modmagic = NULL;
/* This is allowed: modprobe --force will invalidate it. */
if (!modmagic) {
err = try_to_force_load(mod, "bad vermagic");
if (err)
return err;
} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
pr_err("%s: version magic '%s' should be '%s'\n",
info->name, modmagic, vermagic);
return -ENOEXEC;
}
if (!get_modinfo(info, "intree")) {
if (!test_taint(TAINT_OOT_MODULE))
pr_warn("%s: loading out-of-tree module taints kernel.\n",
mod->name);
add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
}
check_modinfo_retpoline(mod, info);
if (get_modinfo(info, "staging")) {
add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
pr_warn("%s: module is from the staging directory, the quality "
"is unknown, you have been warned.\n", mod->name);
}
err = check_modinfo_livepatch(mod, info);
if (err)
return err;
/* Set up license info based on the info section */
set_license(mod, get_modinfo(info, "license"));
return 0;
}
static int find_module_sections(struct module *mod, struct load_info *info)
{
mod->kp = section_objs(info, "__param",
sizeof(*mod->kp), &mod->num_kp);
mod->syms = section_objs(info, "__ksymtab",
sizeof(*mod->syms), &mod->num_syms);
mod->crcs = section_addr(info, "__kcrctab");
mod->gpl_syms = section_objs(info, "__ksymtab_gpl",
sizeof(*mod->gpl_syms),
&mod->num_gpl_syms);
mod->gpl_crcs = section_addr(info, "__kcrctab_gpl");
mod->gpl_future_syms = section_objs(info,
"__ksymtab_gpl_future",
sizeof(*mod->gpl_future_syms),
&mod->num_gpl_future_syms);
mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future");
#ifdef CONFIG_UNUSED_SYMBOLS
mod->unused_syms = section_objs(info, "__ksymtab_unused",
sizeof(*mod->unused_syms),
&mod->num_unused_syms);
mod->unused_crcs = section_addr(info, "__kcrctab_unused");
mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl",
sizeof(*mod->unused_gpl_syms),
&mod->num_unused_gpl_syms);
mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");
#endif
#ifdef CONFIG_CONSTRUCTORS
mod->ctors = section_objs(info, ".ctors",
sizeof(*mod->ctors), &mod->num_ctors);
if (!mod->ctors)
mod->ctors = section_objs(info, ".init_array",
sizeof(*mod->ctors), &mod->num_ctors);
else if (find_sec(info, ".init_array")) {
/*
* This shouldn't happen with same compiler and binutils
* building all parts of the module.
*/
pr_warn("%s: has both .ctors and .init_array.\n",
mod->name);
return -EINVAL;
}
#endif
#ifdef CONFIG_TRACEPOINTS
mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
sizeof(*mod->tracepoints_ptrs),
&mod->num_tracepoints);
#endif
#ifdef CONFIG_JUMP_LABEL
mod->jump_entries = section_objs(info, "__jump_table",
sizeof(*mod->jump_entries),
&mod->num_jump_entries);
#endif
#ifdef CONFIG_EVENT_TRACING
mod->trace_events = section_objs(info, "_ftrace_events",
sizeof(*mod->trace_events),
&mod->num_trace_events);
mod->trace_evals = section_objs(info, "_ftrace_eval_map",
sizeof(*mod->trace_evals),
&mod->num_trace_evals);
#endif
#ifdef CONFIG_TRACING
mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",
sizeof(*mod->trace_bprintk_fmt_start),
&mod->num_trace_bprintk_fmt);
#endif
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
/* sechdrs[0].sh_size is always zero */
mod->ftrace_callsites = section_objs(info, "__mcount_loc",
sizeof(*mod->ftrace_callsites),
&mod->num_ftrace_callsites);
#endif
#ifdef CONFIG_FUNCTION_ERROR_INJECTION
mod->ei_funcs = section_objs(info, "_error_injection_whitelist",
sizeof(*mod->ei_funcs),
&mod->num_ei_funcs);
#endif
mod->extable = section_objs(info, "__ex_table",
sizeof(*mod->extable), &mod->num_exentries);
if (section_addr(info, "__obsparm"))
pr_warn("%s: Ignoring obsolete parameters\n", mod->name);
info->debug = section_objs(info, "__verbose",
sizeof(*info->debug), &info->num_debug);
return 0;
}
static int move_module(struct module *mod, struct load_info *info)
{
int i;
void *ptr;
/* Do the allocs. */
ptr = module_alloc(mod->core_layout.size);
/*
* The pointer to this block is stored in the module structure
* which is inside the block. Just mark it as not being a
* leak.
*/
kmemleak_not_leak(ptr);
if (!ptr)
return -ENOMEM;
memset(ptr, 0, mod->core_layout.size);
mod->core_layout.base = ptr;
if (mod->init_layout.size) {
ptr = module_alloc(mod->init_layout.size);
/*
* The pointer to this block is stored in the module structure
* which is inside the block. This block doesn't need to be
* scanned as it contains data and code that will be freed
* after the module is initialized.
*/
kmemleak_ignore(ptr);
if (!ptr) {
module_memfree(mod->core_layout.base);
return -ENOMEM;
}
memset(ptr, 0, mod->init_layout.size);
mod->init_layout.base = ptr;
} else
mod->init_layout.base = NULL;
/* Transfer each section which specifies SHF_ALLOC */
pr_debug("final section addresses:\n");
for (i = 0; i < info->hdr->e_shnum; i++) {
void *dest;
Elf_Shdr *shdr = &info->sechdrs[i];
if (!(shdr->sh_flags & SHF_ALLOC))
continue;
if (shdr->sh_entsize & INIT_OFFSET_MASK)
dest = mod->init_layout.base
+ (shdr->sh_entsize & ~INIT_OFFSET_MASK);
else
dest = mod->core_layout.base + shdr->sh_entsize;
if (shdr->sh_type != SHT_NOBITS)
memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);
/* Update sh_addr to point to copy in image. */
shdr->sh_addr = (unsigned long)dest;
pr_debug("\t0x%lx %s\n",
(long)shdr->sh_addr, info->secstrings + shdr->sh_name);
}
return 0;
}
static int check_module_license_and_versions(struct module *mod)
{
int prev_taint = test_taint(TAINT_PROPRIETARY_MODULE);
/*
* ndiswrapper is under GPL by itself, but loads proprietary modules.
* Don't use add_taint_module(), as it would prevent ndiswrapper from
* using GPL-only symbols it needs.
*/
if (strcmp(mod->name, "ndiswrapper") == 0)
add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE);
/* driverloader was caught wrongly pretending to be under GPL */
if (strcmp(mod->name, "driverloader") == 0)
add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
LOCKDEP_NOW_UNRELIABLE);
/* lve claims to be GPL but upstream won't provide source */
if (strcmp(mod->name, "lve") == 0)
add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
LOCKDEP_NOW_UNRELIABLE);
if (!prev_taint && test_taint(TAINT_PROPRIETARY_MODULE))
pr_warn("%s: module license taints kernel.\n", mod->name);
#ifdef CONFIG_MODVERSIONS
if ((mod->num_syms && !mod->crcs)
|| (mod->num_gpl_syms && !mod->gpl_crcs)
|| (mod->num_gpl_future_syms && !mod->gpl_future_crcs)
#ifdef CONFIG_UNUSED_SYMBOLS
|| (mod->num_unused_syms && !mod->unused_crcs)
|| (mod->num_unused_gpl_syms && !mod->unused_gpl_crcs)
#endif
) {
return try_to_force_load(mod,
"no versions for exported symbols");
}
#endif
return 0;
}
static void flush_module_icache(const struct module *mod)
{
mm_segment_t old_fs;
/* flush the icache in correct context */
old_fs = get_fs();
set_fs(KERNEL_DS);
/*
* Flush the instruction cache, since we've played with text.
* Do it before processing of module parameters, so the module
* can provide parameter accessor functions of its own.
*/
if (mod->init_layout.base)
flush_icache_range((unsigned long)mod->init_layout.base,
(unsigned long)mod->init_layout.base
+ mod->init_layout.size);
flush_icache_range((unsigned long)mod->core_layout.base,
(unsigned long)mod->core_layout.base + mod->core_layout.size);
set_fs(old_fs);
}
int __weak module_frob_arch_sections(Elf_Ehdr *hdr,
Elf_Shdr *sechdrs,
char *secstrings,
struct module *mod)
{
return 0;
}
/* module_blacklist is a comma-separated list of module names */
static char *module_blacklist;
static bool blacklisted(const char *module_name)
{
const char *p;
size_t len;
if (!module_blacklist)
return false;
for (p = module_blacklist; *p; p += len) {
len = strcspn(p, ",");
if (strlen(module_name) == len && !memcmp(module_name, p, len))
return true;
if (p[len] == ',')
len++;
}
return false;
}
core_param(module_blacklist, module_blacklist, charp, 0400);
static struct module *layout_and_allocate(struct load_info *info, int flags)
{
struct module *mod;
unsigned int ndx;
int err;
err = check_modinfo(info->mod, info, flags);
if (err)
return ERR_PTR(err);
/* Allow arches to frob section contents and sizes. */
err = module_frob_arch_sections(info->hdr, info->sechdrs,
info->secstrings, info->mod);
if (err < 0)
return ERR_PTR(err);
/* We will do a special allocation for per-cpu sections later. */
info->sechdrs[info->index.pcpu].sh_flags &= ~(unsigned long)SHF_ALLOC;
/*
* Mark ro_after_init section with SHF_RO_AFTER_INIT so that
* layout_sections() can put it in the right place.
* Note: ro_after_init sections also have SHF_{WRITE,ALLOC} set.
*/
ndx = find_sec(info, ".data..ro_after_init");
if (ndx)
info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT;
/* Determine total sizes, and put offsets in sh_entsize. For now
this is done generically; there doesn't appear to be any
special cases for the architectures. */
layout_sections(info->mod, info);
layout_symtab(info->mod, info);
/* Allocate and move to the final place */
err = move_module(info->mod, info);
if (err)
return ERR_PTR(err);
/* Module has been copied to its final place now: return it. */
mod = (void *)info->sechdrs[info->index.mod].sh_addr;
kmemleak_load_module(mod, info);
return mod;
}
/* mod is no longer valid after this! */
static void module_deallocate(struct module *mod, struct load_info *info)
{
percpu_modfree(mod);
module_arch_freeing_init(mod);
module_memfree(mod->init_layout.base);
module_memfree(mod->core_layout.base);
}
int __weak module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
return 0;
}
static void cfi_init(struct module *mod);
static int post_relocation(struct module *mod, const struct load_info *info)
{
/* Sort exception table now relocations are done. */
sort_extable(mod->extable, mod->extable + mod->num_exentries);
/* Copy relocated percpu area over. */
percpu_modcopy(mod, (void *)info->sechdrs[info->index.pcpu].sh_addr,
info->sechdrs[info->index.pcpu].sh_size);
/* Setup kallsyms-specific fields. */
add_kallsyms(mod, info);
/* Setup CFI for the module. */
cfi_init(mod);
/* Arch-specific module finalizing. */
return module_finalize(info->hdr, info->sechdrs, mod);
}
/* Is this module of this name done loading? No locks held. */
static bool finished_loading(const char *name)
{
struct module *mod;
bool ret;
/*
* The module_mutex should not be a heavily contended lock;
* if we get the occasional sleep here, we'll go an extra iteration
* in the wait_event_interruptible(), which is harmless.
*/
sched_annotate_sleep();
mutex_lock(&module_mutex);
mod = find_module_all(name, strlen(name), true);
ret = !mod || mod->state == MODULE_STATE_LIVE;
mutex_unlock(&module_mutex);
return ret;
}
/* Call module constructors. */
static void do_mod_ctors(struct module *mod)
{
#ifdef CONFIG_CONSTRUCTORS
unsigned long i;
for (i = 0; i < mod->num_ctors; i++)
mod->ctors[i]();
#endif
}
/* For freeing module_init on success, in case kallsyms traversing */
struct mod_initfree {
struct rcu_head rcu;
void *module_init;
};
static void do_free_init(struct rcu_head *head)
{
struct mod_initfree *m = container_of(head, struct mod_initfree, rcu);
module_memfree(m->module_init);
kfree(m);
}
/*
* This is where the real work happens.
*
* Keep it uninlined to provide a reliable breakpoint target, e.g. for the gdb
* helper command 'lx-symbols'.
*/
static noinline int do_init_module(struct module *mod)
{
int ret = 0;
struct mod_initfree *freeinit;
freeinit = kmalloc(sizeof(*freeinit), GFP_KERNEL);
if (!freeinit) {
ret = -ENOMEM;
goto fail;
}
freeinit->module_init = mod->init_layout.base;
/*
* We want to find out whether @mod uses async during init. Clear
* PF_USED_ASYNC. async_schedule*() will set it.
*/
current->flags &= ~PF_USED_ASYNC;
do_mod_ctors(mod);
/* Start the module */
if (mod->init != NULL)
ret = do_one_initcall(mod->init);
if (ret < 0) {
goto fail_free_freeinit;
}
if (ret > 0) {
pr_warn("%s: '%s'->init suspiciously returned %d, it should "
"follow 0/-E convention\n"
"%s: loading module anyway...\n",
__func__, mod->name, ret, __func__);
dump_stack();
}
/* Now it's a first class citizen! */
mod->state = MODULE_STATE_LIVE;
blocking_notifier_call_chain(&module_notify_list,
MODULE_STATE_LIVE, mod);
/*
* We need to finish all async code before the module init sequence
* is done. This has potential to deadlock. For example, a newly
* detected block device can trigger request_module() of the
* default iosched from async probing task. Once userland helper
* reaches here, async_synchronize_full() will wait on the async
* task waiting on request_module() and deadlock.
*
* This deadlock is avoided by perfomring async_synchronize_full()
* iff module init queued any async jobs. This isn't a full
* solution as it will deadlock the same if module loading from
* async jobs nests more than once; however, due to the various
* constraints, this hack seems to be the best option for now.
* Please refer to the following thread for details.
*
* http://thread.gmane.org/gmane.linux.kernel/1420814
*/
if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
async_synchronize_full();
ftrace_free_mem(mod, mod->init_layout.base, mod->init_layout.base +
mod->init_layout.size);
mutex_lock(&module_mutex);
/* Drop initial reference. */
module_put(mod);
trim_init_extable(mod);
#ifdef CONFIG_KALLSYMS
/* Switch to core kallsyms now init is done: kallsyms may be walking! */
rcu_assign_pointer(mod->kallsyms, &mod->core_kallsyms);
#endif
module_enable_ro(mod, true);
mod_tree_remove_init(mod);
disable_ro_nx(&mod->init_layout);
module_arch_freeing_init(mod);
mod->init_layout.base = NULL;
mod->init_layout.size = 0;
mod->init_layout.ro_size = 0;
mod->init_layout.ro_after_init_size = 0;
mod->init_layout.text_size = 0;
/*
* We want to free module_init, but be aware that kallsyms may be
* walking this with preempt disabled. In all the failure paths, we
* call synchronize_sched(), but we don't want to slow down the success
* path, so use actual RCU here.
* Note that module_alloc() on most architectures creates W+X page
* mappings which won't be cleaned up until do_free_init() runs. Any
* code such as mark_rodata_ro() which depends on those mappings to
* be cleaned up needs to sync with the queued work - ie
* rcu_barrier_sched()
*/
call_rcu_sched(&freeinit->rcu, do_free_init);
mutex_unlock(&module_mutex);
wake_up_all(&module_wq);
return 0;
fail_free_freeinit:
kfree(freeinit);
fail:
/* Try to protect us from buggy refcounters. */
mod->state = MODULE_STATE_GOING;
synchronize_sched();
module_put(mod);
blocking_notifier_call_chain(&module_notify_list,
MODULE_STATE_GOING, mod);
klp_module_going(mod);
ftrace_release_mod(mod);
free_module(mod);
wake_up_all(&module_wq);
return ret;
}
static int may_init_module(void)
{
if (!capable(CAP_SYS_MODULE) || modules_disabled)
return -EPERM;
return 0;
}
/*
* We try to place it in the list now to make sure it's unique before
* we dedicate too many resources. In particular, temporary percpu
* memory exhaustion.
*/
static int add_unformed_module(struct module *mod)
{
int err;
struct module *old;
mod->state = MODULE_STATE_UNFORMED;
again:
mutex_lock(&module_mutex);
old = find_module_all(mod->name, strlen(mod->name), true);
if (old != NULL) {
if (old->state != MODULE_STATE_LIVE) {
/* Wait in case it fails to load. */
mutex_unlock(&module_mutex);
err = wait_event_interruptible(module_wq,
finished_loading(mod->name));
if (err)
goto out_unlocked;
goto again;
}
err = -EEXIST;
goto out;
}
mod_update_bounds(mod);
list_add_rcu(&mod->list, &modules);
mod_tree_insert(mod);
err = 0;
out:
mutex_unlock(&module_mutex);
out_unlocked:
return err;
}
static int complete_formation(struct module *mod, struct load_info *info)
{
int err;
mutex_lock(&module_mutex);
/* Find duplicate symbols (must be called under lock). */
err = verify_export_symbols(mod);
if (err < 0)
goto out;
/* This relies on module_mutex for list integrity. */
module_bug_finalize(info->hdr, info->sechdrs, mod);
module_enable_ro(mod, false);
module_enable_nx(mod);
module_enable_x(mod);
/* Mark state as coming so strong_try_module_get() ignores us,
* but kallsyms etc. can see us. */
mod->state = MODULE_STATE_COMING;
mutex_unlock(&module_mutex);
return 0;
out:
mutex_unlock(&module_mutex);
return err;
}
static int prepare_coming_module(struct module *mod)
{
int err;
ftrace_module_enable(mod);
err = klp_module_coming(mod);
if (err)
return err;
blocking_notifier_call_chain(&module_notify_list,
MODULE_STATE_COMING, mod);
return 0;
}
static int unknown_module_param_cb(char *param, char *val, const char *modname,
void *arg)
{
struct module *mod = arg;
int ret;
if (strcmp(param, "async_probe") == 0) {
mod->async_probe_requested = true;
return 0;
}
/* Check for magic 'dyndbg' arg */
ret = ddebug_dyndbg_module_param_cb(param, val, modname);
if (ret != 0)
pr_warn("%s: unknown parameter '%s' ignored\n", modname, param);
return 0;
}
/* Allocate and load the module: note that size of section 0 is always
zero, and we rely on this for optional sections. */
static int load_module(struct load_info *info, const char __user *uargs,
int flags)
{
struct module *mod;
long err = 0;
char *after_dashes;
err = elf_header_check(info);
if (err)
goto free_copy;
err = setup_load_info(info, flags);
if (err)
goto free_copy;
if (blacklisted(info->name)) {
err = -EPERM;
goto free_copy;
}
err = module_sig_check(info, flags);
if (err)
goto free_copy;
err = rewrite_section_headers(info, flags);
if (err)
goto free_copy;
/* Check module struct version now, before we try to use module. */
if (!check_modstruct_version(info, info->mod)) {
err = -ENOEXEC;
goto free_copy;
}
/* Figure out module layout, and allocate all the memory. */
mod = layout_and_allocate(info, flags);
if (IS_ERR(mod)) {
err = PTR_ERR(mod);
goto free_copy;
}
audit_log_kern_module(mod->name);
/* Reserve our place in the list. */
err = add_unformed_module(mod);
if (err)
goto free_module;
#ifdef CONFIG_MODULE_SIG
mod->sig_ok = info->sig_ok;
if (!mod->sig_ok) {
pr_notice_once("%s: module verification failed: signature "
"and/or required key missing - tainting "
"kernel\n", mod->name);
add_taint_module(mod, TAINT_UNSIGNED_MODULE, LOCKDEP_STILL_OK);
}
#endif
/* To avoid stressing percpu allocator, do this once we're unique. */
err = percpu_modalloc(mod, info);
if (err)
goto unlink_mod;
/* Now module is in final location, initialize linked lists, etc. */
err = module_unload_init(mod);
if (err)
goto unlink_mod;
init_param_lock(mod);
/* Now we've got everything in the final locations, we can
* find optional sections. */
err = find_module_sections(mod, info);
if (err)
goto free_unload;
err = check_module_license_and_versions(mod);
if (err)
goto free_unload;
/* Set up MODINFO_ATTR fields */
setup_modinfo(mod, info);
/* Fix up syms, so that st_value is a pointer to location. */
err = simplify_symbols(mod, info);
if (err < 0)
goto free_modinfo;
err = apply_relocations(mod, info);
if (err < 0)
goto free_modinfo;
err = post_relocation(mod, info);
if (err < 0)
goto free_modinfo;
flush_module_icache(mod);
/* Now copy in args */
mod->args = strndup_user(uargs, ~0UL >> 1);
if (IS_ERR(mod->args)) {
err = PTR_ERR(mod->args);
goto free_arch_cleanup;
}
dynamic_debug_setup(mod, info->debug, info->num_debug);
/* Ftrace init must be called in the MODULE_STATE_UNFORMED state */
ftrace_module_init(mod);
/* Finally it's fully formed, ready to start executing. */
err = complete_formation(mod, info);
if (err)
goto ddebug_cleanup;
err = prepare_coming_module(mod);
if (err)
goto bug_cleanup;
/* Module is ready to execute: parsing args may do that. */
after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
-32768, 32767, mod,
unknown_module_param_cb);
if (IS_ERR(after_dashes)) {
err = PTR_ERR(after_dashes);
goto coming_cleanup;
} else if (after_dashes) {
pr_warn("%s: parameters '%s' after `--' ignored\n",
mod->name, after_dashes);
}
/* Link in to sysfs. */
err = mod_sysfs_setup(mod, info, mod->kp, mod->num_kp);
if (err < 0)
goto coming_cleanup;
if (is_livepatch_module(mod)) {
err = copy_module_elf(mod, info);
if (err < 0)
goto sysfs_cleanup;
}
/* Get rid of temporary copy. */
free_copy(info);
/* Done! */
trace_module_load(mod);
return do_init_module(mod);
sysfs_cleanup:
mod_sysfs_teardown(mod);
coming_cleanup:
mod->state = MODULE_STATE_GOING;
destroy_params(mod->kp, mod->num_kp);
blocking_notifier_call_chain(&module_notify_list,
MODULE_STATE_GOING, mod);
klp_module_going(mod);
bug_cleanup:
/* module_bug_cleanup needs module_mutex protection */
mutex_lock(&module_mutex);
module_bug_cleanup(mod);
mutex_unlock(&module_mutex);
/* we can't deallocate the module until we clear memory protection */
module_disable_ro(mod);
module_disable_nx(mod);
ddebug_cleanup:
ftrace_release_mod(mod);
dynamic_debug_remove(mod, info->debug);
synchronize_sched();
kfree(mod->args);
free_arch_cleanup:
module_arch_cleanup(mod);
free_modinfo:
free_modinfo(mod);
free_unload:
module_unload_free(mod);
unlink_mod:
mutex_lock(&module_mutex);
/* Unlink carefully: kallsyms could be walking list. */
list_del_rcu(&mod->list);
mod_tree_remove(mod);
wake_up_all(&module_wq);
/* Wait for RCU-sched synchronizing before releasing mod->list. */
synchronize_sched();
mutex_unlock(&module_mutex);
free_module:
/* Free lock-classes; relies on the preceding sync_rcu() */
lockdep_free_key_range(mod->core_layout.base, mod->core_layout.size);
module_deallocate(mod, info);
free_copy:
free_copy(info);
return err;
}
SYSCALL_DEFINE3(init_module, void __user *, umod,
unsigned long, len, const char __user *, uargs)
{
int err;
struct load_info info = { };
err = may_init_module();
if (err)
return err;
pr_debug("init_module: umod=%p, len=%lu, uargs=%p\n",
umod, len, uargs);
err = copy_module_from_user(umod, len, &info);
if (err)
return err;
return load_module(&info, uargs, 0);
}
SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)
{
struct load_info info = { };
loff_t size;
void *hdr;
int err;
err = may_init_module();
if (err)
return err;
pr_debug("finit_module: fd=%d, uargs=%p, flags=%i\n", fd, uargs, flags);
if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS
|MODULE_INIT_IGNORE_VERMAGIC))
return -EINVAL;
err = kernel_read_file_from_fd(fd, &hdr, &size, INT_MAX,
READING_MODULE);
if (err)
return err;
info.hdr = hdr;
info.len = size;
return load_module(&info, uargs, flags);
}
static inline int within(unsigned long addr, void *start, unsigned long size)
{
return ((void *)addr >= start && (void *)addr < start + size);
}
#ifdef CONFIG_KALLSYMS
/*
* This ignores the intensely annoying "mapping symbols" found
* in ARM ELF files: $a, $t and $d.
*/
static inline int is_arm_mapping_symbol(const char *str)
{
if (str[0] == '.' && str[1] == 'L')
return true;
return str[0] == '$' && strchr("axtd", str[1])
&& (str[2] == '\0' || str[2] == '.');
}
static const char *symname(struct mod_kallsyms *kallsyms, unsigned int symnum)
{
return kallsyms->strtab + kallsyms->symtab[symnum].st_name;
}
static const char *get_ksymbol(struct module *mod,
unsigned long addr,
unsigned long *size,
unsigned long *offset)
{
unsigned int i, best = 0;
unsigned long nextval;
struct mod_kallsyms *kallsyms = rcu_dereference_sched(mod->kallsyms);
/* At worse, next value is at end of module */
if (within_module_init(addr, mod))
nextval = (unsigned long)mod->init_layout.base+mod->init_layout.text_size;
else
nextval = (unsigned long)mod->core_layout.base+mod->core_layout.text_size;
/* Scan for closest preceding symbol, and next symbol. (ELF
starts real symbols at 1). */
for (i = 1; i < kallsyms->num_symtab; i++) {
if (kallsyms->symtab[i].st_shndx == SHN_UNDEF)
continue;
/* We ignore unnamed symbols: they're uninformative
* and inserted at a whim. */
if (*symname(kallsyms, i) == '\0'
|| is_arm_mapping_symbol(symname(kallsyms, i)))
continue;
if (kallsyms->symtab[i].st_value <= addr
&& kallsyms->symtab[i].st_value > kallsyms->symtab[best].st_value)
best = i;
if (kallsyms->symtab[i].st_value > addr
&& kallsyms->symtab[i].st_value < nextval)
nextval = kallsyms->symtab[i].st_value;
}
if (!best)
return NULL;
if (size)
*size = nextval - kallsyms->symtab[best].st_value;
if (offset)
*offset = addr - kallsyms->symtab[best].st_value;
return symname(kallsyms, best);
}
void * __weak dereference_module_function_descriptor(struct module *mod,
void *ptr)
{
return ptr;
}
/* For kallsyms to ask for address resolution. NULL means not found. Careful
* not to lock to avoid deadlock on oopses, simply disable preemption. */
const char *module_address_lookup(unsigned long addr,
unsigned long *size,
unsigned long *offset,
char **modname,
char *namebuf)
{
const char *ret = NULL;
struct module *mod;
preempt_disable();
mod = __module_address(addr);
if (mod) {
if (modname)
*modname = mod->name;
ret = get_ksymbol(mod, addr, size, offset);
}
/* Make a copy in here where it's safe */
if (ret) {
strncpy(namebuf, ret, KSYM_NAME_LEN - 1);
ret = namebuf;
}
preempt_enable();
return ret;
}
int lookup_module_symbol_name(unsigned long addr, char *symname)
{
struct module *mod;
preempt_disable();
list_for_each_entry_rcu(mod, &modules, list) {
if (mod->state == MODULE_STATE_UNFORMED)
continue;
if (within_module(addr, mod)) {
const char *sym;
sym = get_ksymbol(mod, addr, NULL, NULL);
if (!sym)
goto out;
strlcpy(symname, sym, KSYM_NAME_LEN);
preempt_enable();
return 0;
}
}
out:
preempt_enable();
return -ERANGE;
}
int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size,
unsigned long *offset, char *modname, char *name)
{
struct module *mod;
preempt_disable();
list_for_each_entry_rcu(mod, &modules, list) {
if (mod->state == MODULE_STATE_UNFORMED)
continue;
if (within_module(addr, mod)) {
const char *sym;
sym = get_ksymbol(mod, addr, size, offset);
if (!sym)
goto out;
if (modname)
strlcpy(modname, mod->name, MODULE_NAME_LEN);
if (name)
strlcpy(name, sym, KSYM_NAME_LEN);
preempt_enable();
return 0;
}
}
out:
preempt_enable();
return -ERANGE;
}
int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
char *name, char *module_name, int *exported)
{
struct module *mod;
preempt_disable();
list_for_each_entry_rcu(mod, &modules, list) {
struct mod_kallsyms *kallsyms;
if (mod->state == MODULE_STATE_UNFORMED)
continue;
kallsyms = rcu_dereference_sched(mod->kallsyms);
if (symnum < kallsyms->num_symtab) {
*value = kallsyms->symtab[symnum].st_value;
*type = kallsyms->symtab[symnum].st_info;
strlcpy(name, symname(kallsyms, symnum), KSYM_NAME_LEN);
strlcpy(module_name, mod->name, MODULE_NAME_LEN);
*exported = is_exported(name, *value, mod);
preempt_enable();
return 0;
}
symnum -= kallsyms->num_symtab;
}
preempt_enable();
return -ERANGE;
}
static unsigned long mod_find_symname(struct module *mod, const char *name)
{
unsigned int i;
struct mod_kallsyms *kallsyms = rcu_dereference_sched(mod->kallsyms);
for (i = 0; i < kallsyms->num_symtab; i++)
if (strcmp(name, symname(kallsyms, i)) == 0 &&
kallsyms->symtab[i].st_shndx != SHN_UNDEF)
return kallsyms->symtab[i].st_value;
return 0;
}
/* Look for this name: can be of form module:name. */
unsigned long module_kallsyms_lookup_name(const char *name)
{
struct module *mod;
char *colon;
unsigned long ret = 0;
/* Don't lock: we're in enough trouble already. */
preempt_disable();
if ((colon = strnchr(name, MODULE_NAME_LEN, ':')) != NULL) {
if ((mod = find_module_all(name, colon - name, false)) != NULL)
ret = mod_find_symname(mod, colon+1);
} else {
list_for_each_entry_rcu(mod, &modules, list) {
if (mod->state == MODULE_STATE_UNFORMED)
continue;
if ((ret = mod_find_symname(mod, name)) != 0)
break;
}
}
preempt_enable();
return ret;
}
int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
struct module *, unsigned long),
void *data)
{
struct module *mod;
unsigned int i;
int ret;
module_assert_mutex();
list_for_each_entry(mod, &modules, list) {
/* We hold module_mutex: no need for rcu_dereference_sched */
struct mod_kallsyms *kallsyms = mod->kallsyms;
if (mod->state == MODULE_STATE_UNFORMED)
continue;
for (i = 0; i < kallsyms->num_symtab; i++) {
if (kallsyms->symtab[i].st_shndx == SHN_UNDEF)
continue;
ret = fn(data, symname(kallsyms, i),
mod, kallsyms->symtab[i].st_value);
if (ret != 0)
return ret;
}
}
return 0;
}
#endif /* CONFIG_KALLSYMS */
static void cfi_init(struct module *mod)
{
#ifdef CONFIG_CFI_CLANG
mod->cfi_check =
(cfi_check_fn)mod_find_symname(mod, CFI_CHECK_FN_NAME);
cfi_module_add(mod, module_addr_min, module_addr_max);
#endif
}
static void cfi_cleanup(struct module *mod)
{
#ifdef CONFIG_CFI_CLANG
cfi_module_remove(mod, module_addr_min, module_addr_max);
#endif
}
/* Maximum number of characters written by module_flags() */
#define MODULE_FLAGS_BUF_SIZE (TAINT_FLAGS_COUNT + 4)
/* Keep in sync with MODULE_FLAGS_BUF_SIZE !!! */
static char *module_flags(struct module *mod, char *buf)
{
int bx = 0;
BUG_ON(mod->state == MODULE_STATE_UNFORMED);
if (mod->taints ||
mod->state == MODULE_STATE_GOING ||
mod->state == MODULE_STATE_COMING) {
buf[bx++] = '(';
bx += module_flags_taint(mod, buf + bx);
/* Show a - for module-is-being-unloaded */
if (mod->state == MODULE_STATE_GOING)
buf[bx++] = '-';
/* Show a + for module-is-being-loaded */
if (mod->state == MODULE_STATE_COMING)
buf[bx++] = '+';
buf[bx++] = ')';
}
buf[bx] = '\0';
return buf;
}
#ifdef CONFIG_PROC_FS
/* Called by the /proc file system to return a list of modules. */
static void *m_start(struct seq_file *m, loff_t *pos)
{
mutex_lock(&module_mutex);
return seq_list_start(&modules, *pos);
}
static void *m_next(struct seq_file *m, void *p, loff_t *pos)
{
return seq_list_next(p, &modules, pos);
}
static void m_stop(struct seq_file *m, void *p)
{
mutex_unlock(&module_mutex);
}
static int m_show(struct seq_file *m, void *p)
{
struct module *mod = list_entry(p, struct module, list);
char buf[MODULE_FLAGS_BUF_SIZE];
void *value;
/* We always ignore unformed modules. */
if (mod->state == MODULE_STATE_UNFORMED)
return 0;
seq_printf(m, "%s %u",
mod->name, mod->init_layout.size + mod->core_layout.size);
print_unload_info(m, mod);
/* Informative for users. */
seq_printf(m, " %s",
mod->state == MODULE_STATE_GOING ? "Unloading" :
mod->state == MODULE_STATE_COMING ? "Loading" :
"Live");
/* Used by oprofile and other similar tools. */
value = m->private ? NULL : mod->core_layout.base;
seq_printf(m, " 0x%px", value);
/* Taints info */
if (mod->taints)
seq_printf(m, " %s", module_flags(mod, buf));
seq_puts(m, "\n");
return 0;
}
/* Format: modulename size refcount deps address
Where refcount is a number or -, and deps is a comma-separated list
of depends or -.
*/
static const struct seq_operations modules_op = {
.start = m_start,
.next = m_next,
.stop = m_stop,
.show = m_show
};
/*
* This also sets the "private" pointer to non-NULL if the
* kernel pointers should be hidden (so you can just test
* "m->private" to see if you should keep the values private).
*
* We use the same logic as for /proc/kallsyms.
*/
static int modules_open(struct inode *inode, struct file *file)
{
int err = seq_open(file, &modules_op);
if (!err) {
struct seq_file *m = file->private_data;
m->private = kallsyms_show_value() ? NULL : (void *)8ul;
}
return err;
}
static const struct file_operations proc_modules_operations = {
.open = modules_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
static int __init proc_modules_init(void)
{
proc_create("modules", 0, NULL, &proc_modules_operations);
return 0;
}
module_init(proc_modules_init);
#endif
/* Given an address, look for it in the module exception tables. */
const struct exception_table_entry *search_module_extables(unsigned long addr)
{
const struct exception_table_entry *e = NULL;
struct module *mod;
preempt_disable();
mod = __module_address(addr);
if (!mod)
goto out;
if (!mod->num_exentries)
goto out;
e = search_extable(mod->extable,
mod->num_exentries,
addr);
out:
preempt_enable();
/*
* Now, if we found one, we are running inside it now, hence
* we cannot unload the module, hence no refcnt needed.
*/
return e;
}
/*
* is_module_address - is this address inside a module?
* @addr: the address to check.
*
* See is_module_text_address() if you simply want to see if the address
* is code (not data).
*/
bool is_module_address(unsigned long addr)
{
bool ret;
preempt_disable();
ret = __module_address(addr) != NULL;
preempt_enable();
return ret;
}
/*
* __module_address - get the module which contains an address.
* @addr: the address.
*
* Must be called with preempt disabled or module mutex held so that
* module doesn't get freed during this.
*/
struct module *__module_address(unsigned long addr)
{
struct module *mod;
if (addr < module_addr_min || addr > module_addr_max)
return NULL;
module_assert_mutex_or_preempt();
mod = mod_find(addr);
if (mod) {
BUG_ON(!within_module(addr, mod));
if (mod->state == MODULE_STATE_UNFORMED)
mod = NULL;
}
return mod;
}
EXPORT_SYMBOL_GPL(__module_address);
/*
* is_module_text_address - is this address inside module code?
* @addr: the address to check.
*
* See is_module_address() if you simply want to see if the address is
* anywhere in a module. See kernel_text_address() for testing if an
* address corresponds to kernel or module code.
*/
bool is_module_text_address(unsigned long addr)
{
bool ret;
preempt_disable();
ret = __module_text_address(addr) != NULL;
preempt_enable();
return ret;
}
/*
* __module_text_address - get the module whose code contains an address.
* @addr: the address.
*
* Must be called with preempt disabled or module mutex held so that
* module doesn't get freed during this.
*/
struct module *__module_text_address(unsigned long addr)
{
struct module *mod = __module_address(addr);
if (mod) {
/* Make sure it's within the text section. */
if (!within(addr, mod->init_layout.base, mod->init_layout.text_size)
&& !within(addr, mod->core_layout.base, mod->core_layout.text_size))
mod = NULL;
}
return mod;
}
EXPORT_SYMBOL_GPL(__module_text_address);
/* Don't grab lock, we're oopsing. */
void print_modules(void)
{
struct module *mod;
char buf[MODULE_FLAGS_BUF_SIZE];
printk(KERN_DEFAULT "Modules linked in:");
/* Most callers should already have preempt disabled, but make sure */
preempt_disable();
list_for_each_entry_rcu(mod, &modules, list) {
if (mod->state == MODULE_STATE_UNFORMED)
continue;
pr_cont(" %s%s", mod->name, module_flags(mod, buf));
}
preempt_enable();
if (last_unloaded_module[0])
pr_cont(" [last unloaded: %s]", last_unloaded_module);
pr_cont("\n");
}
#ifdef CONFIG_MODVERSIONS
/* Generate the signature for all relevant module structures here.
* If these change, we don't want to try to parse the module. */
void module_layout(struct module *mod,
struct modversion_info *ver,
struct kernel_param *kp,
struct kernel_symbol *ks,
struct tracepoint * const *tp)
{
}
EXPORT_SYMBOL(module_layout);
#endif