Merge 5.15.121 into android13-5.15-lts
Changes in 5.15.121
netfilter: nf_tables: drop map element references from preparation phase
fs: pipe: reveal missing function protoypes
x86/resctrl: Only show tasks' pid in current pid namespace
blk-iocost: use spin_lock_irqsave in adjust_inuse_and_calc_cost
md/raid10: check slab-out-of-bounds in md_bitmap_get_counter
md/raid10: fix overflow of md/safe_mode_delay
md/raid10: fix wrong setting of max_corr_read_errors
md/raid10: fix null-ptr-deref of mreplace in raid10_sync_request
md/raid10: fix io loss while replacement replace rdev
irqchip/jcore-aic: Fix missing allocation of IRQ descriptors
svcrdma: Prevent page release when nothing was received
posix-timers: Prevent RT livelock in itimer_delete()
tracing/timer: Add missing hrtimer modes to decode_hrtimer_mode().
clocksource/drivers/cadence-ttc: Fix memory leak in ttc_timer_probe
PM: domains: fix integer overflow issues in genpd_parse_state()
perf/arm-cmn: Fix DTC reset
powercap: RAPL: Fix CONFIG_IOSF_MBI dependency
ARM: 9303/1: kprobes: avoid missing-declaration warnings
cpufreq: intel_pstate: Fix energy_performance_preference for passive
thermal/drivers/sun8i: Fix some error handling paths in sun8i_ths_probe()
rcutorture: Correct name of use_softirq module parameter
rcuscale: Always log error message
rcuscale: Move shutdown from wait_event() to wait_event_idle()
rcu/rcuscale: Move rcu_scale_*() after kfree_scale_cleanup()
rcu/rcuscale: Stop kfree_scale_thread thread(s) after unloading rcuscale
kselftest: vDSO: Fix accumulation of uninitialized ret when CLOCK_REALTIME is undefined
perf/ibs: Fix interface via core pmu events
x86/mm: Fix __swp_entry_to_pte() for Xen PV guests
locking/atomic: arm: fix sync ops
evm: Complete description of evm_inode_setattr()
evm: Fix build warnings
ima: Fix build warnings
pstore/ram: Add check for kstrdup
igc: Enable and fix RX hash usage by netstack
wifi: ath9k: fix AR9003 mac hardware hang check register offset calculation
wifi: ath9k: avoid referencing uninit memory in ath9k_wmi_ctrl_rx
libbpf: btf_dump_type_data_check_overflow needs to consider BTF_MEMBER_BITFIELD_SIZE
samples/bpf: Fix buffer overflow in tcp_basertt
spi: spi-geni-qcom: Correct CS_TOGGLE bit in SPI_TRANS_CFG
wifi: wilc1000: fix for absent RSN capabilities WFA testcase
wifi: mwifiex: Fix the size of a memory allocation in mwifiex_ret_802_11_scan()
sctp: add bpf_bypass_getsockopt proto callback
libbpf: fix offsetof() and container_of() to work with CO-RE
bpf: Don't EFAULT for {g,s}setsockopt with wrong optlen
spi: dw: Round of n_bytes to power of 2
nfc: llcp: fix possible use of uninitialized variable in nfc_llcp_send_connect()
bpftool: JIT limited misreported as negative value on aarch64
regulator: core: Fix more error checking for debugfs_create_dir()
regulator: core: Streamline debugfs operations
wifi: orinoco: Fix an error handling path in spectrum_cs_probe()
wifi: orinoco: Fix an error handling path in orinoco_cs_probe()
wifi: atmel: Fix an error handling path in atmel_probe()
wl3501_cs: use eth_hw_addr_set()
wifi: wl3501_cs: Fix an error handling path in wl3501_probe()
wifi: ray_cs: Utilize strnlen() in parse_addr()
wifi: ray_cs: Drop useless status variable in parse_addr()
wifi: ray_cs: Fix an error handling path in ray_probe()
wifi: ath9k: don't allow to overwrite ENDPOINT0 attributes
selftests/bpf: Fix check_mtu using wrong variable type
wifi: rsi: Do not configure WoWlan in shutdown hook if not enabled
wifi: rsi: Do not set MMC_PM_KEEP_POWER in shutdown
watchdog/perf: define dummy watchdog_update_hrtimer_threshold() on correct config
watchdog/perf: more properly prevent false positives with turbo modes
kexec: fix a memory leak in crash_shrink_memory()
memstick r592: make memstick_debug_get_tpc_name() static
wifi: ath9k: Fix possible stall on ath9k_txq_list_has_key()
rtnetlink: extend RTEXT_FILTER_SKIP_STATS to IFLA_VF_INFO
wifi: iwlwifi: pull from TXQs with softirqs disabled
iwlwifi: don't dump_stack() when we get an unexpected interrupt
wifi: iwlwifi: pcie: fix NULL pointer dereference in iwl_pcie_irq_rx_msix_handler()
wifi: cfg80211: rewrite merging of inherited elements
wifi: iwlwifi: mvm: indicate HW decrypt for beacon protection
wifi: ath9k: convert msecs to jiffies where needed
bpf: Omit superfluous address family check in __bpf_skc_lookup
bpf: Factor out socket lookup functions for the TC hookpoint.
bpf: Call __bpf_sk_lookup()/__bpf_skc_lookup() directly via TC hookpoint
bpf: Fix bpf socket lookup from tc/xdp to respect socket VRF bindings
can: length: fix bitstuffing count
igc: Fix race condition in PTP tx code
net: stmmac: fix double serdes powerdown
netlink: fix potential deadlock in netlink_set_err()
netlink: do not hard code device address lenth in fdb dumps
bonding: do not assume skb mac_header is set
selftests: rtnetlink: remove netdevsim device after ipsec offload test
gtp: Fix use-after-free in __gtp_encap_destroy().
net: axienet: Move reset before 64-bit DMA detection
sfc: fix crash when reading stats while NIC is resetting
nfc: llcp: simplify llcp_sock_connect() error paths
net: nfc: Fix use-after-free caused by nfc_llcp_find_local
lib/ts_bm: reset initial match offset for every block of text
netfilter: conntrack: dccp: copy entire header to stack buffer, not just basic one
netfilter: nf_conntrack_sip: fix the ct_sip_parse_numerical_param() return value.
ipvlan: Fix return value of ipvlan_queue_xmit()
netlink: Add __sock_i_ino() for __netlink_diag_dump().
drm/amd/display: Add logging for display MALL refresh setting
radeon: avoid double free in ci_dpm_init()
drm/amd/display: Explicitly specify update type per plane info change
Input: drv260x - sleep between polling GO bit
drm/bridge: tc358768: always enable HS video mode
drm/bridge: tc358768: fix PLL parameters computation
drm/bridge: tc358768: fix PLL target frequency
drm/bridge: tc358768: fix TCLK_ZEROCNT computation
drm/bridge: tc358768: Add atomic_get_input_bus_fmts() implementation
drm/bridge: tc358768: fix TCLK_TRAILCNT computation
drm/bridge: tc358768: fix THS_ZEROCNT computation
drm/bridge: tc358768: fix TXTAGOCNT computation
drm/bridge: tc358768: fix THS_TRAILCNT computation
drm/vram-helper: fix function names in vram helper doc
ARM: dts: BCM5301X: Drop "clock-names" from the SPI node
ARM: dts: meson8b: correct uart_B and uart_C clock references
Input: adxl34x - do not hardcode interrupt trigger type
drm: sun4i_tcon: use devm_clk_get_enabled in `sun4i_tcon_init_clocks`
drm/panel: sharp-ls043t1le01: adjust mode settings
ARM: dts: stm32: Move ethernet MAC EEPROM from SoM to carrier boards
bus: ti-sysc: Fix dispc quirk masking bool variables
arm64: dts: microchip: sparx5: do not use PSCI on reference boards
clk: imx: scu: use _safe list iterator to avoid a use after free
RDMA/bnxt_re: Disable/kill tasklet only if it is enabled
RDMA/bnxt_re: Fix to remove unnecessary return labels
RDMA/bnxt_re: Use unique names while registering interrupts
RDMA/bnxt_re: Remove a redundant check inside bnxt_re_update_gid
RDMA/bnxt_re: Fix to remove an unnecessary log
drm/msm/dsi: don't allow enabling 14nm VCO with unprogrammed rate
drm/msm/disp/dpu: get timing engine status from intf status register
drm/msm/dpu: Set DPU_DATA_HCTL_EN for in INTF_SC7180_MASK
ARM: dts: gta04: Move model property out of pinctrl node
arm64: dts: qcom: msm8916: correct camss unit address
arm64: dts: qcom: msm8994: correct SPMI unit address
arm64: dts: qcom: msm8996: correct camss unit address
arm64: dts: qcom: sdm630: correct camss unit address
arm64: dts: qcom: sdm845: correct camss unit address
arm64: dts: qcom: db820c: Move blsp1_uart2 pin states to msm8996.dtsi
arm64: dts: qcom: apq8016-sbc: Update modem and WiFi firmware path
arm64: dts: qcom: apq8016-sbc: Clarify firmware-names
arm64: dts: qcom: apq8016-sbc: fix mpps state names
arm64: dts: qcom: Drop unneeded extra device-specific includes
arm64: dts: qcom: apq8016-sbc: Fix regulator constraints
arm64: dts: qcom: apq8016-sbc: Fix 1.8V power rail on LS expansion
drm/panel: simple: fix active size for Ampire AM-480272H3TMQW-T01H
ARM: ep93xx: fix missing-prototype warnings
ARM: omap2: fix missing tick_broadcast() prototype
arm64: dts: qcom: apq8096: fix fixed regulator name property
arm64: dts: mediatek: mt8183: Add mediatek,broken-save-restore-fw to kukui
ARM: dts: stm32: Shorten the AV96 HDMI sound card name
memory: brcmstb_dpfe: fix testing array offset after use
ASoC: es8316: Increment max value for ALC Capture Target Volume control
ASoC: es8316: Do not set rate constraints for unsupported MCLKs
ARM: dts: meson8: correct uart_B and uart_C clock references
soc/fsl/qe: fix usb.c build errors
RDMA/irdma: avoid fortify-string warning in irdma_clr_wqes
IB/hfi1: Use bitmap_zalloc() when applicable
IB/hfi1: Fix wrong mmu_node used for user SDMA packet after invalidate
RDMA/hns: Fix hns_roce_table_get return value
ARM: dts: iwg20d-q7-common: Fix backlight pwm specifier
arm64: dts: renesas: ulcb-kf: Remove flow control for SCIF1
fbdev: omapfb: lcd_mipid: Fix an error handling path in mipid_spi_probe()
arm64: dts: ti: k3-j7200: Fix physical address of pin
ARM: dts: stm32: Fix audio routing on STM32MP15xx DHCOM PDK2
ARM: dts: stm32: fix i2s endpoint format property for stm32mp15xx-dkx
hwmon: (gsc-hwmon) fix fan pwm temperature scaling
hwmon: (adm1275) Allow setting sample averaging
hwmon: (pmbus/adm1275) Fix problems with temperature monitoring on ADM1272
ARM: dts: BCM5301X: fix duplex-full => full-duplex
drm/amdkfd: Fix potential deallocation of previously deallocated memory.
drm/amd/display: Fix artifacting on eDP panels when engaging freesync video mode
drm/radeon: fix possible division-by-zero errors
amdgpu: validate offset_in_bo of drm_amdgpu_gem_va
drm/msm/a5xx: really check for A510 in a5xx_gpu_init
RDMA/bnxt_re: wraparound mbox producer index
RDMA/bnxt_re: Avoid calling wake_up threads from spin_lock context
clk: imx: clk-imx8mn: fix memory leak in imx8mn_clocks_probe
clk: imx: clk-imx8mp: improve error handling in imx8mp_clocks_probe()
arm64: dts: qcom: sm8250-edo: Panel framebuffer is 2.5k instead of 4k
clk: clocking-wizard: Fix Oops in clk_wzrd_register_divider()
clk: tegra: tegra124-emc: Fix potential memory leak
ALSA: ac97: Fix possible NULL dereference in snd_ac97_mixer
drm/msm/dpu: do not enable color-management if DSPPs are not available
drm/msm/dp: Free resources after unregistering them
arm64: dts: mediatek: Add cpufreq nodes for MT8192
arm64: dts: mediatek: mt8192: Fix CPUs capacity-dmips-mhz
drm/msm/dpu: correct MERGE_3D length
clk: vc5: check memory returned by kasprintf()
clk: cdce925: check return value of kasprintf()
clk: si5341: return error if one synth clock registration fails
clk: si5341: check return value of {devm_}kasprintf()
clk: si5341: free unused memory on probe failure
clk: keystone: sci-clk: check return value of kasprintf()
clk: ti: clkctrl: check return value of kasprintf()
drivers: meson: secure-pwrc: always enable DMA domain
ovl: update of dentry revalidate flags after copy up
ASoC: imx-audmix: check return value of devm_kasprintf()
clk: Fix memory leak in devm_clk_notifier_register()
PCI: cadence: Fix Gen2 Link Retraining process
PCI: vmd: Reset VMD config register between soft reboots
scsi: qedf: Fix NULL dereference in error handling
pinctrl: bcm2835: Handle gpiochip_add_pin_range() errors
PCI/ASPM: Disable ASPM on MFD function removal to avoid use-after-free
scsi: 3w-xxxx: Add error handling for initialization failure in tw_probe()
PCI: pciehp: Cancel bringup sequence if card is not present
PCI: ftpci100: Release the clock resources
PCI: Add pci_clear_master() stub for non-CONFIG_PCI
perf bench: Use unbuffered output when pipe/tee'ing to a file
perf bench: Add missing setlocale() call to allow usage of %'d style formatting
pinctrl: cherryview: Return correct value if pin in push-pull mode
kcsan: Don't expect 64 bits atomic builtins from 32 bits architectures
powerpc/interrupt: Don't read MSR from interrupt_exit_kernel_prepare()
powerpc/signal32: Force inlining of __unsafe_save_user_regs() and save_tm_user_regs_unsafe()
perf script: Fix allocation of evsel->priv related to per-event dump files
perf dwarf-aux: Fix off-by-one in die_get_varname()
powerpc/64s: Fix VAS mm use after free
pinctrl: microchip-sgpio: check return value of devm_kasprintf()
pinctrl: at91-pio4: check return value of devm_kasprintf()
powerpc/powernv/sriov: perform null check on iov before dereferencing iov
powerpc: simplify ppc_save_regs
powerpc: update ppc_save_regs to save current r1 in pt_regs
riscv: uprobes: Restore thread.bad_cause
powerpc/book3s64/mm: Fix DirectMap stats in /proc/meminfo
powerpc/mm/dax: Fix the condition when checking if altmap vmemap can cross-boundary
hwrng: virtio - add an internal buffer
hwrng: virtio - don't wait on cleanup
hwrng: virtio - don't waste entropy
hwrng: virtio - always add a pending request
hwrng: virtio - Fix race on data_avail and actual data
modpost: remove broken calculation of exception_table_entry size
crypto: nx - fix build warnings when DEBUG_FS is not enabled
modpost: fix section mismatch message for R_ARM_ABS32
modpost: fix section mismatch message for R_ARM_{PC24,CALL,JUMP24}
crypto: marvell/cesa - Fix type mismatch warning
modpost: fix off by one in is_executable_section()
ARC: define ASM_NL and __ALIGN(_STR) outside #ifdef __ASSEMBLY__ guard
crypto: qat - honor CRYPTO_TFM_REQ_MAY_SLEEP flag
crypto: qat - replace get_current_node() with numa_node_id()
crypto: qat - use reference to structure in dma_map_single()
crypto: kpp - Add helper to set reqsize
crypto: qat - Use helper to set reqsize
crypto: qat - unmap buffer before free for DH
crypto: qat - unmap buffers before free for RSA
NFSv4.1: freeze the session table upon receiving NFS4ERR_BADSESSION
SMB3: Do not send lease break acknowledgment if all file handles have been closed
dax: Fix dax_mapping_release() use after free
dax: Introduce alloc_dev_dax_id()
dax/kmem: Pass valid argument to memory_group_register_static
hwrng: st - keep clock enabled while hwrng is registered
kbuild: Disable GCOV for *.mod.o
efi/libstub: Disable PCI DMA before grabbing the EFI memory map
ksmbd: avoid field overflow warning
ACPI: utils: Fix acpi_evaluate_dsm_typed() redefinition error
bootmem: remove the vmemmap pages from kmemleak in free_bootmem_page
io_uring: ensure IOPOLL locks around deferred work
USB: serial: option: add LARA-R6 01B PIDs
usb: dwc3: gadget: Propagate core init errors to UDC during pullup
phy: tegra: xusb: Clear the driver reference in usb-phy dev
iio: adc: ad7192: Fix null ad7192_state pointer access
iio: adc: ad7192: Fix internal/external clock selection
iio: accel: fxls8962af: errata bug only applicable for FXLS8962AF
iio: accel: fxls8962af: fixup buffer scan element type
ALSA: hda/realtek: Add quirk for Clevo NPx0SNx
ALSA: jack: Fix mutex call in snd_jack_report()
block: fix signed int overflow in Amiga partition support
block: add overflow checks for Amiga partition support
block: change all __u32 annotations to __be32 in affs_hardblocks.h
block: increment diskseq on all media change events
SUNRPC: Fix UAF in svc_tcp_listen_data_ready()
w1: w1_therm: fix locking behavior in convert_t
w1: fix loop in w1_fini()
sh: j2: Use ioremap() to translate device tree address into kernel memory
usb: dwc2: platform: Improve error reporting for problems during .remove()
usb: dwc2: Fix some error handling paths
serial: 8250: omap: Fix freeing of resources on failed register
clk: qcom: camcc-sc7180: Add parent dependency to all camera GDSCs
clk: qcom: gcc-ipq6018: Use floor ops for sdcc clocks
media: usb: Check az6007_read() return value
media: videodev2.h: Fix struct v4l2_input tuner index comment
media: usb: siano: Fix warning due to null work_func_t function pointer
media: i2c: Correct format propagation for st-mipid02
clk: qcom: reset: Allow specifying custom reset delay
clk: qcom: reset: support resetting multiple bits
clk: qcom: ipq6018: fix networking resets
usb: dwc3: qcom: Fix potential memory leak
usb: gadget: u_serial: Add null pointer check in gserial_suspend
extcon: Fix kernel doc of property fields to avoid warnings
extcon: Fix kernel doc of property capability fields to avoid warnings
usb: phy: phy-tahvo: fix memory leak in tahvo_usb_probe()
usb: hide unused usbfs_notify_suspend/resume functions
serial: 8250: lock port for stop_rx() in omap8250_irq()
serial: 8250: lock port for UART_IER access in omap8250_irq()
kernfs: fix missing kernfs_idr_lock to remove an ID from the IDR
coresight: Fix loss of connection info when a module is unloaded
mfd: rt5033: Drop rt5033-battery sub-device
media: venus: helpers: Fix ALIGN() of non power of two
media: atomisp: gmin_platform: fix out_len in gmin_get_config_dsm_var()
KVM: s390: fix KVM_S390_GET_CMMA_BITS for GFNs in memslot holes
usb: dwc3: qcom: Release the correct resources in dwc3_qcom_remove()
usb: dwc3: qcom: Fix an error handling path in dwc3_qcom_probe()
usb: common: usb-conn-gpio: Set last role to unknown before initial detection
usb: dwc3-meson-g12a: Fix an error handling path in dwc3_meson_g12a_probe()
mfd: intel-lpss: Add missing check for platform_get_resource
Revert "usb: common: usb-conn-gpio: Set last role to unknown before initial detection"
serial: 8250_omap: Use force_suspend and resume for system suspend
test_firmware: return ENOMEM instead of ENOSPC on failed memory allocation
nvmem: rmem: Use NVMEM_DEVID_AUTO
mfd: stmfx: Fix error path in stmfx_chip_init
mfd: stmfx: Nullify stmfx->vdd in case of error
KVM: s390: vsie: fix the length of APCB bitmap
KVM: s390/diag: fix racy access of physical cpu number in diag 9c handler
mfd: stmpe: Only disable the regulators if they are enabled
phy: tegra: xusb: check return value of devm_kzalloc()
pwm: imx-tpm: force 'real_period' to be zero in suspend
pwm: sysfs: Do not apply state to already disabled PWMs
pwm: ab8500: Fix error code in probe()
pwm: mtk_disp: Fix the disable flow of disp_pwm
md/raid10: fix the condition to call bio_end_io_acct()
rtc: st-lpc: Release some resources in st_rtc_probe() in case of error
drm/i915/psr: Use hw.adjusted mode when calculating io/fast wake times
media: cec: i2c: ch7322: also select REGMAP
sctp: fix potential deadlock on &net->sctp.addr_wq_lock
net/sched: act_ipt: add sanity checks on table name and hook locations
Add MODULE_FIRMWARE() for FIRMWARE_TG357766.
ibmvnic: Do not reset dql stats on NON_FATAL err
net: dsa: vsc73xx: fix MTU configuration
spi: bcm-qspi: return error if neither hif_mspi nor mspi is available
mailbox: ti-msgmgr: Fill non-message tx data fields with 0x0
f2fs: fix error path handling in truncate_dnode()
octeontx2-af: Fix mapping for NIX block from CGX connection
octeontx2-af: Add validation before accessing cgx and lmac
ntfs: Fix panic about slab-out-of-bounds caused by ntfs_listxattr()
powerpc: allow PPC_EARLY_DEBUG_CPM only when SERIAL_CPM=y
net: bridge: keep ports without IFF_UNICAST_FLT in BR_PROMISC mode
tcp: annotate data races in __tcp_oow_rate_limited()
xsk: Honor SO_BINDTODEVICE on bind
net/sched: act_pedit: Add size check for TCA_PEDIT_PARMS_EX
riscv: move memblock_allow_resize() after linear mapping is ready
pptp: Fix fib lookup calls.
net: dsa: tag_sja1105: fix MAC DA patching from meta frames
octeontx-af: fix hardware timestamp configuration
s390/qeth: Fix vipa deletion
sh: dma: Fix DMA channel offset calculation
apparmor: fix missing error check for rhashtable_insert_fast
i2c: xiic: Defer xiic_wakeup() and __xiic_start_xfer() in xiic_process()
i2c: xiic: Don't try to handle more interrupt events after error
extcon: usbc-tusb320: Convert to i2c's .probe_new()
btrfs: do not BUG_ON() on tree mod log failure at balance_level()
i2c: qup: Add missing unwind goto in qup_i2c_probe()
NFSD: add encoding of op_recall flag for write delegation
io_uring: wait interruptibly for request completions on exit
mmc: core: disable TRIM on Kingston EMMC04G-M627
mmc: core: disable TRIM on Micron MTFC4GACAJCN-1M
mmc: mmci: Set PROBE_PREFER_ASYNCHRONOUS
mmc: sdhci: fix DMA configure compatibility issue when 64bit DMA mode is used.
bcache: fixup btree_cache_wait list damage
bcache: Remove unnecessary NULL point check in node allocations
bcache: Fix __bch_btree_node_alloc to make the failure behavior consistent
um: Use HOST_DIR for mrproper
integrity: Fix possible multiple allocation in integrity_inode_get()
autofs: use flexible array in ioctl structure
shmem: use ramfs_kill_sb() for kill_sb method of ramfs-based tmpfs
ext4: Remove ext4 locking of moved directory
Revert "f2fs: fix potential corruption when moving a directory"
fs: Establish locking order for unrelated directories
fs: Lock moved directories
ipvs: increase ip_vs_conn_tab_bits range for 64BIT
jffs2: reduce stack usage in jffs2_build_xattr_subsystem()
fs: avoid empty option when generating legacy mount string
btrfs: add handling for RAID1C23/DUP to btrfs_reduce_alloc_profile
btrfs: delete unused BGs while reclaiming BGs
btrfs: bail out reclaim process if filesystem is read-only
btrfs: reinsert BGs failed to reclaim
btrfs: fix race when deleting quota root from the dirty cow roots list
btrfs: fix extent buffer leak after tree mod log failure at split_node()
btrfs: do not BUG_ON() on tree mod log failure at __btrfs_cow_block()
ASoC: mediatek: mt8173: Fix irq error path
ASoC: mediatek: mt8173: Fix snd_soc_component_initialize error path
ARM: dts: qcom: ipq4019: fix broken NAND controller properties override
ARM: orion5x: fix d2net gpio initialization
leds: trigger: netdev: Recheck NETDEV_LED_MODE_LINKUP on dev rename
fs: no need to check source
ovl: fix null pointer dereference in ovl_get_acl_rcu()
fanotify: disallow mount/sb marks on kernel internal pseudo fs
netfilter: nf_tables: unbind non-anonymous set if rule construction fails
netfilter: conntrack: Avoid nf_ct_helper_hash uses after free
netfilter: nf_tables: do not ignore genmask when looking up chain by id
netfilter: nf_tables: prevent OOB access in nft_byteorder_eval
wireguard: queueing: use saner cpu selection wrapping
wireguard: netlink: send staged packets when setting initial private key
tty: serial: fsl_lpuart: add earlycon for imx8ulp platform
block/partition: fix signedness issue for Amiga partitions
io_uring: Use io_schedule* in cqring wait
io_uring: add reschedule point to handle_tw_list()
net: lan743x: Don't sleep in atomic context
workqueue: clean up WORK_* constant types, clarify masking
ksmbd: use ksmbd_req_buf_next() in ksmbd_smb2_check_message()
ksmbd: validate command payload size
ksmbd: fix out-of-bound read in smb2_write
ksmbd: validate session id and tree id in the compound request
drm/panel: simple: Add connector_type for innolux_at043tn24
drm/bridge: ti-sn65dsi86: Fix auxiliary bus lifetime
drm/panel: simple: Add Powertip PH800480T013 drm_display_mode flags
igc: Remove delay during TX ring configuration
net/mlx5e: fix double free in mlx5e_destroy_flow_table
net/mlx5e: fix memory leak in mlx5e_ptp_open
net/mlx5e: Check for NOT_READY flag state after locking
igc: set TP bit in 'supported' and 'advertising' fields of ethtool_link_ksettings
igc: Handle PPS start time programming for past time values
scsi: qla2xxx: Fix error code in qla2x00_start_sp()
bpf: Fix max stack depth check for async callbacks
net: mvneta: fix txq_map in case of txq_number==1
net/sched: cls_fw: Fix improper refcount update leads to use-after-free
gve: Set default duplex configuration to full
ionic: remove WARN_ON to prevent panic_on_warn
net: bgmac: postpone turning IRQs off to avoid SoC hangs
net: prevent skb corruption on frag list segmentation
icmp6: Fix null-ptr-deref of ip6_null_entry->rt6i_idev in icmp6_dev().
udp6: fix udp6_ehashfn() typo
ntb: idt: Fix error handling in idt_pci_driver_init()
NTB: amd: Fix error handling in amd_ntb_pci_driver_init()
ntb: intel: Fix error handling in intel_ntb_pci_driver_init()
NTB: ntb_transport: fix possible memory leak while device_register() fails
NTB: ntb_tool: Add check for devm_kcalloc
ipv6/addrconf: fix a potential refcount underflow for idev
platform/x86: wmi: remove unnecessary argument
platform/x86: wmi: use guid_t and guid_equal()
platform/x86: wmi: move variables
platform/x86: wmi: Break possible infinite loop when parsing GUID
kernel/trace: Fix cleanup logic of enable_trace_eprobe
igc: Fix launchtime before start of cycle
igc: Fix inserting of empty frame for launchtime
bpf, riscv: Support riscv jit to provide bpf_line_info
riscv, bpf: Fix inconsistent JIT image generation
drm/i915: Fix one wrong caching mode enum usage
octeontx2-pf: Add additional check for MCAM rules
erofs: avoid infinite loop in z_erofs_do_read_page() when reading beyond EOF
erofs: decouple basic mount options from fs_context
erofs: fix fsdax unavailability for chunk-based regular files
wifi: airo: avoid uninitialized warning in airo_get_rate()
bpf: cpumap: Fix memory leak in cpu_map_update_elem
net/sched: flower: Ensure both minimum and maximum ports are specified
riscv: mm: fix truncation warning on RV32
netdevsim: fix uninitialized data in nsim_dev_trap_fa_cookie_write()
net/sched: make psched_mtu() RTNL-less safe
net/sched: sch_qfq: refactor parsing of netlink parameters
net/sched: sch_qfq: account for stab overhead in qfq_enqueue
nvme-pci: remove nvme_queue from nvme_iod
nvme-pci: fix DMA direction of unmapping integrity data
fs/ntfs3: Check fields while reading
f2fs: fix to avoid NULL pointer dereference f2fs_write_end_io()
pinctrl: amd: Fix mistake in handling clearing pins at startup
pinctrl: amd: Detect internal GPIO0 debounce handling
pinctrl: amd: Detect and mask spurious interrupts
pinctrl: amd: Only use special debounce behavior for GPIO 0
tpm: tpm_vtpm_proxy: fix a race condition in /dev/vtpmx creation
mtd: rawnand: meson: fix unaligned DMA buffers handling
net: bcmgenet: Ensure MDIO unregistration has clocks enabled
mm/damon/ops-common: atomically test and clear young on ptes and pmds
powerpc: Fail build if using recordmcount with binutils v2.37
misc: fastrpc: Create fastrpc scalar with correct buffer count
powerpc/security: Fix Speculation_Store_Bypass reporting on Power10
arm64: errata: Add detection for TRBE overwrite in FILL mode
erofs: fix compact 4B support for 16k block size
MIPS: Loongson: Fix cpu_probe_loongson() again
MIPS: KVM: Fix NULL pointer dereference
ext4: Fix reusing stale buffer heads from last failed mounting
ext4: fix wrong unit use in ext4_mb_clear_bb
ext4: get block from bh in ext4_free_blocks for fast commit replay
ext4: fix wrong unit use in ext4_mb_new_blocks
ext4: fix to check return value of freeze_bdev() in ext4_shutdown()
ext4: turn quotas off if mount failed after enabling quotas
ext4: only update i_reserved_data_blocks on successful block allocation
jfs: jfs_dmap: Validate db_l2nbperpage while mounting
hwrng: imx-rngc - fix the timeout for init and self check
dm integrity: reduce vmalloc space footprint on 32-bit architectures
PCI/PM: Avoid putting EloPOS E2/S2/H2 PCIe Ports in D3cold
PCI: Add function 1 DMA alias quirk for Marvell 88SE9235
PCI: qcom: Disable write access to read only registers for IP v2.3.3
PCI: rockchip: Assert PCI Configuration Enable bit after probe
PCI: rockchip: Write PCI Device ID to correct register
PCI: rockchip: Add poll and timeout to wait for PHY PLLs to be locked
PCI: rockchip: Fix legacy IRQ generation for RK3399 PCIe endpoint core
PCI: rockchip: Use u32 variable to access 32-bit registers
PCI: rockchip: Set address alignment for endpoint mode
misc: pci_endpoint_test: Free IRQs before removing the device
misc: pci_endpoint_test: Re-init completion for every test
mfd: pm8008: Fix module autoloading
md/raid0: add discard support for the 'original' layout
dm init: add dm-mod.waitfor to wait for asynchronously probed block devices
fs: dlm: return positive pid value for F_GETLK
drm/atomic: Allow vblank-enabled + self-refresh "disable"
drm/rockchip: vop: Leave vblank enabled in self-refresh
drm/amdgpu: fix clearing mappings for BOs that are always valid in VM
drm/amd/display: Correct `DMUB_FW_VERSION` macro
drm/amdgpu: avoid restore process run into dead loop.
drm/ttm: Don't leak a resource on swapout move error
serial: atmel: don't enable IRQs prematurely
tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
tty: serial: imx: fix rs485 rx after tx
firmware: stratix10-svc: Fix a potential resource leak in svc_create_memory_pool()
libceph: harden msgr2.1 frame segment length checks
ceph: don't let check_caps skip sending responses for revoke msgs
xhci: Fix resume issue of some ZHAOXIN hosts
xhci: Fix TRB prefetch issue of ZHAOXIN hosts
xhci: Show ZHAOXIN xHCI root hub speed correctly
meson saradc: fix clock divider mask length
opp: Fix use-after-free in lazy_opp_tables after probe deferral
soundwire: qcom: fix storing port config out-of-bounds
Revert "8250: add support for ASIX devices with a FIFO bug"
bus: ixp4xx: fix IXP4XX_EXP_T1_MASK
s390/decompressor: fix misaligned symbol build error
tracing/histograms: Add histograms to hist_vars if they have referenced variables
tracing: Fix memory leak of iter->temp when reading trace_pipe
samples: ftrace: Save required argument registers in sample trampolines
net: ena: fix shift-out-of-bounds in exponential backoff
ring-buffer: Fix deadloop issue on reading trace_pipe
ftrace: Fix possible warning on checking all pages used in ftrace_process_locs()
xtensa: ISS: fix call to split_if_spec
tracing: Fix null pointer dereference in tracing_err_log_open()
selftests: mptcp: sockopt: return error if wrong mark
selftests: mptcp: depend on SYN_COOKIES
tracing/probes: Fix not to count error code to total length
tracing/probes: Fix to update dynamic data counter if fetcharg uses it
scsi: qla2xxx: Wait for io return on terminate rport
scsi: qla2xxx: Array index may go out of bound
scsi: qla2xxx: Avoid fcport pointer dereference
scsi: qla2xxx: Fix buffer overrun
scsi: qla2xxx: Fix potential NULL pointer dereference
scsi: qla2xxx: Check valid rport returned by fc_bsg_to_rport()
scsi: qla2xxx: Correct the index of array
scsi: qla2xxx: Pointer may be dereferenced
scsi: qla2xxx: Remove unused nvme_ls_waitq wait queue
MIPS: kvm: Fix build error with KVM_MIPS_DEBUG_COP0_COUNTERS enabled
net/sched: sch_qfq: reintroduce lmax bound check for MTU
drm/atomic: Fix potential use-after-free in nonblocking commits
Linux 5.15.121
Note, this merges away commit e4e7f67cc1 ("arm64: errata: Add
detection for TRBE overwrite in FILL mode") as it causes ABI issues. If
that is to be needed for this branch, it can come back later in an
ABI-safe way.
It also merges away commit 7eeed3ed1a ("mm/damon/ops-common:
atomically test and clear young on ptes and pmds") as it had too many
merge conflicts. If that is needed in a future release it needs to be
added as a proper BACKPORT.
Change-Id: I3616f191a93077f7e462279d628b9ee9a30b6ea5
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -123,3 +123,11 @@ Other examples (per target):
|
||||
0 1638400 verity 1 8:1 8:2 4096 4096 204800 1 sha256
|
||||
fb1a5a0f00deb908d8b53cb270858975e76cf64105d412ce764225d53b8f3cfd
|
||||
51934789604d1b92399c52e7cb149d1b3a1b74bbbcb103b2a0aaacbed5c08584
|
||||
|
||||
For setups using device-mapper on top of asynchronously probed block
|
||||
devices (MMC, USB, ..), it may be necessary to tell dm-init to
|
||||
explicitly wait for them to become available before setting up the
|
||||
device-mapper tables. This can be done with the "dm-mod.waitfor="
|
||||
module parameter, which takes a list of devices to wait for::
|
||||
|
||||
dm-mod.waitfor=<device1>[,..,<deviceN>]
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 120
|
||||
SUBLEVEL = 121
|
||||
EXTRAVERSION =
|
||||
NAME = Trick or Treat
|
||||
|
||||
|
||||
@@ -318,7 +318,7 @@ struct kvm_vcpu_arch {
|
||||
unsigned int aux_inuse;
|
||||
|
||||
/* COP0 State */
|
||||
struct mips_coproc *cop0;
|
||||
struct mips_coproc cop0;
|
||||
|
||||
/* Resume PC after MMIO completion */
|
||||
unsigned long io_pc;
|
||||
@@ -699,7 +699,7 @@ static inline bool kvm_mips_guest_can_have_fpu(struct kvm_vcpu_arch *vcpu)
|
||||
static inline bool kvm_mips_guest_has_fpu(struct kvm_vcpu_arch *vcpu)
|
||||
{
|
||||
return kvm_mips_guest_can_have_fpu(vcpu) &&
|
||||
kvm_read_c0_guest_config1(vcpu->cop0) & MIPS_CONF1_FP;
|
||||
kvm_read_c0_guest_config1(&vcpu->cop0) & MIPS_CONF1_FP;
|
||||
}
|
||||
|
||||
static inline bool kvm_mips_guest_can_have_msa(struct kvm_vcpu_arch *vcpu)
|
||||
@@ -711,7 +711,7 @@ static inline bool kvm_mips_guest_can_have_msa(struct kvm_vcpu_arch *vcpu)
|
||||
static inline bool kvm_mips_guest_has_msa(struct kvm_vcpu_arch *vcpu)
|
||||
{
|
||||
return kvm_mips_guest_can_have_msa(vcpu) &&
|
||||
kvm_read_c0_guest_config3(vcpu->cop0) & MIPS_CONF3_MSA;
|
||||
kvm_read_c0_guest_config3(&vcpu->cop0) & MIPS_CONF3_MSA;
|
||||
}
|
||||
|
||||
struct kvm_mips_callbacks {
|
||||
|
||||
@@ -1734,7 +1734,10 @@ static inline void decode_cpucfg(struct cpuinfo_mips *c)
|
||||
|
||||
static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
c->cputype = CPU_LOONGSON64;
|
||||
|
||||
/* All Loongson processors covered here define ExcCode 16 as GSExc. */
|
||||
decode_configs(c);
|
||||
c->options |= MIPS_CPU_GSEXCEX;
|
||||
|
||||
switch (c->processor_id & PRID_IMP_MASK) {
|
||||
@@ -1744,7 +1747,6 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
case PRID_REV_LOONGSON2K_R1_1:
|
||||
case PRID_REV_LOONGSON2K_R1_2:
|
||||
case PRID_REV_LOONGSON2K_R1_3:
|
||||
c->cputype = CPU_LOONGSON64;
|
||||
__cpu_name[cpu] = "Loongson-2K";
|
||||
set_elf_platform(cpu, "gs264e");
|
||||
set_isa(c, MIPS_CPU_ISA_M64R2);
|
||||
@@ -1757,14 +1759,12 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
switch (c->processor_id & PRID_REV_MASK) {
|
||||
case PRID_REV_LOONGSON3A_R2_0:
|
||||
case PRID_REV_LOONGSON3A_R2_1:
|
||||
c->cputype = CPU_LOONGSON64;
|
||||
__cpu_name[cpu] = "ICT Loongson-3";
|
||||
set_elf_platform(cpu, "loongson3a");
|
||||
set_isa(c, MIPS_CPU_ISA_M64R2);
|
||||
break;
|
||||
case PRID_REV_LOONGSON3A_R3_0:
|
||||
case PRID_REV_LOONGSON3A_R3_1:
|
||||
c->cputype = CPU_LOONGSON64;
|
||||
__cpu_name[cpu] = "ICT Loongson-3";
|
||||
set_elf_platform(cpu, "loongson3a");
|
||||
set_isa(c, MIPS_CPU_ISA_M64R2);
|
||||
@@ -1784,7 +1784,6 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
c->ases &= ~MIPS_ASE_VZ; /* VZ of Loongson-3A2000/3000 is incomplete */
|
||||
break;
|
||||
case PRID_IMP_LOONGSON_64G:
|
||||
c->cputype = CPU_LOONGSON64;
|
||||
__cpu_name[cpu] = "ICT Loongson-3";
|
||||
set_elf_platform(cpu, "loongson3a");
|
||||
set_isa(c, MIPS_CPU_ISA_M64R2);
|
||||
@@ -1794,8 +1793,6 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
panic("Unknown Loongson Processor ID!");
|
||||
break;
|
||||
}
|
||||
|
||||
decode_configs(c);
|
||||
}
|
||||
#else
|
||||
static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu) { }
|
||||
|
||||
@@ -312,7 +312,7 @@ int kvm_get_badinstrp(u32 *opc, struct kvm_vcpu *vcpu, u32 *out)
|
||||
*/
|
||||
int kvm_mips_count_disabled(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
|
||||
return (vcpu->arch.count_ctl & KVM_REG_MIPS_COUNT_CTL_DC) ||
|
||||
(kvm_read_c0_guest_cause(cop0) & CAUSEF_DC);
|
||||
@@ -384,7 +384,7 @@ static inline ktime_t kvm_mips_count_time(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
static u32 kvm_mips_read_count_running(struct kvm_vcpu *vcpu, ktime_t now)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
ktime_t expires, threshold;
|
||||
u32 count, compare;
|
||||
int running;
|
||||
@@ -444,7 +444,7 @@ static u32 kvm_mips_read_count_running(struct kvm_vcpu *vcpu, ktime_t now)
|
||||
*/
|
||||
u32 kvm_mips_read_count(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
|
||||
/* If count disabled just read static copy of count */
|
||||
if (kvm_mips_count_disabled(vcpu))
|
||||
@@ -502,7 +502,7 @@ ktime_t kvm_mips_freeze_hrtimer(struct kvm_vcpu *vcpu, u32 *count)
|
||||
static void kvm_mips_resume_hrtimer(struct kvm_vcpu *vcpu,
|
||||
ktime_t now, u32 count)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
u32 compare;
|
||||
u64 delta;
|
||||
ktime_t expire;
|
||||
@@ -603,7 +603,7 @@ resume:
|
||||
*/
|
||||
void kvm_mips_write_count(struct kvm_vcpu *vcpu, u32 count)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
ktime_t now;
|
||||
|
||||
/* Calculate bias */
|
||||
@@ -649,7 +649,7 @@ void kvm_mips_init_count(struct kvm_vcpu *vcpu, unsigned long count_hz)
|
||||
*/
|
||||
int kvm_mips_set_count_hz(struct kvm_vcpu *vcpu, s64 count_hz)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
int dc;
|
||||
ktime_t now;
|
||||
u32 count;
|
||||
@@ -696,7 +696,7 @@ int kvm_mips_set_count_hz(struct kvm_vcpu *vcpu, s64 count_hz)
|
||||
*/
|
||||
void kvm_mips_write_compare(struct kvm_vcpu *vcpu, u32 compare, bool ack)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
int dc;
|
||||
u32 old_compare = kvm_read_c0_guest_compare(cop0);
|
||||
s32 delta = compare - old_compare;
|
||||
@@ -779,7 +779,7 @@ void kvm_mips_write_compare(struct kvm_vcpu *vcpu, u32 compare, bool ack)
|
||||
*/
|
||||
static ktime_t kvm_mips_count_disable(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
u32 count;
|
||||
ktime_t now;
|
||||
|
||||
@@ -806,7 +806,7 @@ static ktime_t kvm_mips_count_disable(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
void kvm_mips_count_disable_cause(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
|
||||
kvm_set_c0_guest_cause(cop0, CAUSEF_DC);
|
||||
if (!(vcpu->arch.count_ctl & KVM_REG_MIPS_COUNT_CTL_DC))
|
||||
@@ -826,7 +826,7 @@ void kvm_mips_count_disable_cause(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
void kvm_mips_count_enable_cause(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
u32 count;
|
||||
|
||||
kvm_clear_c0_guest_cause(cop0, CAUSEF_DC);
|
||||
@@ -852,7 +852,7 @@ void kvm_mips_count_enable_cause(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
int kvm_mips_set_count_ctl(struct kvm_vcpu *vcpu, s64 count_ctl)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
s64 changed = count_ctl ^ vcpu->arch.count_ctl;
|
||||
s64 delta;
|
||||
ktime_t expire, now;
|
||||
|
||||
@@ -652,7 +652,7 @@ static int kvm_mips_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices)
|
||||
static int kvm_mips_get_reg(struct kvm_vcpu *vcpu,
|
||||
const struct kvm_one_reg *reg)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
struct mips_fpu_struct *fpu = &vcpu->arch.fpu;
|
||||
int ret;
|
||||
s64 v;
|
||||
@@ -764,7 +764,7 @@ static int kvm_mips_get_reg(struct kvm_vcpu *vcpu,
|
||||
static int kvm_mips_set_reg(struct kvm_vcpu *vcpu,
|
||||
const struct kvm_one_reg *reg)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
struct mips_fpu_struct *fpu = &vcpu->arch.fpu;
|
||||
s64 v;
|
||||
s64 vs[2];
|
||||
@@ -1104,7 +1104,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return kvm_mips_pending_timer(vcpu) ||
|
||||
kvm_read_c0_guest_cause(vcpu->arch.cop0) & C_TI;
|
||||
kvm_read_c0_guest_cause(&vcpu->arch.cop0) & C_TI;
|
||||
}
|
||||
|
||||
int kvm_arch_vcpu_dump_regs(struct kvm_vcpu *vcpu)
|
||||
@@ -1128,7 +1128,7 @@ int kvm_arch_vcpu_dump_regs(struct kvm_vcpu *vcpu)
|
||||
kvm_debug("\thi: 0x%08lx\n", vcpu->arch.hi);
|
||||
kvm_debug("\tlo: 0x%08lx\n", vcpu->arch.lo);
|
||||
|
||||
cop0 = vcpu->arch.cop0;
|
||||
cop0 = &vcpu->arch.cop0;
|
||||
kvm_debug("\tStatus: 0x%08x, Cause: 0x%08x\n",
|
||||
kvm_read_c0_guest_status(cop0),
|
||||
kvm_read_c0_guest_cause(cop0));
|
||||
@@ -1250,7 +1250,7 @@ int kvm_mips_handle_exit(struct kvm_vcpu *vcpu)
|
||||
|
||||
case EXCCODE_TLBS:
|
||||
kvm_debug("TLB ST fault: cause %#x, status %#x, PC: %p, BadVaddr: %#lx\n",
|
||||
cause, kvm_read_c0_guest_status(vcpu->arch.cop0), opc,
|
||||
cause, kvm_read_c0_guest_status(&vcpu->arch.cop0), opc,
|
||||
badvaddr);
|
||||
|
||||
++vcpu->stat.tlbmiss_st_exits;
|
||||
@@ -1322,7 +1322,7 @@ int kvm_mips_handle_exit(struct kvm_vcpu *vcpu)
|
||||
kvm_get_badinstr(opc, vcpu, &inst);
|
||||
kvm_err("Exception Code: %d, not yet handled, @ PC: %p, inst: 0x%08x BadVaddr: %#lx Status: %#x\n",
|
||||
exccode, opc, inst, badvaddr,
|
||||
kvm_read_c0_guest_status(vcpu->arch.cop0));
|
||||
kvm_read_c0_guest_status(&vcpu->arch.cop0));
|
||||
kvm_arch_vcpu_dump_regs(vcpu);
|
||||
run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
||||
ret = RESUME_HOST;
|
||||
@@ -1384,7 +1384,7 @@ int kvm_mips_handle_exit(struct kvm_vcpu *vcpu)
|
||||
/* Enable FPU for guest and restore context */
|
||||
void kvm_own_fpu(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
unsigned int sr, cfg5;
|
||||
|
||||
preempt_disable();
|
||||
@@ -1428,7 +1428,7 @@ void kvm_own_fpu(struct kvm_vcpu *vcpu)
|
||||
/* Enable MSA for guest and restore context */
|
||||
void kvm_own_msa(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
unsigned int sr, cfg5;
|
||||
|
||||
preempt_disable();
|
||||
|
||||
@@ -54,9 +54,9 @@ void kvm_mips_dump_stats(struct kvm_vcpu *vcpu)
|
||||
kvm_info("\nKVM VCPU[%d] COP0 Access Profile:\n", vcpu->vcpu_id);
|
||||
for (i = 0; i < N_MIPS_COPROC_REGS; i++) {
|
||||
for (j = 0; j < N_MIPS_COPROC_SEL; j++) {
|
||||
if (vcpu->arch.cop0->stat[i][j])
|
||||
if (vcpu->arch.cop0.stat[i][j])
|
||||
kvm_info("%s[%d]: %lu\n", kvm_cop0_str[i], j,
|
||||
vcpu->arch.cop0->stat[i][j]);
|
||||
vcpu->arch.cop0.stat[i][j]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -322,11 +322,11 @@ TRACE_EVENT_FN(kvm_guest_mode_change,
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->epc = kvm_read_c0_guest_epc(vcpu->arch.cop0);
|
||||
__entry->epc = kvm_read_c0_guest_epc(&vcpu->arch.cop0);
|
||||
__entry->pc = vcpu->arch.pc;
|
||||
__entry->badvaddr = kvm_read_c0_guest_badvaddr(vcpu->arch.cop0);
|
||||
__entry->status = kvm_read_c0_guest_status(vcpu->arch.cop0);
|
||||
__entry->cause = kvm_read_c0_guest_cause(vcpu->arch.cop0);
|
||||
__entry->badvaddr = kvm_read_c0_guest_badvaddr(&vcpu->arch.cop0);
|
||||
__entry->status = kvm_read_c0_guest_status(&vcpu->arch.cop0);
|
||||
__entry->cause = kvm_read_c0_guest_cause(&vcpu->arch.cop0);
|
||||
),
|
||||
|
||||
TP_printk("EPC: 0x%08lx PC: 0x%08lx Status: 0x%08x Cause: 0x%08x BadVAddr: 0x%08lx",
|
||||
|
||||
@@ -422,7 +422,7 @@ static void _kvm_vz_restore_htimer(struct kvm_vcpu *vcpu,
|
||||
*/
|
||||
static void kvm_vz_restore_timer(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
u32 cause, compare;
|
||||
|
||||
compare = kvm_read_sw_gc0_compare(cop0);
|
||||
@@ -517,7 +517,7 @@ static void _kvm_vz_save_htimer(struct kvm_vcpu *vcpu,
|
||||
*/
|
||||
static void kvm_vz_save_timer(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
u32 gctl0, compare, cause;
|
||||
|
||||
gctl0 = read_c0_guestctl0();
|
||||
@@ -863,7 +863,7 @@ static unsigned long mips_process_maar(unsigned int op, unsigned long val)
|
||||
|
||||
static void kvm_write_maari(struct kvm_vcpu *vcpu, unsigned long val)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
|
||||
val &= MIPS_MAARI_INDEX;
|
||||
if (val == MIPS_MAARI_INDEX)
|
||||
@@ -876,7 +876,7 @@ static enum emulation_result kvm_vz_gpsi_cop0(union mips_instruction inst,
|
||||
u32 *opc, u32 cause,
|
||||
struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
enum emulation_result er = EMULATE_DONE;
|
||||
u32 rt, rd, sel;
|
||||
unsigned long curr_pc;
|
||||
@@ -1905,7 +1905,7 @@ static int kvm_vz_get_one_reg(struct kvm_vcpu *vcpu,
|
||||
const struct kvm_one_reg *reg,
|
||||
s64 *v)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
unsigned int idx;
|
||||
|
||||
switch (reg->id) {
|
||||
@@ -2075,7 +2075,7 @@ static int kvm_vz_get_one_reg(struct kvm_vcpu *vcpu,
|
||||
case KVM_REG_MIPS_CP0_MAARI:
|
||||
if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
|
||||
return -EINVAL;
|
||||
*v = kvm_read_sw_gc0_maari(vcpu->arch.cop0);
|
||||
*v = kvm_read_sw_gc0_maari(&vcpu->arch.cop0);
|
||||
break;
|
||||
#ifdef CONFIG_64BIT
|
||||
case KVM_REG_MIPS_CP0_XCONTEXT:
|
||||
@@ -2129,7 +2129,7 @@ static int kvm_vz_set_one_reg(struct kvm_vcpu *vcpu,
|
||||
const struct kvm_one_reg *reg,
|
||||
s64 v)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
unsigned int idx;
|
||||
int ret = 0;
|
||||
unsigned int cur, change;
|
||||
@@ -2556,7 +2556,7 @@ static void kvm_vz_vcpu_load_tlb(struct kvm_vcpu *vcpu, int cpu)
|
||||
|
||||
static int kvm_vz_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
bool migrated, all;
|
||||
|
||||
/*
|
||||
@@ -2698,7 +2698,7 @@ static int kvm_vz_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||
|
||||
static int kvm_vz_vcpu_put(struct kvm_vcpu *vcpu, int cpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
|
||||
if (current->flags & PF_VCPU)
|
||||
kvm_vz_vcpu_save_wired(vcpu);
|
||||
@@ -3070,7 +3070,7 @@ static void kvm_vz_vcpu_uninit(struct kvm_vcpu *vcpu)
|
||||
|
||||
static int kvm_vz_vcpu_setup(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
struct mips_coproc *cop0 = &vcpu->arch.cop0;
|
||||
unsigned long count_hz = 100*1000*1000; /* default to 100 MHz */
|
||||
|
||||
/*
|
||||
|
||||
@@ -444,3 +444,11 @@ checkbin:
|
||||
echo -n '*** Please use a different binutils version.' ; \
|
||||
false ; \
|
||||
fi
|
||||
@if test "x${CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT}" = "xy" -a \
|
||||
"x${CONFIG_LD_IS_BFD}" = "xy" -a \
|
||||
"${CONFIG_LD_VERSION}" = "23700" ; then \
|
||||
echo -n '*** binutils 2.37 drops unused section symbols, which recordmcount ' ; \
|
||||
echo 'is unable to handle.' ; \
|
||||
echo '*** Please use a different binutils version.' ; \
|
||||
false ; \
|
||||
fi
|
||||
|
||||
@@ -363,26 +363,27 @@ ssize_t cpu_show_spec_store_bypass(struct device *dev, struct device_attribute *
|
||||
|
||||
static int ssb_prctl_get(struct task_struct *task)
|
||||
{
|
||||
if (stf_enabled_flush_types == STF_BARRIER_NONE)
|
||||
/*
|
||||
* We don't have an explicit signal from firmware that we're
|
||||
* vulnerable or not, we only have certain CPU revisions that
|
||||
* are known to be vulnerable.
|
||||
*
|
||||
* We assume that if we're on another CPU, where the barrier is
|
||||
* NONE, then we are not vulnerable.
|
||||
*/
|
||||
/*
|
||||
* The STF_BARRIER feature is on by default, so if it's off that means
|
||||
* firmware has explicitly said the CPU is not vulnerable via either
|
||||
* the hypercall or device tree.
|
||||
*/
|
||||
if (!security_ftr_enabled(SEC_FTR_STF_BARRIER))
|
||||
return PR_SPEC_NOT_AFFECTED;
|
||||
else
|
||||
/*
|
||||
* If we do have a barrier type then we are vulnerable. The
|
||||
* barrier is not a global or per-process mitigation, so the
|
||||
* only value we can report here is PR_SPEC_ENABLE, which
|
||||
* appears as "vulnerable" in /proc.
|
||||
*/
|
||||
return PR_SPEC_ENABLE;
|
||||
|
||||
return -EINVAL;
|
||||
/*
|
||||
* If the system's CPU has no known barrier (see setup_stf_barrier())
|
||||
* then assume that the CPU is not vulnerable.
|
||||
*/
|
||||
if (stf_enabled_flush_types == STF_BARRIER_NONE)
|
||||
return PR_SPEC_NOT_AFFECTED;
|
||||
|
||||
/*
|
||||
* Otherwise the CPU is vulnerable. The barrier is not a global or
|
||||
* per-process mitigation, so the only value that can be reported here
|
||||
* is PR_SPEC_ENABLE, which appears as "vulnerable" in /proc.
|
||||
*/
|
||||
return PR_SPEC_ENABLE;
|
||||
}
|
||||
|
||||
int arch_prctl_spec_ctrl_get(struct task_struct *task, unsigned long which)
|
||||
|
||||
@@ -843,7 +843,7 @@ static void __init reserve_crashkernel(void)
|
||||
*/
|
||||
crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
|
||||
search_start,
|
||||
min(search_end, (unsigned long) SZ_4G));
|
||||
min(search_end, (unsigned long)(SZ_4G - 1)));
|
||||
if (crash_base == 0) {
|
||||
/* Try again without restricting region to 32bit addressible memory */
|
||||
crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
|
||||
|
||||
@@ -29,6 +29,7 @@ KBUILD_CFLAGS_DECOMPRESSOR += -fno-delete-null-pointer-checks -msoft-float -mbac
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -fno-asynchronous-unwind-tables
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -ffreestanding
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -fno-stack-protector
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -fPIE
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += $(call cc-disable-warning, address-of-packed-member)
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),-g)
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))
|
||||
|
||||
@@ -231,7 +231,7 @@ static int tuntap_probe(struct iss_net_private *lp, int index, char *init)
|
||||
|
||||
init += sizeof(TRANSPORT_TUNTAP_NAME) - 1;
|
||||
if (*init == ',') {
|
||||
rem = split_if_spec(init + 1, &mac_str, &dev_name);
|
||||
rem = split_if_spec(init + 1, &mac_str, &dev_name, NULL);
|
||||
if (rem != NULL) {
|
||||
pr_err("%s: extra garbage on specification : '%s'\n",
|
||||
dev->name, rem);
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#define IXP4XX_EXP_TIMING_STRIDE 0x04
|
||||
#define IXP4XX_EXP_CS_EN BIT(31)
|
||||
#define IXP456_EXP_PAR_EN BIT(30) /* Only on IXP45x and IXP46x */
|
||||
#define IXP4XX_EXP_T1_MASK GENMASK(28, 27)
|
||||
#define IXP4XX_EXP_T1_MASK GENMASK(29, 28)
|
||||
#define IXP4XX_EXP_T1_SHIFT 28
|
||||
#define IXP4XX_EXP_T2_MASK GENMASK(27, 26)
|
||||
#define IXP4XX_EXP_T2_SHIFT 26
|
||||
|
||||
@@ -110,7 +110,7 @@ static int imx_rngc_self_test(struct imx_rngc *rngc)
|
||||
cmd = readl(rngc->base + RNGC_COMMAND);
|
||||
writel(cmd | RNGC_CMD_SELF_TEST, rngc->base + RNGC_COMMAND);
|
||||
|
||||
ret = wait_for_completion_timeout(&rngc->rng_op_done, RNGC_TIMEOUT);
|
||||
ret = wait_for_completion_timeout(&rngc->rng_op_done, msecs_to_jiffies(RNGC_TIMEOUT));
|
||||
imx_rngc_irq_mask_clear(rngc);
|
||||
if (!ret)
|
||||
return -ETIMEDOUT;
|
||||
@@ -187,9 +187,7 @@ static int imx_rngc_init(struct hwrng *rng)
|
||||
cmd = readl(rngc->base + RNGC_COMMAND);
|
||||
writel(cmd | RNGC_CMD_SEED, rngc->base + RNGC_COMMAND);
|
||||
|
||||
ret = wait_for_completion_timeout(&rngc->rng_op_done,
|
||||
RNGC_TIMEOUT);
|
||||
|
||||
ret = wait_for_completion_timeout(&rngc->rng_op_done, msecs_to_jiffies(RNGC_TIMEOUT));
|
||||
if (!ret) {
|
||||
ret = -ETIMEDOUT;
|
||||
goto err;
|
||||
|
||||
@@ -683,37 +683,21 @@ static struct miscdevice vtpmx_miscdev = {
|
||||
.fops = &vtpmx_fops,
|
||||
};
|
||||
|
||||
static int vtpmx_init(void)
|
||||
{
|
||||
return misc_register(&vtpmx_miscdev);
|
||||
}
|
||||
|
||||
static void vtpmx_cleanup(void)
|
||||
{
|
||||
misc_deregister(&vtpmx_miscdev);
|
||||
}
|
||||
|
||||
static int __init vtpm_module_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = vtpmx_init();
|
||||
if (rc) {
|
||||
pr_err("couldn't create vtpmx device\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
workqueue = create_workqueue("tpm-vtpm");
|
||||
if (!workqueue) {
|
||||
pr_err("couldn't create workqueue\n");
|
||||
rc = -ENOMEM;
|
||||
goto err_vtpmx_cleanup;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_vtpmx_cleanup:
|
||||
vtpmx_cleanup();
|
||||
rc = misc_register(&vtpmx_miscdev);
|
||||
if (rc) {
|
||||
pr_err("couldn't create vtpmx device\n");
|
||||
destroy_workqueue(workqueue);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -721,7 +705,7 @@ err_vtpmx_cleanup:
|
||||
static void __exit vtpm_module_exit(void)
|
||||
{
|
||||
destroy_workqueue(workqueue);
|
||||
vtpmx_cleanup();
|
||||
misc_deregister(&vtpmx_miscdev);
|
||||
}
|
||||
|
||||
module_init(vtpm_module_init);
|
||||
|
||||
@@ -622,7 +622,7 @@ svc_create_memory_pool(struct platform_device *pdev,
|
||||
end = rounddown(sh_memory->addr + sh_memory->size, PAGE_SIZE);
|
||||
paddr = begin;
|
||||
size = end - begin;
|
||||
va = memremap(paddr, size, MEMREMAP_WC);
|
||||
va = devm_memremap(dev, paddr, size, MEMREMAP_WC);
|
||||
if (!va) {
|
||||
dev_err(dev, "fail to remap shared memory\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
@@ -2350,6 +2350,9 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info, struct dma_fence **ef)
|
||||
if (!attachment->is_mapped)
|
||||
continue;
|
||||
|
||||
if (attachment->bo_va->base.bo->tbo.pin_count)
|
||||
continue;
|
||||
|
||||
kfd_mem_dmaunmap_attachment(mem, attachment);
|
||||
ret = update_gpuvm_pte(mem, attachment, &sync_obj, NULL);
|
||||
if (ret) {
|
||||
|
||||
@@ -2575,18 +2575,30 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
|
||||
|
||||
/* Insert partial mapping before the range */
|
||||
if (!list_empty(&before->list)) {
|
||||
struct amdgpu_bo *bo = before->bo_va->base.bo;
|
||||
|
||||
amdgpu_vm_it_insert(before, &vm->va);
|
||||
if (before->flags & AMDGPU_PTE_PRT)
|
||||
amdgpu_vm_prt_get(adev);
|
||||
|
||||
if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv &&
|
||||
!before->bo_va->base.moved)
|
||||
amdgpu_vm_bo_moved(&before->bo_va->base);
|
||||
} else {
|
||||
kfree(before);
|
||||
}
|
||||
|
||||
/* Insert partial mapping after the range */
|
||||
if (!list_empty(&after->list)) {
|
||||
struct amdgpu_bo *bo = after->bo_va->base.bo;
|
||||
|
||||
amdgpu_vm_it_insert(after, &vm->va);
|
||||
if (after->flags & AMDGPU_PTE_PRT)
|
||||
amdgpu_vm_prt_get(adev);
|
||||
|
||||
if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv &&
|
||||
!after->bo_va->base.moved)
|
||||
amdgpu_vm_bo_moved(&after->bo_va->base);
|
||||
} else {
|
||||
kfree(after);
|
||||
}
|
||||
|
||||
@@ -445,7 +445,7 @@ struct dmub_notification {
|
||||
* of a firmware to know if feature or functionality is supported or present.
|
||||
*/
|
||||
#define DMUB_FW_VERSION(major, minor, revision) \
|
||||
((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((revision) & 0xFFFF))
|
||||
((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | (((revision) & 0xFF) << 8))
|
||||
|
||||
/**
|
||||
* dmub_srv_create() - creates the DMUB service.
|
||||
|
||||
@@ -138,6 +138,12 @@ drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
if (!state->planes)
|
||||
goto fail;
|
||||
|
||||
/*
|
||||
* Because drm_atomic_state can be committed asynchronously we need our
|
||||
* own reference and cannot rely on the on implied by drm_file in the
|
||||
* ioctl call.
|
||||
*/
|
||||
drm_dev_get(dev);
|
||||
state->dev = dev;
|
||||
|
||||
DRM_DEBUG_ATOMIC("Allocated atomic state %p\n", state);
|
||||
@@ -297,7 +303,8 @@ EXPORT_SYMBOL(drm_atomic_state_clear);
|
||||
void __drm_atomic_state_free(struct kref *ref)
|
||||
{
|
||||
struct drm_atomic_state *state = container_of(ref, typeof(*state), ref);
|
||||
struct drm_mode_config *config = &state->dev->mode_config;
|
||||
struct drm_device *dev = state->dev;
|
||||
struct drm_mode_config *config = &dev->mode_config;
|
||||
|
||||
drm_atomic_state_clear(state);
|
||||
|
||||
@@ -309,6 +316,8 @@ void __drm_atomic_state_free(struct kref *ref)
|
||||
drm_atomic_state_default_release(state);
|
||||
kfree(state);
|
||||
}
|
||||
|
||||
drm_dev_put(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(__drm_atomic_state_free);
|
||||
|
||||
|
||||
@@ -1122,7 +1122,16 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
|
||||
continue;
|
||||
|
||||
ret = drm_crtc_vblank_get(crtc);
|
||||
WARN_ONCE(ret != -EINVAL, "driver forgot to call drm_crtc_vblank_off()\n");
|
||||
/*
|
||||
* Self-refresh is not a true "disable"; ensure vblank remains
|
||||
* enabled.
|
||||
*/
|
||||
if (new_crtc_state->self_refresh_active)
|
||||
WARN_ONCE(ret != 0,
|
||||
"driver disabled vblank in self-refresh\n");
|
||||
else
|
||||
WARN_ONCE(ret != -EINVAL,
|
||||
"driver forgot to call drm_crtc_vblank_off()\n");
|
||||
if (ret == 0)
|
||||
drm_crtc_vblank_put(crtc);
|
||||
}
|
||||
|
||||
@@ -703,13 +703,13 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
if (crtc->state->self_refresh_active)
|
||||
rockchip_drm_set_win_enabled(crtc, false);
|
||||
|
||||
if (crtc->state->self_refresh_active)
|
||||
goto out;
|
||||
|
||||
mutex_lock(&vop->vop_lock);
|
||||
|
||||
drm_crtc_vblank_off(crtc);
|
||||
|
||||
if (crtc->state->self_refresh_active)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Vop standby will take effect at end of current frame,
|
||||
* if dsp hold valid irq happen, it means standby complete.
|
||||
@@ -741,9 +741,9 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
vop_core_clks_disable(vop);
|
||||
pm_runtime_put(vop->dev);
|
||||
|
||||
out:
|
||||
mutex_unlock(&vop->vop_lock);
|
||||
|
||||
out:
|
||||
if (crtc->state->event && !crtc->state->active) {
|
||||
spin_lock_irq(&crtc->dev->event_lock);
|
||||
drm_crtc_send_vblank_event(crtc, crtc->state->event);
|
||||
|
||||
@@ -1187,6 +1187,7 @@ int ttm_bo_swapout(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx,
|
||||
ret = ttm_bo_handle_move_mem(bo, evict_mem, true, &ctx, &hop);
|
||||
if (unlikely(ret != 0)) {
|
||||
WARN(ret == -EMULTIHOP, "Unexpected multihop in swaput - likely driver bug.\n");
|
||||
ttm_resource_free(bo, &evict_mem);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
#define MESON_SAR_ADC_REG3_PANEL_DETECT_COUNT_MASK GENMASK(20, 18)
|
||||
#define MESON_SAR_ADC_REG3_PANEL_DETECT_FILTER_TB_MASK GENMASK(17, 16)
|
||||
#define MESON_SAR_ADC_REG3_ADC_CLK_DIV_SHIFT 10
|
||||
#define MESON_SAR_ADC_REG3_ADC_CLK_DIV_WIDTH 5
|
||||
#define MESON_SAR_ADC_REG3_ADC_CLK_DIV_WIDTH 6
|
||||
#define MESON_SAR_ADC_REG3_BLOCK_DLY_SEL_MASK GENMASK(9, 8)
|
||||
#define MESON_SAR_ADC_REG3_BLOCK_DLY_MASK GENMASK(7, 0)
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/device-mapper.h>
|
||||
#include <linux/init.h>
|
||||
@@ -18,12 +19,17 @@
|
||||
#define DM_MAX_DEVICES 256
|
||||
#define DM_MAX_TARGETS 256
|
||||
#define DM_MAX_STR_SIZE 4096
|
||||
#define DM_MAX_WAITFOR 256
|
||||
|
||||
static char *create;
|
||||
|
||||
static char *waitfor[DM_MAX_WAITFOR];
|
||||
|
||||
/*
|
||||
* Format: dm-mod.create=<name>,<uuid>,<minor>,<flags>,<table>[,<table>+][;<name>,<uuid>,<minor>,<flags>,<table>[,<table>+]+]
|
||||
* Table format: <start_sector> <num_sectors> <target_type> <target_args>
|
||||
* Block devices to wait for to become available before setting up tables:
|
||||
* dm-mod.waitfor=<device1>[,..,<deviceN>]
|
||||
*
|
||||
* See Documentation/admin-guide/device-mapper/dm-init.rst for dm-mod.create="..." format
|
||||
* details.
|
||||
@@ -266,7 +272,7 @@ static int __init dm_init_init(void)
|
||||
struct dm_device *dev;
|
||||
LIST_HEAD(devices);
|
||||
char *str;
|
||||
int r;
|
||||
int i, r;
|
||||
|
||||
if (!create)
|
||||
return 0;
|
||||
@@ -286,6 +292,17 @@ static int __init dm_init_init(void)
|
||||
DMINFO("waiting for all devices to be available before creating mapped devices");
|
||||
wait_for_device_probe();
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(waitfor); i++) {
|
||||
if (waitfor[i]) {
|
||||
DMINFO("waiting for device %s ...", waitfor[i]);
|
||||
while (!dm_get_dev_t(waitfor[i]))
|
||||
msleep(5);
|
||||
}
|
||||
}
|
||||
|
||||
if (waitfor[0])
|
||||
DMINFO("all devices available");
|
||||
|
||||
list_for_each_entry(dev, &devices, list) {
|
||||
if (dm_early_create(&dev->dmi, dev->table,
|
||||
dev->target_args_array))
|
||||
@@ -301,3 +318,6 @@ late_initcall(dm_init_init);
|
||||
|
||||
module_param(create, charp, 0);
|
||||
MODULE_PARM_DESC(create, "Create a mapped device in early boot");
|
||||
|
||||
module_param_array(waitfor, charp, NULL, 0);
|
||||
MODULE_PARM_DESC(waitfor, "Devices to wait for before setting up tables");
|
||||
|
||||
@@ -31,11 +31,11 @@
|
||||
#define DEFAULT_BUFFER_SECTORS 128
|
||||
#define DEFAULT_JOURNAL_WATERMARK 50
|
||||
#define DEFAULT_SYNC_MSEC 10000
|
||||
#define DEFAULT_MAX_JOURNAL_SECTORS 131072
|
||||
#define DEFAULT_MAX_JOURNAL_SECTORS (IS_ENABLED(CONFIG_64BIT) ? 131072 : 8192)
|
||||
#define MIN_LOG2_INTERLEAVE_SECTORS 3
|
||||
#define MAX_LOG2_INTERLEAVE_SECTORS 31
|
||||
#define METADATA_WORKQUEUE_MAX_ACTIVE 16
|
||||
#define RECALC_SECTORS 32768
|
||||
#define RECALC_SECTORS (IS_ENABLED(CONFIG_64BIT) ? 32768 : 2048)
|
||||
#define RECALC_WRITE_SUPER 16
|
||||
#define BITMAP_BLOCK_SIZE 4096 /* don't change it */
|
||||
#define BITMAP_FLUSH_INTERVAL (10 * HZ)
|
||||
|
||||
@@ -274,6 +274,18 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
||||
goto abort;
|
||||
}
|
||||
|
||||
if (conf->layout == RAID0_ORIG_LAYOUT) {
|
||||
for (i = 1; i < conf->nr_strip_zones; i++) {
|
||||
sector_t first_sector = conf->strip_zone[i-1].zone_end;
|
||||
|
||||
sector_div(first_sector, mddev->chunk_sectors);
|
||||
zone = conf->strip_zone + i;
|
||||
/* disk_shift is first disk index used in the zone */
|
||||
zone->disk_shift = sector_div(first_sector,
|
||||
zone->nb_dev);
|
||||
}
|
||||
}
|
||||
|
||||
pr_debug("md/raid0:%s: done.\n", mdname(mddev));
|
||||
*private_conf = conf;
|
||||
|
||||
@@ -444,6 +456,20 @@ exit_acct_set:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert disk_index to the disk order in which it is read/written.
|
||||
* For example, if we have 4 disks, they are numbered 0,1,2,3. If we
|
||||
* write the disks starting at disk 3, then the read/write order would
|
||||
* be disk 3, then 0, then 1, and then disk 2 and we want map_disk_shift()
|
||||
* to map the disks as follows 0,1,2,3 => 1,2,3,0. So disk 0 would map
|
||||
* to 1, 1 to 2, 2 to 3, and 3 to 0. That way we can compare disks in
|
||||
* that 'output' space to understand the read/write disk ordering.
|
||||
*/
|
||||
static int map_disk_shift(int disk_index, int num_disks, int disk_shift)
|
||||
{
|
||||
return ((disk_index + num_disks - disk_shift) % num_disks);
|
||||
}
|
||||
|
||||
static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
|
||||
{
|
||||
struct r0conf *conf = mddev->private;
|
||||
@@ -457,7 +483,9 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
|
||||
sector_t end_disk_offset;
|
||||
unsigned int end_disk_index;
|
||||
unsigned int disk;
|
||||
sector_t orig_start, orig_end;
|
||||
|
||||
orig_start = start;
|
||||
zone = find_zone(conf, &start);
|
||||
|
||||
if (bio_end_sector(bio) > zone->zone_end) {
|
||||
@@ -471,6 +499,7 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
|
||||
} else
|
||||
end = bio_end_sector(bio);
|
||||
|
||||
orig_end = end;
|
||||
if (zone != conf->strip_zone)
|
||||
end = end - zone[-1].zone_end;
|
||||
|
||||
@@ -482,13 +511,26 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
|
||||
last_stripe_index = end;
|
||||
sector_div(last_stripe_index, stripe_size);
|
||||
|
||||
start_disk_index = (int)(start - first_stripe_index * stripe_size) /
|
||||
mddev->chunk_sectors;
|
||||
/* In the first zone the original and alternate layouts are the same */
|
||||
if ((conf->layout == RAID0_ORIG_LAYOUT) && (zone != conf->strip_zone)) {
|
||||
sector_div(orig_start, mddev->chunk_sectors);
|
||||
start_disk_index = sector_div(orig_start, zone->nb_dev);
|
||||
start_disk_index = map_disk_shift(start_disk_index,
|
||||
zone->nb_dev,
|
||||
zone->disk_shift);
|
||||
sector_div(orig_end, mddev->chunk_sectors);
|
||||
end_disk_index = sector_div(orig_end, zone->nb_dev);
|
||||
end_disk_index = map_disk_shift(end_disk_index,
|
||||
zone->nb_dev, zone->disk_shift);
|
||||
} else {
|
||||
start_disk_index = (int)(start - first_stripe_index * stripe_size) /
|
||||
mddev->chunk_sectors;
|
||||
end_disk_index = (int)(end - last_stripe_index * stripe_size) /
|
||||
mddev->chunk_sectors;
|
||||
}
|
||||
start_disk_offset = ((int)(start - first_stripe_index * stripe_size) %
|
||||
mddev->chunk_sectors) +
|
||||
first_stripe_index * mddev->chunk_sectors;
|
||||
end_disk_index = (int)(end - last_stripe_index * stripe_size) /
|
||||
mddev->chunk_sectors;
|
||||
end_disk_offset = ((int)(end - last_stripe_index * stripe_size) %
|
||||
mddev->chunk_sectors) +
|
||||
last_stripe_index * mddev->chunk_sectors;
|
||||
@@ -496,18 +538,22 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
|
||||
for (disk = 0; disk < zone->nb_dev; disk++) {
|
||||
sector_t dev_start, dev_end;
|
||||
struct md_rdev *rdev;
|
||||
int compare_disk;
|
||||
|
||||
if (disk < start_disk_index)
|
||||
compare_disk = map_disk_shift(disk, zone->nb_dev,
|
||||
zone->disk_shift);
|
||||
|
||||
if (compare_disk < start_disk_index)
|
||||
dev_start = (first_stripe_index + 1) *
|
||||
mddev->chunk_sectors;
|
||||
else if (disk > start_disk_index)
|
||||
else if (compare_disk > start_disk_index)
|
||||
dev_start = first_stripe_index * mddev->chunk_sectors;
|
||||
else
|
||||
dev_start = start_disk_offset;
|
||||
|
||||
if (disk < end_disk_index)
|
||||
if (compare_disk < end_disk_index)
|
||||
dev_end = (last_stripe_index + 1) * mddev->chunk_sectors;
|
||||
else if (disk > end_disk_index)
|
||||
else if (compare_disk > end_disk_index)
|
||||
dev_end = last_stripe_index * mddev->chunk_sectors;
|
||||
else
|
||||
dev_end = end_disk_offset;
|
||||
|
||||
@@ -6,6 +6,7 @@ struct strip_zone {
|
||||
sector_t zone_end; /* Start of the next zone (in sectors) */
|
||||
sector_t dev_start; /* Zone offset in real dev (in sectors) */
|
||||
int nb_dev; /* # of devices attached to the zone */
|
||||
int disk_shift; /* start disk for the original layout */
|
||||
};
|
||||
|
||||
/* Linux 3.14 (20d0189b101) made an unintended change to
|
||||
|
||||
@@ -233,6 +233,7 @@ static const struct of_device_id pm8008_match[] = {
|
||||
{ .compatible = "qcom,pm8008", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, pm8008_match);
|
||||
|
||||
static struct i2c_driver pm8008_mfd_driver = {
|
||||
.driver = {
|
||||
|
||||
@@ -1108,7 +1108,7 @@ static int fastrpc_init_create_process(struct fastrpc_user *fl,
|
||||
|
||||
sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE, 4, 0);
|
||||
if (init.attrs)
|
||||
sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_ATTR, 6, 0);
|
||||
sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_ATTR, 4, 0);
|
||||
|
||||
err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE,
|
||||
sc, args);
|
||||
|
||||
@@ -728,6 +728,10 @@ static long pci_endpoint_test_ioctl(struct file *file, unsigned int cmd,
|
||||
struct pci_dev *pdev = test->pdev;
|
||||
|
||||
mutex_lock(&test->mutex);
|
||||
|
||||
reinit_completion(&test->irq_raised);
|
||||
test->last_irq = -ENODATA;
|
||||
|
||||
switch (cmd) {
|
||||
case PCITEST_BAR:
|
||||
bar = arg;
|
||||
@@ -937,6 +941,9 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev)
|
||||
if (id < 0)
|
||||
return;
|
||||
|
||||
pci_endpoint_test_release_irq(test);
|
||||
pci_endpoint_test_free_irq_vectors(test);
|
||||
|
||||
misc_deregister(&test->miscdev);
|
||||
kfree(misc_device->name);
|
||||
kfree(test->name);
|
||||
@@ -946,9 +953,6 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev)
|
||||
pci_iounmap(pdev, test->bar[bar]);
|
||||
}
|
||||
|
||||
pci_endpoint_test_release_irq(test);
|
||||
pci_endpoint_test_free_irq_vectors(test);
|
||||
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
@@ -72,6 +72,7 @@
|
||||
#define GENCMDIADDRH(aih, addr) ((aih) | (((addr) >> 16) & 0xffff))
|
||||
|
||||
#define DMA_DIR(dir) ((dir) ? NFC_CMD_N2M : NFC_CMD_M2N)
|
||||
#define DMA_ADDR_ALIGN 8
|
||||
|
||||
#define ECC_CHECK_RETURN_FF (-1)
|
||||
|
||||
@@ -838,6 +839,9 @@ static int meson_nfc_read_oob(struct nand_chip *nand, int page)
|
||||
|
||||
static bool meson_nfc_is_buffer_dma_safe(const void *buffer)
|
||||
{
|
||||
if ((uintptr_t)buffer % DMA_ADDR_ALIGN)
|
||||
return false;
|
||||
|
||||
if (virt_addr_valid(buffer) && (!object_is_on_stack(buffer)))
|
||||
return true;
|
||||
return false;
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
|
||||
#define ENA_REGS_ADMIN_INTR_MASK 1
|
||||
|
||||
#define ENA_MAX_BACKOFF_DELAY_EXP 16U
|
||||
|
||||
#define ENA_MIN_ADMIN_POLL_US 100
|
||||
|
||||
#define ENA_MAX_ADMIN_POLL_US 5000
|
||||
@@ -536,6 +538,7 @@ static int ena_com_comp_status_to_errno(struct ena_com_admin_queue *admin_queue,
|
||||
|
||||
static void ena_delay_exponential_backoff_us(u32 exp, u32 delay_us)
|
||||
{
|
||||
exp = min_t(u32, exp, ENA_MAX_BACKOFF_DELAY_EXP);
|
||||
delay_us = max_t(u32, ENA_MIN_ADMIN_POLL_US, delay_us);
|
||||
delay_us = min_t(u32, delay_us * (1U << exp), ENA_MAX_ADMIN_POLL_US);
|
||||
usleep_range(delay_us, 2 * delay_us);
|
||||
|
||||
@@ -627,5 +627,7 @@ void bcmgenet_mii_exit(struct net_device *dev)
|
||||
if (of_phy_is_fixed_link(dn))
|
||||
of_phy_deregister_fixed_link(dn);
|
||||
of_node_put(priv->phy_dn);
|
||||
clk_prepare_enable(priv->clk);
|
||||
platform_device_unregister(priv->mii_pdev);
|
||||
clk_disable_unprepare(priv->clk);
|
||||
}
|
||||
|
||||
@@ -168,13 +168,10 @@ static ssize_t nsim_dev_trap_fa_cookie_write(struct file *file,
|
||||
cookie_len = (count - 1) / 2;
|
||||
if ((count - 1) % 2)
|
||||
return -EINVAL;
|
||||
buf = kmalloc(count, GFP_KERNEL | __GFP_NOWARN);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = simple_write_to_buffer(buf, count, ppos, data, count);
|
||||
if (ret < 0)
|
||||
goto free_buf;
|
||||
buf = memdup_user(data, count);
|
||||
if (IS_ERR(buf))
|
||||
return PTR_ERR(buf);
|
||||
|
||||
fa_cookie = kmalloc(sizeof(*fa_cookie) + cookie_len,
|
||||
GFP_KERNEL | __GFP_NOWARN);
|
||||
|
||||
@@ -6147,8 +6147,11 @@ static int airo_get_rate(struct net_device *dev,
|
||||
{
|
||||
struct airo_info *local = dev->ml_priv;
|
||||
StatusRid status_rid; /* Card status info */
|
||||
int ret;
|
||||
|
||||
readStatusRid(local, &status_rid, 1);
|
||||
ret = readStatusRid(local, &status_rid, 1);
|
||||
if (ret)
|
||||
return -EBUSY;
|
||||
|
||||
vwrq->value = le16_to_cpu(status_rid.currentXmitRate) * 500000;
|
||||
/* If more than one rate, set auto */
|
||||
|
||||
@@ -224,7 +224,6 @@ struct nvme_queue {
|
||||
struct nvme_iod {
|
||||
struct nvme_request req;
|
||||
struct nvme_command cmd;
|
||||
struct nvme_queue *nvmeq;
|
||||
bool use_sgl;
|
||||
int aborted;
|
||||
int npages; /* In the PRP list. 0 means small pool in use */
|
||||
@@ -422,11 +421,6 @@ static int nvme_init_request(struct blk_mq_tag_set *set, struct request *req,
|
||||
{
|
||||
struct nvme_dev *dev = set->driver_data;
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
int queue_idx = (set == &dev->tagset) ? hctx_idx + 1 : 0;
|
||||
struct nvme_queue *nvmeq = &dev->queues[queue_idx];
|
||||
|
||||
BUG_ON(!nvmeq);
|
||||
iod->nvmeq = nvmeq;
|
||||
|
||||
nvme_req(req)->ctrl = &dev->ctrl;
|
||||
nvme_req(req)->cmd = &iod->cmd;
|
||||
@@ -529,7 +523,7 @@ static void **nvme_pci_iod_list(struct request *req)
|
||||
|
||||
static inline bool nvme_pci_use_sgls(struct nvme_dev *dev, struct request *req)
|
||||
{
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
|
||||
int nseg = blk_rq_nr_phys_segments(req);
|
||||
unsigned int avg_seg_size;
|
||||
|
||||
@@ -537,7 +531,7 @@ static inline bool nvme_pci_use_sgls(struct nvme_dev *dev, struct request *req)
|
||||
|
||||
if (!nvme_ctrl_sgl_supported(&dev->ctrl))
|
||||
return false;
|
||||
if (!iod->nvmeq->qid)
|
||||
if (!nvmeq->qid)
|
||||
return false;
|
||||
if (!sgl_threshold || avg_seg_size < sgl_threshold)
|
||||
return false;
|
||||
@@ -846,6 +840,7 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
|
||||
int nr_mapped;
|
||||
|
||||
if (blk_rq_nr_phys_segments(req) == 1) {
|
||||
struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
|
||||
struct bio_vec bv = req_bvec(req);
|
||||
|
||||
if (!is_pci_p2pdma_page(bv.bv_page)) {
|
||||
@@ -853,7 +848,7 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
|
||||
return nvme_setup_prp_simple(dev, req,
|
||||
&cmnd->rw, &bv);
|
||||
|
||||
if (iod->nvmeq->qid && sgl_threshold &&
|
||||
if (nvmeq->qid && sgl_threshold &&
|
||||
nvme_ctrl_sgl_supported(&dev->ctrl))
|
||||
return nvme_setup_sgl_simple(dev, req,
|
||||
&cmnd->rw, &bv);
|
||||
@@ -963,12 +958,16 @@ out_free_cmd:
|
||||
|
||||
static void nvme_pci_complete_rq(struct request *req)
|
||||
{
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
struct nvme_dev *dev = iod->nvmeq->dev;
|
||||
struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
|
||||
struct nvme_dev *dev = nvmeq->dev;
|
||||
|
||||
if (blk_integrity_rq(req)) {
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
|
||||
if (blk_integrity_rq(req))
|
||||
dma_unmap_page(dev->dev, iod->meta_dma,
|
||||
rq_integrity_vec(req)->bv_len, rq_data_dir(req));
|
||||
rq_integrity_vec(req)->bv_len, rq_dma_dir(req));
|
||||
}
|
||||
|
||||
if (blk_rq_nr_phys_segments(req))
|
||||
nvme_unmap_data(dev, req);
|
||||
nvme_complete_rq(req);
|
||||
@@ -1194,8 +1193,7 @@ static int adapter_delete_sq(struct nvme_dev *dev, u16 sqid)
|
||||
|
||||
static void abort_endio(struct request *req, blk_status_t error)
|
||||
{
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
struct nvme_queue *nvmeq = iod->nvmeq;
|
||||
struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
|
||||
|
||||
dev_warn(nvmeq->dev->ctrl.device,
|
||||
"Abort status: 0x%x", nvme_req(req)->status);
|
||||
@@ -1249,7 +1247,7 @@ static void nvme_warn_reset(struct nvme_dev *dev, u32 csts)
|
||||
static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
|
||||
{
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
struct nvme_queue *nvmeq = iod->nvmeq;
|
||||
struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
|
||||
struct nvme_dev *dev = nvmeq->dev;
|
||||
struct request *abort_req;
|
||||
struct nvme_command cmd = { };
|
||||
|
||||
@@ -1249,7 +1249,10 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
|
||||
return opp_table;
|
||||
|
||||
remove_opp_dev:
|
||||
_of_clear_opp_table(opp_table);
|
||||
_remove_opp_dev(opp_dev, opp_table);
|
||||
mutex_destroy(&opp_table->genpd_virt_dev_lock);
|
||||
mutex_destroy(&opp_table->lock);
|
||||
err:
|
||||
kfree(opp_table);
|
||||
return ERR_PTR(ret);
|
||||
|
||||
@@ -1134,6 +1134,8 @@ static int qcom_pcie_post_init_2_3_3(struct qcom_pcie *pcie)
|
||||
writel(PCI_EXP_DEVCTL2_COMP_TMOUT_DIS, pci->dbi_base + offset +
|
||||
PCI_EXP_DEVCTL2);
|
||||
|
||||
dw_pcie_dbi_ro_wr_dis(pci);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -125,6 +125,7 @@ static void rockchip_pcie_prog_ep_ob_atu(struct rockchip_pcie *rockchip, u8 fn,
|
||||
static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn, u8 vfn,
|
||||
struct pci_epf_header *hdr)
|
||||
{
|
||||
u32 reg;
|
||||
struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct rockchip_pcie *rockchip = &ep->rockchip;
|
||||
|
||||
@@ -137,8 +138,9 @@ static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn, u8 vfn,
|
||||
PCIE_CORE_CONFIG_VENDOR);
|
||||
}
|
||||
|
||||
rockchip_pcie_write(rockchip, hdr->deviceid << 16,
|
||||
ROCKCHIP_PCIE_EP_FUNC_BASE(fn) + PCI_VENDOR_ID);
|
||||
reg = rockchip_pcie_read(rockchip, PCIE_EP_CONFIG_DID_VID);
|
||||
reg = (reg & 0xFFFF) | (hdr->deviceid << 16);
|
||||
rockchip_pcie_write(rockchip, reg, PCIE_EP_CONFIG_DID_VID);
|
||||
|
||||
rockchip_pcie_write(rockchip,
|
||||
hdr->revid |
|
||||
@@ -312,15 +314,15 @@ static int rockchip_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn,
|
||||
{
|
||||
struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct rockchip_pcie *rockchip = &ep->rockchip;
|
||||
u16 flags;
|
||||
u32 flags;
|
||||
|
||||
flags = rockchip_pcie_read(rockchip,
|
||||
ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
|
||||
ROCKCHIP_PCIE_EP_MSI_CTRL_REG);
|
||||
flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK;
|
||||
flags |=
|
||||
((multi_msg_cap << 1) << ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
|
||||
PCI_MSI_FLAGS_64BIT;
|
||||
(multi_msg_cap << ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
|
||||
(PCI_MSI_FLAGS_64BIT << ROCKCHIP_PCIE_EP_MSI_FLAGS_OFFSET);
|
||||
flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP;
|
||||
rockchip_pcie_write(rockchip, flags,
|
||||
ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
|
||||
@@ -332,7 +334,7 @@ static int rockchip_pcie_ep_get_msi(struct pci_epc *epc, u8 fn, u8 vfn)
|
||||
{
|
||||
struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct rockchip_pcie *rockchip = &ep->rockchip;
|
||||
u16 flags;
|
||||
u32 flags;
|
||||
|
||||
flags = rockchip_pcie_read(rockchip,
|
||||
ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
|
||||
@@ -345,48 +347,25 @@ static int rockchip_pcie_ep_get_msi(struct pci_epc *epc, u8 fn, u8 vfn)
|
||||
}
|
||||
|
||||
static void rockchip_pcie_ep_assert_intx(struct rockchip_pcie_ep *ep, u8 fn,
|
||||
u8 intx, bool is_asserted)
|
||||
u8 intx, bool do_assert)
|
||||
{
|
||||
struct rockchip_pcie *rockchip = &ep->rockchip;
|
||||
u32 r = ep->max_regions - 1;
|
||||
u32 offset;
|
||||
u32 status;
|
||||
u8 msg_code;
|
||||
|
||||
if (unlikely(ep->irq_pci_addr != ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR ||
|
||||
ep->irq_pci_fn != fn)) {
|
||||
rockchip_pcie_prog_ep_ob_atu(rockchip, fn, r,
|
||||
AXI_WRAPPER_NOR_MSG,
|
||||
ep->irq_phys_addr, 0, 0);
|
||||
ep->irq_pci_addr = ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR;
|
||||
ep->irq_pci_fn = fn;
|
||||
}
|
||||
|
||||
intx &= 3;
|
||||
if (is_asserted) {
|
||||
|
||||
if (do_assert) {
|
||||
ep->irq_pending |= BIT(intx);
|
||||
msg_code = ROCKCHIP_PCIE_MSG_CODE_ASSERT_INTA + intx;
|
||||
rockchip_pcie_write(rockchip,
|
||||
PCIE_CLIENT_INT_IN_ASSERT |
|
||||
PCIE_CLIENT_INT_PEND_ST_PEND,
|
||||
PCIE_CLIENT_LEGACY_INT_CTRL);
|
||||
} else {
|
||||
ep->irq_pending &= ~BIT(intx);
|
||||
msg_code = ROCKCHIP_PCIE_MSG_CODE_DEASSERT_INTA + intx;
|
||||
rockchip_pcie_write(rockchip,
|
||||
PCIE_CLIENT_INT_IN_DEASSERT |
|
||||
PCIE_CLIENT_INT_PEND_ST_NORMAL,
|
||||
PCIE_CLIENT_LEGACY_INT_CTRL);
|
||||
}
|
||||
|
||||
status = rockchip_pcie_read(rockchip,
|
||||
ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
|
||||
ROCKCHIP_PCIE_EP_CMD_STATUS);
|
||||
status &= ROCKCHIP_PCIE_EP_CMD_STATUS_IS;
|
||||
|
||||
if ((status != 0) ^ (ep->irq_pending != 0)) {
|
||||
status ^= ROCKCHIP_PCIE_EP_CMD_STATUS_IS;
|
||||
rockchip_pcie_write(rockchip, status,
|
||||
ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
|
||||
ROCKCHIP_PCIE_EP_CMD_STATUS);
|
||||
}
|
||||
|
||||
offset =
|
||||
ROCKCHIP_PCIE_MSG_ROUTING(ROCKCHIP_PCIE_MSG_ROUTING_LOCAL_INTX) |
|
||||
ROCKCHIP_PCIE_MSG_CODE(msg_code) | ROCKCHIP_PCIE_MSG_NO_DATA;
|
||||
writel(0, ep->irq_cpu_addr + offset);
|
||||
}
|
||||
|
||||
static int rockchip_pcie_ep_send_legacy_irq(struct rockchip_pcie_ep *ep, u8 fn,
|
||||
@@ -416,7 +395,7 @@ static int rockchip_pcie_ep_send_msi_irq(struct rockchip_pcie_ep *ep, u8 fn,
|
||||
u8 interrupt_num)
|
||||
{
|
||||
struct rockchip_pcie *rockchip = &ep->rockchip;
|
||||
u16 flags, mme, data, data_mask;
|
||||
u32 flags, mme, data, data_mask;
|
||||
u8 msi_count;
|
||||
u64 pci_addr, pci_addr_mask = 0xff;
|
||||
|
||||
@@ -506,6 +485,7 @@ static const struct pci_epc_features rockchip_pcie_epc_features = {
|
||||
.linkup_notifier = false,
|
||||
.msi_capable = true,
|
||||
.msix_capable = false,
|
||||
.align = 256,
|
||||
};
|
||||
|
||||
static const struct pci_epc_features*
|
||||
@@ -631,6 +611,9 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)
|
||||
|
||||
ep->irq_pci_addr = ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR;
|
||||
|
||||
rockchip_pcie_write(rockchip, PCIE_CLIENT_CONF_ENABLE,
|
||||
PCIE_CLIENT_CONFIG);
|
||||
|
||||
return 0;
|
||||
err_epc_mem_exit:
|
||||
pci_epc_mem_exit(epc);
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/of_pci.h>
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/platform_device.h>
|
||||
@@ -153,6 +154,12 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_pcie_parse_dt);
|
||||
|
||||
#define rockchip_pcie_read_addr(addr) rockchip_pcie_read(rockchip, addr)
|
||||
/* 100 ms max wait time for PHY PLLs to lock */
|
||||
#define RK_PHY_PLL_LOCK_TIMEOUT_US 100000
|
||||
/* Sleep should be less than 20ms */
|
||||
#define RK_PHY_PLL_LOCK_SLEEP_US 1000
|
||||
|
||||
int rockchip_pcie_init_port(struct rockchip_pcie *rockchip)
|
||||
{
|
||||
struct device *dev = rockchip->dev;
|
||||
@@ -254,6 +261,16 @@ int rockchip_pcie_init_port(struct rockchip_pcie *rockchip)
|
||||
}
|
||||
}
|
||||
|
||||
err = readx_poll_timeout(rockchip_pcie_read_addr,
|
||||
PCIE_CLIENT_SIDE_BAND_STATUS,
|
||||
regs, !(regs & PCIE_CLIENT_PHY_ST),
|
||||
RK_PHY_PLL_LOCK_SLEEP_US,
|
||||
RK_PHY_PLL_LOCK_TIMEOUT_US);
|
||||
if (err) {
|
||||
dev_err(dev, "PHY PLLs could not lock, %d\n", err);
|
||||
goto err_power_off_phy;
|
||||
}
|
||||
|
||||
/*
|
||||
* Please don't reorder the deassert sequence of the following
|
||||
* four reset pins.
|
||||
|
||||
@@ -38,6 +38,13 @@
|
||||
#define PCIE_CLIENT_MODE_EP HIWORD_UPDATE(0x0040, 0)
|
||||
#define PCIE_CLIENT_GEN_SEL_1 HIWORD_UPDATE(0x0080, 0)
|
||||
#define PCIE_CLIENT_GEN_SEL_2 HIWORD_UPDATE_BIT(0x0080)
|
||||
#define PCIE_CLIENT_LEGACY_INT_CTRL (PCIE_CLIENT_BASE + 0x0c)
|
||||
#define PCIE_CLIENT_INT_IN_ASSERT HIWORD_UPDATE_BIT(0x0002)
|
||||
#define PCIE_CLIENT_INT_IN_DEASSERT HIWORD_UPDATE(0x0002, 0)
|
||||
#define PCIE_CLIENT_INT_PEND_ST_PEND HIWORD_UPDATE_BIT(0x0001)
|
||||
#define PCIE_CLIENT_INT_PEND_ST_NORMAL HIWORD_UPDATE(0x0001, 0)
|
||||
#define PCIE_CLIENT_SIDE_BAND_STATUS (PCIE_CLIENT_BASE + 0x20)
|
||||
#define PCIE_CLIENT_PHY_ST BIT(12)
|
||||
#define PCIE_CLIENT_DEBUG_OUT_0 (PCIE_CLIENT_BASE + 0x3c)
|
||||
#define PCIE_CLIENT_DEBUG_LTSSM_MASK GENMASK(5, 0)
|
||||
#define PCIE_CLIENT_DEBUG_LTSSM_L1 0x18
|
||||
@@ -133,6 +140,8 @@
|
||||
#define PCIE_RC_RP_ATS_BASE 0x400000
|
||||
#define PCIE_RC_CONFIG_NORMAL_BASE 0x800000
|
||||
#define PCIE_RC_CONFIG_BASE 0xa00000
|
||||
#define PCIE_EP_CONFIG_BASE 0xa00000
|
||||
#define PCIE_EP_CONFIG_DID_VID (PCIE_EP_CONFIG_BASE + 0x00)
|
||||
#define PCIE_RC_CONFIG_RID_CCR (PCIE_RC_CONFIG_BASE + 0x08)
|
||||
#define PCIE_RC_CONFIG_SCC_SHIFT 16
|
||||
#define PCIE_RC_CONFIG_DCR (PCIE_RC_CONFIG_BASE + 0xc4)
|
||||
@@ -217,6 +226,7 @@
|
||||
#define ROCKCHIP_PCIE_EP_CMD_STATUS 0x4
|
||||
#define ROCKCHIP_PCIE_EP_CMD_STATUS_IS BIT(19)
|
||||
#define ROCKCHIP_PCIE_EP_MSI_CTRL_REG 0x90
|
||||
#define ROCKCHIP_PCIE_EP_MSI_FLAGS_OFFSET 16
|
||||
#define ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET 17
|
||||
#define ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK GENMASK(19, 17)
|
||||
#define ROCKCHIP_PCIE_EP_MSI_CTRL_MME_OFFSET 20
|
||||
@@ -224,7 +234,6 @@
|
||||
#define ROCKCHIP_PCIE_EP_MSI_CTRL_ME BIT(16)
|
||||
#define ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP BIT(24)
|
||||
#define ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR 0x1
|
||||
#define ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR 0x3
|
||||
#define ROCKCHIP_PCIE_EP_FUNC_BASE(fn) (((fn) << 12) & GENMASK(19, 12))
|
||||
#define ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR0(fn, bar) \
|
||||
(PCIE_RC_RP_ATS_BASE + 0x0840 + (fn) * 0x0040 + (bar) * 0x0008)
|
||||
|
||||
@@ -2886,13 +2886,13 @@ static const struct dmi_system_id bridge_d3_blacklist[] = {
|
||||
{
|
||||
/*
|
||||
* Downstream device is not accessible after putting a root port
|
||||
* into D3cold and back into D0 on Elo i2.
|
||||
* into D3cold and back into D0 on Elo Continental Z2 board
|
||||
*/
|
||||
.ident = "Elo i2",
|
||||
.ident = "Elo Continental Z2",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Elo Touch Solutions"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Elo i2"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "RevB"),
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Elo Touch Solutions"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Geminilake"),
|
||||
DMI_MATCH(DMI_BOARD_VERSION, "Continental Z2"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
|
||||
@@ -4149,6 +4149,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9220,
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c49 */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9230,
|
||||
quirk_dma_func1_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9235,
|
||||
quirk_dma_func1_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0642,
|
||||
quirk_dma_func1_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0645,
|
||||
|
||||
@@ -126,6 +126,14 @@ static int amd_gpio_set_debounce(struct gpio_chip *gc, unsigned offset,
|
||||
struct amd_gpio *gpio_dev = gpiochip_get_data(gc);
|
||||
|
||||
raw_spin_lock_irqsave(&gpio_dev->lock, flags);
|
||||
|
||||
/* Use special handling for Pin0 debounce */
|
||||
if (offset == 0) {
|
||||
pin_reg = readl(gpio_dev->base + WAKE_INT_MASTER_REG);
|
||||
if (pin_reg & INTERNAL_GPIO0_DEBOUNCE)
|
||||
debounce = 0;
|
||||
}
|
||||
|
||||
pin_reg = readl(gpio_dev->base + offset * 4);
|
||||
|
||||
if (debounce) {
|
||||
@@ -223,6 +231,7 @@ static void amd_gpio_dbg_show(struct seq_file *s, struct gpio_chip *gc)
|
||||
char debounce_value[40];
|
||||
char *debounce_enable;
|
||||
|
||||
seq_printf(s, "WAKE_INT_MASTER_REG: 0x%08x\n", readl(gpio_dev->base + WAKE_INT_MASTER_REG));
|
||||
for (bank = 0; bank < gpio_dev->hwbank_num; bank++) {
|
||||
seq_printf(s, "GPIO bank%d\t", bank);
|
||||
|
||||
@@ -646,21 +655,21 @@ static bool do_amd_gpio_irq_handler(int irq, void *dev_id)
|
||||
* We must read the pin register again, in case the
|
||||
* value was changed while executing
|
||||
* generic_handle_domain_irq() above.
|
||||
* If we didn't find a mapping for the interrupt,
|
||||
* disable it in order to avoid a system hang caused
|
||||
* by an interrupt storm.
|
||||
* If the line is not an irq, disable it in order to
|
||||
* avoid a system hang caused by an interrupt storm.
|
||||
*/
|
||||
raw_spin_lock_irqsave(&gpio_dev->lock, flags);
|
||||
regval = readl(regs + i);
|
||||
if (irq == 0) {
|
||||
regval &= ~BIT(INTERRUPT_ENABLE_OFF);
|
||||
if (!gpiochip_line_is_irq(gc, irqnr + i)) {
|
||||
regval &= ~BIT(INTERRUPT_MASK_OFF);
|
||||
dev_dbg(&gpio_dev->pdev->dev,
|
||||
"Disabling spurious GPIO IRQ %d\n",
|
||||
irqnr + i);
|
||||
} else {
|
||||
ret = true;
|
||||
}
|
||||
writel(regval, regs + i);
|
||||
raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
|
||||
ret = true;
|
||||
}
|
||||
}
|
||||
/* did not cause wake on resume context for shared IRQ */
|
||||
@@ -883,9 +892,9 @@ static void amd_gpio_irq_init(struct amd_gpio *gpio_dev)
|
||||
|
||||
raw_spin_lock_irqsave(&gpio_dev->lock, flags);
|
||||
|
||||
pin_reg = readl(gpio_dev->base + i * 4);
|
||||
pin_reg = readl(gpio_dev->base + pin * 4);
|
||||
pin_reg &= ~mask;
|
||||
writel(pin_reg, gpio_dev->base + i * 4);
|
||||
writel(pin_reg, gpio_dev->base + pin * 4);
|
||||
|
||||
raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#define AMD_GPIO_PINS_BANK3 32
|
||||
|
||||
#define WAKE_INT_MASTER_REG 0xfc
|
||||
#define INTERNAL_GPIO0_DEBOUNCE (1 << 15)
|
||||
#define EOI_MASK (1 << 29)
|
||||
|
||||
#define WAKE_INT_STATUS_REG0 0x2f8
|
||||
|
||||
@@ -2738,6 +2738,7 @@ static void
|
||||
qla2x00_terminate_rport_io(struct fc_rport *rport)
|
||||
{
|
||||
fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
|
||||
scsi_qla_host_t *vha;
|
||||
|
||||
if (!fcport)
|
||||
return;
|
||||
@@ -2747,9 +2748,12 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
|
||||
|
||||
if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
|
||||
return;
|
||||
vha = fcport->vha;
|
||||
|
||||
if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
|
||||
qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
|
||||
qla2x00_eh_wait_for_pending_commands(fcport->vha, fcport->d_id.b24,
|
||||
0, WAIT_TARGET);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
@@ -2774,6 +2778,15 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
|
||||
qla2x00_port_logout(fcport->vha, fcport);
|
||||
}
|
||||
}
|
||||
|
||||
/* check for any straggling io left behind */
|
||||
if (qla2x00_eh_wait_for_pending_commands(fcport->vha, fcport->d_id.b24, 0, WAIT_TARGET)) {
|
||||
ql_log(ql_log_warn, vha, 0x300b,
|
||||
"IO not return. Resetting. \n");
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
qla2xxx_wake_dpc(vha);
|
||||
qla2x00_wait_for_chip_reset(vha);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -283,6 +283,10 @@ qla2x00_process_els(struct bsg_job *bsg_job)
|
||||
|
||||
if (bsg_request->msgcode == FC_BSG_RPT_ELS) {
|
||||
rport = fc_bsg_to_rport(bsg_job);
|
||||
if (!rport) {
|
||||
rval = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
fcport = *(fc_port_t **) rport->dd_data;
|
||||
host = rport_to_shost(rport);
|
||||
vha = shost_priv(host);
|
||||
@@ -2899,6 +2903,8 @@ qla24xx_bsg_request(struct bsg_job *bsg_job)
|
||||
|
||||
if (bsg_request->msgcode == FC_BSG_RPT_ELS) {
|
||||
rport = fc_bsg_to_rport(bsg_job);
|
||||
if (!rport)
|
||||
return ret;
|
||||
host = rport_to_shost(rport);
|
||||
vha = shost_priv(host);
|
||||
} else {
|
||||
|
||||
@@ -676,7 +676,6 @@ typedef struct srb {
|
||||
struct iocb_resource iores;
|
||||
struct kref cmd_kref; /* need to migrate ref_count over to this */
|
||||
void *priv;
|
||||
wait_queue_head_t nvme_ls_waitq;
|
||||
struct fc_port *fcport;
|
||||
struct scsi_qla_host *vha;
|
||||
unsigned int start_timer:1;
|
||||
|
||||
@@ -2230,8 +2230,8 @@ qla24xx_issue_sa_replace_iocb(scsi_qla_host_t *vha, struct qla_work_evt *e)
|
||||
if (!sa_ctl) {
|
||||
ql_dbg(ql_dbg_edif, vha, 0x70e6,
|
||||
"sa_ctl allocation failed\n");
|
||||
rval = -ENOMEM;
|
||||
goto done;
|
||||
rval = -ENOMEM;
|
||||
return rval;
|
||||
}
|
||||
|
||||
fcport = sa_ctl->fcport;
|
||||
|
||||
@@ -5359,7 +5359,7 @@ static void qla_get_login_template(scsi_qla_host_t *vha)
|
||||
__be32 *q;
|
||||
|
||||
memset(ha->init_cb, 0, ha->init_cb_size);
|
||||
sz = min_t(int, sizeof(struct fc_els_flogi), ha->init_cb_size);
|
||||
sz = min_t(int, sizeof(struct fc_els_csp), ha->init_cb_size);
|
||||
rval = qla24xx_get_port_login_templ(vha, ha->init_cb_dma,
|
||||
ha->init_cb, sz);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
|
||||
@@ -109,11 +109,13 @@ qla2x00_set_fcport_disc_state(fc_port_t *fcport, int state)
|
||||
{
|
||||
int old_val;
|
||||
uint8_t shiftbits, mask;
|
||||
uint8_t port_dstate_str_sz;
|
||||
|
||||
/* This will have to change when the max no. of states > 16 */
|
||||
shiftbits = 4;
|
||||
mask = (1 << shiftbits) - 1;
|
||||
|
||||
port_dstate_str_sz = sizeof(port_dstate_str) / sizeof(char *);
|
||||
fcport->disc_state = state;
|
||||
while (1) {
|
||||
old_val = atomic_read(&fcport->shadow_disc_state);
|
||||
@@ -121,7 +123,8 @@ qla2x00_set_fcport_disc_state(fc_port_t *fcport, int state)
|
||||
old_val, (old_val << shiftbits) | state)) {
|
||||
ql_dbg(ql_dbg_disc, fcport->vha, 0x2134,
|
||||
"FCPort %8phC disc_state transition: %s to %s - portid=%06x.\n",
|
||||
fcport->port_name, port_dstate_str[old_val & mask],
|
||||
fcport->port_name, (old_val & mask) < port_dstate_str_sz ?
|
||||
port_dstate_str[old_val & mask] : "Unknown",
|
||||
port_dstate_str[state], fcport->d_id.b24);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -603,7 +603,8 @@ qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt,
|
||||
put_unaligned_le32(COMMAND_TYPE_6, &cmd_pkt->entry_type);
|
||||
|
||||
/* No data transfer */
|
||||
if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) {
|
||||
if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE ||
|
||||
tot_dsds == 0) {
|
||||
cmd_pkt->byte_count = cpu_to_le32(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -355,7 +355,6 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport,
|
||||
if (rval != QLA_SUCCESS) {
|
||||
ql_log(ql_log_warn, vha, 0x700e,
|
||||
"qla2x00_start_sp failed = %d\n", rval);
|
||||
wake_up(&sp->nvme_ls_waitq);
|
||||
sp->priv = NULL;
|
||||
priv->sp = NULL;
|
||||
qla2x00_rel_sp(sp);
|
||||
@@ -637,7 +636,6 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport,
|
||||
if (!sp)
|
||||
return -EBUSY;
|
||||
|
||||
init_waitqueue_head(&sp->nvme_ls_waitq);
|
||||
kref_init(&sp->cmd_kref);
|
||||
spin_lock_init(&priv->cmd_lock);
|
||||
sp->priv = priv;
|
||||
@@ -656,7 +654,6 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport,
|
||||
if (rval != QLA_SUCCESS) {
|
||||
ql_log(ql_log_warn, vha, 0x212d,
|
||||
"qla2x00_start_nvme_mq failed = %d\n", rval);
|
||||
wake_up(&sp->nvme_ls_waitq);
|
||||
sp->priv = NULL;
|
||||
priv->sp = NULL;
|
||||
qla2xxx_rel_qpair_sp(sp->qpair, sp);
|
||||
|
||||
@@ -5042,7 +5042,8 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht,
|
||||
}
|
||||
INIT_DELAYED_WORK(&vha->scan.scan_work, qla_scan_work_fn);
|
||||
|
||||
sprintf(vha->host_str, "%s_%lu", QLA2XXX_DRIVER_NAME, vha->host_no);
|
||||
snprintf(vha->host_str, sizeof(vha->host_str), "%s_%lu",
|
||||
QLA2XXX_DRIVER_NAME, vha->host_no);
|
||||
ql_dbg(ql_dbg_init, vha, 0x0041,
|
||||
"Allocated the host=%p hw=%p vha=%p dev_name=%s",
|
||||
vha->host, vha->hw, vha,
|
||||
|
||||
@@ -146,7 +146,8 @@ struct qcom_swrm_ctrl {
|
||||
u32 intr_mask;
|
||||
u8 rcmd_id;
|
||||
u8 wcmd_id;
|
||||
struct qcom_swrm_port_config pconfig[QCOM_SDW_MAX_PORTS];
|
||||
/* Port numbers are 1 - 14 */
|
||||
struct qcom_swrm_port_config pconfig[QCOM_SDW_MAX_PORTS + 1];
|
||||
struct sdw_stream_runtime *sruntime[SWRM_MAX_DAIS];
|
||||
enum sdw_slave_status status[SDW_MAX_DEVICES + 1];
|
||||
int (*reg_read)(struct qcom_swrm_ctrl *ctrl, int reg, u32 *val);
|
||||
|
||||
@@ -88,7 +88,6 @@ struct serial8250_config {
|
||||
#define UART_BUG_TXEN BIT(1) /* UART has buggy TX IIR status */
|
||||
#define UART_BUG_NOMSR BIT(2) /* UART has buggy MSR status bits (Au1x00) */
|
||||
#define UART_BUG_THRE BIT(3) /* UART has buggy THRE reassertion */
|
||||
#define UART_BUG_PARITY BIT(4) /* UART mishandles parity if FIFO enabled */
|
||||
#define UART_BUG_TXRACE BIT(5) /* UART Tx fails to set remote DR */
|
||||
|
||||
|
||||
|
||||
@@ -1247,14 +1247,6 @@ static int pci_oxsemi_tornado_setup(struct serial_private *priv,
|
||||
return pci_default_setup(priv, board, up, idx);
|
||||
}
|
||||
|
||||
static int pci_asix_setup(struct serial_private *priv,
|
||||
const struct pciserial_board *board,
|
||||
struct uart_8250_port *port, int idx)
|
||||
{
|
||||
port->bugs |= UART_BUG_PARITY;
|
||||
return pci_default_setup(priv, board, port, idx);
|
||||
}
|
||||
|
||||
/* Quatech devices have their own extra interface features */
|
||||
|
||||
struct quatech_feature {
|
||||
@@ -2077,7 +2069,6 @@ pci_moxa_setup(struct serial_private *priv,
|
||||
#define PCI_DEVICE_ID_WCH_CH355_4S 0x7173
|
||||
#define PCI_VENDOR_ID_AGESTAR 0x5372
|
||||
#define PCI_DEVICE_ID_AGESTAR_9375 0x6872
|
||||
#define PCI_VENDOR_ID_ASIX 0x9710
|
||||
#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
|
||||
#define PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800 0x818e
|
||||
|
||||
@@ -2887,16 +2878,6 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
|
||||
.exit = pci_wch_ch38x_exit,
|
||||
.setup = pci_wch_ch38x_setup,
|
||||
},
|
||||
/*
|
||||
* ASIX devices with FIFO bug
|
||||
*/
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_ASIX,
|
||||
.device = PCI_ANY_ID,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_asix_setup,
|
||||
},
|
||||
/*
|
||||
* Broadcom TruManage (NetXtreme)
|
||||
*/
|
||||
|
||||
@@ -2617,11 +2617,8 @@ static unsigned char serial8250_compute_lcr(struct uart_8250_port *up,
|
||||
|
||||
if (c_cflag & CSTOPB)
|
||||
cval |= UART_LCR_STOP;
|
||||
if (c_cflag & PARENB) {
|
||||
if (c_cflag & PARENB)
|
||||
cval |= UART_LCR_PARITY;
|
||||
if (up->bugs & UART_BUG_PARITY)
|
||||
up->fifo_bug = true;
|
||||
}
|
||||
if (!(c_cflag & PARODD))
|
||||
cval |= UART_LCR_EPAR;
|
||||
#ifdef CMSPAR
|
||||
@@ -2784,8 +2781,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
up->lcr = cval; /* Save computed LCR */
|
||||
|
||||
if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
|
||||
/* NOTE: If fifo_bug is not set, a user can set RX_trigger. */
|
||||
if ((baud < 2400 && !up->dma) || up->fifo_bug) {
|
||||
if (baud < 2400 && !up->dma) {
|
||||
up->fcr &= ~UART_FCR_TRIGGER_MASK;
|
||||
up->fcr |= UART_FCR_TRIGGER_1;
|
||||
}
|
||||
@@ -3121,8 +3117,7 @@ static int do_set_rxtrig(struct tty_port *port, unsigned char bytes)
|
||||
struct uart_8250_port *up = up_to_u8250p(uport);
|
||||
int rxtrig;
|
||||
|
||||
if (!(up->capabilities & UART_CAP_FIFO) || uport->fifosize <= 1 ||
|
||||
up->fifo_bug)
|
||||
if (!(up->capabilities & UART_CAP_FIFO) || uport->fifosize <= 1)
|
||||
return -EINVAL;
|
||||
|
||||
rxtrig = bytes_to_fcr_rxtrig(up, bytes);
|
||||
|
||||
@@ -873,11 +873,11 @@ static void atmel_complete_tx_dma(void *arg)
|
||||
|
||||
port->icount.tx += atmel_port->tx_len;
|
||||
|
||||
spin_lock_irq(&atmel_port->lock_tx);
|
||||
spin_lock(&atmel_port->lock_tx);
|
||||
async_tx_ack(atmel_port->desc_tx);
|
||||
atmel_port->cookie_tx = -EINVAL;
|
||||
atmel_port->desc_tx = NULL;
|
||||
spin_unlock_irq(&atmel_port->lock_tx);
|
||||
spin_unlock(&atmel_port->lock_tx);
|
||||
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(port);
|
||||
|
||||
@@ -397,6 +397,16 @@ static void start_hrtimer_ms(struct hrtimer *hrt, unsigned long msec)
|
||||
hrtimer_start(hrt, ms_to_ktime(msec), HRTIMER_MODE_REL);
|
||||
}
|
||||
|
||||
static void imx_uart_disable_loopback_rs485(struct imx_port *sport)
|
||||
{
|
||||
unsigned int uts;
|
||||
|
||||
/* See SER_RS485_ENABLED/UTS_LOOP comment in imx_uart_probe() */
|
||||
uts = imx_uart_readl(sport, imx_uart_uts_reg(sport));
|
||||
uts &= ~UTS_LOOP;
|
||||
imx_uart_writel(sport, uts, imx_uart_uts_reg(sport));
|
||||
}
|
||||
|
||||
/* called with port.lock taken and irqs off */
|
||||
static void imx_uart_start_rx(struct uart_port *port)
|
||||
{
|
||||
@@ -418,6 +428,7 @@ static void imx_uart_start_rx(struct uart_port *port)
|
||||
/* Write UCR2 first as it includes RXEN */
|
||||
imx_uart_writel(sport, ucr2, UCR2);
|
||||
imx_uart_writel(sport, ucr1, UCR1);
|
||||
imx_uart_disable_loopback_rs485(sport);
|
||||
}
|
||||
|
||||
/* called with port.lock taken and irqs off */
|
||||
@@ -1394,7 +1405,7 @@ static int imx_uart_startup(struct uart_port *port)
|
||||
int retval, i;
|
||||
unsigned long flags;
|
||||
int dma_is_inited = 0;
|
||||
u32 ucr1, ucr2, ucr3, ucr4, uts;
|
||||
u32 ucr1, ucr2, ucr3, ucr4;
|
||||
|
||||
retval = clk_prepare_enable(sport->clk_per);
|
||||
if (retval)
|
||||
@@ -1499,10 +1510,7 @@ static int imx_uart_startup(struct uart_port *port)
|
||||
imx_uart_writel(sport, ucr2, UCR2);
|
||||
}
|
||||
|
||||
/* See SER_RS485_ENABLED/UTS_LOOP comment in imx_uart_probe() */
|
||||
uts = imx_uart_readl(sport, imx_uart_uts_reg(sport));
|
||||
uts &= ~UTS_LOOP;
|
||||
imx_uart_writel(sport, uts, imx_uart_uts_reg(sport));
|
||||
imx_uart_disable_loopback_rs485(sport);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
|
||||
|
||||
@@ -1478,8 +1478,12 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
|
||||
continue;
|
||||
|
||||
rate = clk_get_rate(clk);
|
||||
if (!rate)
|
||||
if (!rate) {
|
||||
dev_err(ourport->port.dev,
|
||||
"Failed to get clock rate for %s.\n", clkname);
|
||||
clk_put(clk);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ourport->info->has_divslot) {
|
||||
unsigned long div = rate / req_baud;
|
||||
@@ -1505,10 +1509,18 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
|
||||
calc_deviation = -calc_deviation;
|
||||
|
||||
if (calc_deviation < deviation) {
|
||||
/*
|
||||
* If we find a better clk, release the previous one, if
|
||||
* any.
|
||||
*/
|
||||
if (!IS_ERR(*best_clk))
|
||||
clk_put(*best_clk);
|
||||
*best_clk = clk;
|
||||
best_quot = quot;
|
||||
*clk_num = cnt;
|
||||
deviation = calc_deviation;
|
||||
} else {
|
||||
clk_put(clk);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2134,7 +2134,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
|
||||
{
|
||||
u32 temp, port_offset, port_count;
|
||||
int i;
|
||||
u8 major_revision, minor_revision;
|
||||
u8 major_revision, minor_revision, tmp_minor_revision;
|
||||
struct xhci_hub *rhub;
|
||||
struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
|
||||
struct xhci_port_cap *port_cap;
|
||||
@@ -2154,6 +2154,15 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
|
||||
*/
|
||||
if (minor_revision > 0x00 && minor_revision < 0x10)
|
||||
minor_revision <<= 4;
|
||||
/*
|
||||
* Some zhaoxin's xHCI controller that follow usb3.1 spec
|
||||
* but only support Gen1.
|
||||
*/
|
||||
if (xhci->quirks & XHCI_ZHAOXIN_HOST) {
|
||||
tmp_minor_revision = minor_revision;
|
||||
minor_revision = 0;
|
||||
}
|
||||
|
||||
} else if (major_revision <= 0x02) {
|
||||
rhub = &xhci->usb2_rhub;
|
||||
} else {
|
||||
@@ -2163,10 +2172,6 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
|
||||
/* Ignoring port protocol we can't understand. FIXME */
|
||||
return;
|
||||
}
|
||||
rhub->maj_rev = XHCI_EXT_PORT_MAJOR(temp);
|
||||
|
||||
if (rhub->min_rev < minor_revision)
|
||||
rhub->min_rev = minor_revision;
|
||||
|
||||
/* Port offset and count in the third dword, see section 7.2 */
|
||||
temp = readl(addr + 2);
|
||||
@@ -2185,8 +2190,6 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
|
||||
if (xhci->num_port_caps > max_caps)
|
||||
return;
|
||||
|
||||
port_cap->maj_rev = major_revision;
|
||||
port_cap->min_rev = minor_revision;
|
||||
port_cap->psi_count = XHCI_EXT_PORT_PSIC(temp);
|
||||
|
||||
if (port_cap->psi_count) {
|
||||
@@ -2207,6 +2210,11 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
|
||||
XHCI_EXT_PORT_PSIV(port_cap->psi[i - 1])))
|
||||
port_cap->psi_uid_count++;
|
||||
|
||||
if (xhci->quirks & XHCI_ZHAOXIN_HOST &&
|
||||
major_revision == 0x03 &&
|
||||
XHCI_EXT_PORT_PSIV(port_cap->psi[i]) >= 5)
|
||||
minor_revision = tmp_minor_revision;
|
||||
|
||||
xhci_dbg(xhci, "PSIV:%d PSIE:%d PLT:%d PFD:%d LP:%d PSIM:%d\n",
|
||||
XHCI_EXT_PORT_PSIV(port_cap->psi[i]),
|
||||
XHCI_EXT_PORT_PSIE(port_cap->psi[i]),
|
||||
@@ -2216,6 +2224,15 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
|
||||
XHCI_EXT_PORT_PSIM(port_cap->psi[i]));
|
||||
}
|
||||
}
|
||||
|
||||
rhub->maj_rev = major_revision;
|
||||
|
||||
if (rhub->min_rev < minor_revision)
|
||||
rhub->min_rev = minor_revision;
|
||||
|
||||
port_cap->maj_rev = major_revision;
|
||||
port_cap->min_rev = minor_revision;
|
||||
|
||||
/* cache usb2 port capabilities */
|
||||
if (major_revision < 0x03 && xhci->num_ext_caps < max_caps)
|
||||
xhci->ext_caps[xhci->num_ext_caps++] = temp;
|
||||
@@ -2460,8 +2477,12 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
||||
* and our use of dma addresses in the trb_address_map radix tree needs
|
||||
* TRB_SEGMENT_SIZE alignment, so we pick the greater alignment need.
|
||||
*/
|
||||
xhci->segment_pool = dma_pool_create("xHCI ring segments", dev,
|
||||
TRB_SEGMENT_SIZE, TRB_SEGMENT_SIZE, xhci->page_size);
|
||||
if (xhci->quirks & XHCI_ZHAOXIN_TRB_FETCH)
|
||||
xhci->segment_pool = dma_pool_create("xHCI ring segments", dev,
|
||||
TRB_SEGMENT_SIZE * 2, TRB_SEGMENT_SIZE * 2, xhci->page_size * 2);
|
||||
else
|
||||
xhci->segment_pool = dma_pool_create("xHCI ring segments", dev,
|
||||
TRB_SEGMENT_SIZE, TRB_SEGMENT_SIZE, xhci->page_size);
|
||||
|
||||
/* See Table 46 and Note on Figure 55 */
|
||||
xhci->device_pool = dma_pool_create("xHCI input/output contexts", dev,
|
||||
|
||||
@@ -333,6 +333,18 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4))
|
||||
xhci->quirks |= XHCI_NO_SOFT_RETRY;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ZHAOXIN) {
|
||||
xhci->quirks |= XHCI_ZHAOXIN_HOST;
|
||||
|
||||
if (pdev->device == 0x9202) {
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
xhci->quirks |= XHCI_ZHAOXIN_TRB_FETCH;
|
||||
}
|
||||
|
||||
if (pdev->device == 0x9203)
|
||||
xhci->quirks |= XHCI_ZHAOXIN_TRB_FETCH;
|
||||
}
|
||||
|
||||
/* xHC spec requires PCI devices to support D3hot and D3cold */
|
||||
if (xhci->hci_version >= 0x120)
|
||||
xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW;
|
||||
|
||||
@@ -1916,6 +1916,8 @@ struct xhci_hcd {
|
||||
#define XHCI_EP_CTX_BROKEN_DCS BIT_ULL(42)
|
||||
#define XHCI_SUSPEND_RESUME_CLKS BIT_ULL(43)
|
||||
#define XHCI_RESET_TO_DEFAULT BIT_ULL(44)
|
||||
#define XHCI_ZHAOXIN_TRB_FETCH BIT_ULL(45)
|
||||
#define XHCI_ZHAOXIN_HOST BIT_ULL(46)
|
||||
|
||||
unsigned int num_active_eps;
|
||||
unsigned int limit_active_eps;
|
||||
|
||||
@@ -3517,6 +3517,15 @@ static void handle_cap_grant(struct inode *inode,
|
||||
}
|
||||
BUG_ON(cap->issued & ~cap->implemented);
|
||||
|
||||
/* don't let check_caps skip sending a response to MDS for revoke msgs */
|
||||
if (le32_to_cpu(grant->op) == CEPH_CAP_OP_REVOKE) {
|
||||
cap->mds_wanted = 0;
|
||||
if (cap == ci->i_auth_cap)
|
||||
check_caps = 1; /* check auth cap only */
|
||||
else
|
||||
check_caps = 2; /* check all caps */
|
||||
}
|
||||
|
||||
if (extra_info->inline_version > 0 &&
|
||||
extra_info->inline_version >= ci->i_inline_version) {
|
||||
ci->i_inline_version = extra_info->inline_version;
|
||||
|
||||
@@ -363,7 +363,9 @@ int dlm_posix_get(dlm_lockspace_t *lockspace, u64 number, struct file *file,
|
||||
locks_init_lock(fl);
|
||||
fl->fl_type = (op->info.ex) ? F_WRLCK : F_RDLCK;
|
||||
fl->fl_flags = FL_POSIX;
|
||||
fl->fl_pid = -op->info.pid;
|
||||
fl->fl_pid = op->info.pid;
|
||||
if (op->info.nodeid != dlm_our_nodeid())
|
||||
fl->fl_pid = -fl->fl_pid;
|
||||
fl->fl_start = op->info.start;
|
||||
fl->fl_end = op->info.end;
|
||||
rv = 0;
|
||||
|
||||
@@ -193,7 +193,8 @@ static struct page *erofs_read_inode(struct inode *inode,
|
||||
|
||||
inode->i_flags &= ~S_DAX;
|
||||
if (test_opt(&sbi->opt, DAX_ALWAYS) && S_ISREG(inode->i_mode) &&
|
||||
vi->datalayout == EROFS_INODE_FLAT_PLAIN)
|
||||
(vi->datalayout == EROFS_INODE_FLAT_PLAIN ||
|
||||
vi->datalayout == EROFS_INODE_CHUNK_BASED))
|
||||
inode->i_flags |= S_DAX;
|
||||
if (!nblks)
|
||||
/* measure inode.i_blocks as generic filesystems */
|
||||
|
||||
@@ -825,7 +825,7 @@ hitted:
|
||||
tight &= (clt->mode >= COLLECT_PRIMARY_HOOKED &&
|
||||
clt->mode != COLLECT_PRIMARY_FOLLOWED_NOINPLACE);
|
||||
|
||||
cur = end - min_t(unsigned int, offset + end - map->m_la, end);
|
||||
cur = end - min_t(erofs_off_t, offset + end - map->m_la, end);
|
||||
if (!(map->m_flags & EROFS_MAP_MAPPED)) {
|
||||
zero_user_segment(page, cur, end);
|
||||
goto next_part;
|
||||
|
||||
@@ -257,7 +257,7 @@ static int unpack_compacted_index(struct z_erofs_maprecorder *m,
|
||||
u8 *in, type;
|
||||
bool big_pcluster;
|
||||
|
||||
if (1 << amortizedshift == 4)
|
||||
if (1 << amortizedshift == 4 && lclusterbits <= 14)
|
||||
vcnt = 2;
|
||||
else if (1 << amortizedshift == 2 && lclusterbits == 12)
|
||||
vcnt = 16;
|
||||
@@ -355,7 +355,6 @@ static int compacted_load_cluster_from_disk(struct z_erofs_maprecorder *m,
|
||||
{
|
||||
struct inode *const inode = m->inode;
|
||||
struct erofs_inode *const vi = EROFS_I(inode);
|
||||
const unsigned int lclusterbits = vi->z_logical_clusterbits;
|
||||
const erofs_off_t ebase = ALIGN(iloc(EROFS_I_SB(inode), vi->nid) +
|
||||
vi->inode_isize + vi->xattr_isize, 8) +
|
||||
sizeof(struct z_erofs_map_header);
|
||||
@@ -365,9 +364,6 @@ static int compacted_load_cluster_from_disk(struct z_erofs_maprecorder *m,
|
||||
erofs_off_t pos;
|
||||
int err;
|
||||
|
||||
if (lclusterbits != 12)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (lcn >= totalidx)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -651,6 +651,14 @@ int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
|
||||
|
||||
ext4_update_inode_fsync_trans(handle, inode, 1);
|
||||
count = ar.len;
|
||||
|
||||
/*
|
||||
* Update reserved blocks/metadata blocks after successful block
|
||||
* allocation which had been deferred till now.
|
||||
*/
|
||||
if (flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE)
|
||||
ext4_da_update_reserve_space(inode, count, 1);
|
||||
|
||||
got_it:
|
||||
map->m_flags |= EXT4_MAP_MAPPED;
|
||||
map->m_pblk = le32_to_cpu(chain[depth-1].key);
|
||||
|
||||
@@ -655,16 +655,6 @@ found:
|
||||
*/
|
||||
ext4_clear_inode_state(inode, EXT4_STATE_EXT_MIGRATE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Update reserved blocks/metadata blocks after successful
|
||||
* block allocation which had been deferred till now. We don't
|
||||
* support fallocate for non extent files. So we can update
|
||||
* reserve space here.
|
||||
*/
|
||||
if ((retval > 0) &&
|
||||
(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE))
|
||||
ext4_da_update_reserve_space(inode, retval, 1);
|
||||
}
|
||||
|
||||
if (retval > 0) {
|
||||
|
||||
@@ -559,6 +559,7 @@ static int ext4_shutdown(struct super_block *sb, unsigned long arg)
|
||||
{
|
||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||
__u32 flags;
|
||||
int ret;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
@@ -577,7 +578,9 @@ static int ext4_shutdown(struct super_block *sb, unsigned long arg)
|
||||
|
||||
switch (flags) {
|
||||
case EXT4_GOING_FLAGS_DEFAULT:
|
||||
freeze_bdev(sb->s_bdev);
|
||||
ret = freeze_bdev(sb->s_bdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
set_bit(EXT4_FLAGS_SHUTDOWN, &sbi->s_ext4_flags);
|
||||
thaw_bdev(sb->s_bdev);
|
||||
break;
|
||||
|
||||
@@ -6086,8 +6086,8 @@ do_more:
|
||||
* them with group lock_held
|
||||
*/
|
||||
if (test_opt(sb, DISCARD)) {
|
||||
err = ext4_issue_discard(sb, block_group, bit, count,
|
||||
NULL);
|
||||
err = ext4_issue_discard(sb, block_group, bit,
|
||||
count_clusters, NULL);
|
||||
if (err && err != -EOPNOTSUPP)
|
||||
ext4_msg(sb, KERN_WARNING, "discard request in"
|
||||
" group:%u block:%d count:%lu failed"
|
||||
@@ -6171,12 +6171,6 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
|
||||
|
||||
sbi = EXT4_SB(sb);
|
||||
|
||||
if (sbi->s_mount_state & EXT4_FC_REPLAY) {
|
||||
ext4_free_blocks_simple(inode, block, count);
|
||||
return;
|
||||
}
|
||||
|
||||
might_sleep();
|
||||
if (bh) {
|
||||
if (block)
|
||||
BUG_ON(block != bh->b_blocknr);
|
||||
@@ -6184,6 +6178,13 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
|
||||
block = bh->b_blocknr;
|
||||
}
|
||||
|
||||
if (sbi->s_mount_state & EXT4_FC_REPLAY) {
|
||||
ext4_free_blocks_simple(inode, block, EXT4_NUM_B2C(sbi, count));
|
||||
return;
|
||||
}
|
||||
|
||||
might_sleep();
|
||||
|
||||
if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) &&
|
||||
!ext4_inode_block_valid(inode, block, count)) {
|
||||
ext4_error(sb, "Freeing blocks not in datazone - "
|
||||
|
||||
@@ -1097,6 +1097,12 @@ static void ext4_blkdev_remove(struct ext4_sb_info *sbi)
|
||||
struct block_device *bdev;
|
||||
bdev = sbi->s_journal_bdev;
|
||||
if (bdev) {
|
||||
/*
|
||||
* Invalidate the journal device's buffers. We don't want them
|
||||
* floating about in memory - the physical journal device may
|
||||
* hotswapped, and it breaks the `ro-after' testing code.
|
||||
*/
|
||||
invalidate_bdev(bdev);
|
||||
ext4_blkdev_put(bdev);
|
||||
sbi->s_journal_bdev = NULL;
|
||||
}
|
||||
@@ -1239,13 +1245,7 @@ static void ext4_put_super(struct super_block *sb)
|
||||
sync_blockdev(sb->s_bdev);
|
||||
invalidate_bdev(sb->s_bdev);
|
||||
if (sbi->s_journal_bdev && sbi->s_journal_bdev != sb->s_bdev) {
|
||||
/*
|
||||
* Invalidate the journal device's buffers. We don't want them
|
||||
* floating about in memory - the physical journal device may
|
||||
* hotswapped, and it breaks the `ro-after' testing code.
|
||||
*/
|
||||
sync_blockdev(sbi->s_journal_bdev);
|
||||
invalidate_bdev(sbi->s_journal_bdev);
|
||||
ext4_blkdev_remove(sbi);
|
||||
}
|
||||
|
||||
@@ -4976,7 +4976,7 @@ no_journal:
|
||||
ext4_msg(sb, KERN_INFO, "recovery complete");
|
||||
err = ext4_mark_recovery_complete(sb, es);
|
||||
if (err)
|
||||
goto failed_mount9;
|
||||
goto failed_mount10;
|
||||
}
|
||||
if (EXT4_SB(sb)->s_journal) {
|
||||
if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)
|
||||
@@ -5022,7 +5022,9 @@ cantfind_ext4:
|
||||
ext4_msg(sb, KERN_ERR, "VFS: Can't find ext4 filesystem");
|
||||
goto failed_mount;
|
||||
|
||||
failed_mount9:
|
||||
failed_mount10:
|
||||
ext4_quota_off_umount(sb);
|
||||
failed_mount9: __maybe_unused
|
||||
ext4_release_orphan_info(sb);
|
||||
failed_mount8:
|
||||
ext4_unregister_sysfs(sb);
|
||||
@@ -5099,6 +5101,7 @@ failed_mount:
|
||||
brelse(bh);
|
||||
ext4_blkdev_remove(sbi);
|
||||
out_fail:
|
||||
invalidate_bdev(sb->s_bdev);
|
||||
sb->s_fs_info = NULL;
|
||||
kfree(sbi->s_blockgroup_lock);
|
||||
out_free_base:
|
||||
|
||||
@@ -3815,7 +3815,7 @@ block_t f2fs_start_bidx_of_node(unsigned int node_ofs, struct inode *inode);
|
||||
int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background, bool force,
|
||||
unsigned int segno);
|
||||
void f2fs_build_gc_manager(struct f2fs_sb_info *sbi);
|
||||
int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count);
|
||||
int f2fs_resize_fs(struct file *filp, __u64 block_count);
|
||||
int __init f2fs_create_garbage_collection_cache(void);
|
||||
void f2fs_destroy_garbage_collection_cache(void);
|
||||
|
||||
|
||||
@@ -3260,7 +3260,7 @@ static int f2fs_ioc_resize_fs(struct file *filp, unsigned long arg)
|
||||
sizeof(block_count)))
|
||||
return -EFAULT;
|
||||
|
||||
return f2fs_resize_fs(sbi, block_count);
|
||||
return f2fs_resize_fs(filp, block_count);
|
||||
}
|
||||
|
||||
static int f2fs_ioc_enable_verity(struct file *filp, unsigned long arg)
|
||||
|
||||
21
fs/f2fs/gc.c
21
fs/f2fs/gc.c
@@ -2072,8 +2072,9 @@ static void update_fs_metadata(struct f2fs_sb_info *sbi, int secs)
|
||||
}
|
||||
}
|
||||
|
||||
int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
|
||||
int f2fs_resize_fs(struct file *filp, __u64 block_count)
|
||||
{
|
||||
struct f2fs_sb_info *sbi = F2FS_I_SB(file_inode(filp));
|
||||
__u64 old_block_count, shrunk_blocks;
|
||||
struct cp_control cpc = { CP_RESIZE, 0, 0, 0 };
|
||||
unsigned int secs;
|
||||
@@ -2111,12 +2112,18 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = mnt_want_write_file(filp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
shrunk_blocks = old_block_count - block_count;
|
||||
secs = div_u64(shrunk_blocks, BLKS_PER_SEC(sbi));
|
||||
|
||||
/* stop other GC */
|
||||
if (!f2fs_down_write_trylock(&sbi->gc_lock))
|
||||
return -EAGAIN;
|
||||
if (!f2fs_down_write_trylock(&sbi->gc_lock)) {
|
||||
err = -EAGAIN;
|
||||
goto out_drop_write;
|
||||
}
|
||||
|
||||
/* stop CP to protect MAIN_SEC in free_segment_range */
|
||||
f2fs_lock_op(sbi);
|
||||
@@ -2136,10 +2143,18 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
|
||||
out_unlock:
|
||||
f2fs_unlock_op(sbi);
|
||||
f2fs_up_write(&sbi->gc_lock);
|
||||
out_drop_write:
|
||||
mnt_drop_write_file(filp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
freeze_super(sbi->sb);
|
||||
|
||||
if (f2fs_readonly(sbi->sb)) {
|
||||
thaw_super(sbi->sb);
|
||||
return -EROFS;
|
||||
}
|
||||
|
||||
f2fs_down_write(&sbi->gc_lock);
|
||||
f2fs_down_write(&sbi->cp_global_sem);
|
||||
|
||||
|
||||
@@ -178,7 +178,13 @@ int dbMount(struct inode *ipbmap)
|
||||
dbmp_le = (struct dbmap_disk *) mp->data;
|
||||
bmp->db_mapsize = le64_to_cpu(dbmp_le->dn_mapsize);
|
||||
bmp->db_nfree = le64_to_cpu(dbmp_le->dn_nfree);
|
||||
|
||||
bmp->db_l2nbperpage = le32_to_cpu(dbmp_le->dn_l2nbperpage);
|
||||
if (bmp->db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE) {
|
||||
err = -EINVAL;
|
||||
goto err_release_metapage;
|
||||
}
|
||||
|
||||
bmp->db_numag = le32_to_cpu(dbmp_le->dn_numag);
|
||||
if (!bmp->db_numag) {
|
||||
err = -EINVAL;
|
||||
|
||||
@@ -122,7 +122,9 @@
|
||||
#define NUM_INODE_PER_IAG INOSPERIAG
|
||||
|
||||
#define MINBLOCKSIZE 512
|
||||
#define L2MINBLOCKSIZE 9
|
||||
#define MAXBLOCKSIZE 4096
|
||||
#define L2MAXBLOCKSIZE 12
|
||||
#define MAXFILESIZE ((s64)1 << 52)
|
||||
|
||||
#define JFS_LINK_MAX 0xffffffff
|
||||
|
||||
@@ -605,11 +605,58 @@ static const struct NTFS_DE *hdr_insert_head(struct INDEX_HDR *hdr,
|
||||
return e;
|
||||
}
|
||||
|
||||
/*
|
||||
* index_hdr_check
|
||||
*
|
||||
* return true if INDEX_HDR is valid
|
||||
*/
|
||||
static bool index_hdr_check(const struct INDEX_HDR *hdr, u32 bytes)
|
||||
{
|
||||
u32 end = le32_to_cpu(hdr->used);
|
||||
u32 tot = le32_to_cpu(hdr->total);
|
||||
u32 off = le32_to_cpu(hdr->de_off);
|
||||
|
||||
if (!IS_ALIGNED(off, 8) || tot > bytes || end > tot ||
|
||||
off + sizeof(struct NTFS_DE) > end) {
|
||||
/* incorrect index buffer. */
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* index_buf_check
|
||||
*
|
||||
* return true if INDEX_BUFFER seems is valid
|
||||
*/
|
||||
static bool index_buf_check(const struct INDEX_BUFFER *ib, u32 bytes,
|
||||
const CLST *vbn)
|
||||
{
|
||||
const struct NTFS_RECORD_HEADER *rhdr = &ib->rhdr;
|
||||
u16 fo = le16_to_cpu(rhdr->fix_off);
|
||||
u16 fn = le16_to_cpu(rhdr->fix_num);
|
||||
|
||||
if (bytes <= offsetof(struct INDEX_BUFFER, ihdr) ||
|
||||
rhdr->sign != NTFS_INDX_SIGNATURE ||
|
||||
fo < sizeof(struct INDEX_BUFFER)
|
||||
/* Check index buffer vbn. */
|
||||
|| (vbn && *vbn != le64_to_cpu(ib->vbn)) || (fo % sizeof(short)) ||
|
||||
fo + fn * sizeof(short) >= bytes ||
|
||||
fn != ((bytes >> SECTOR_SHIFT) + 1)) {
|
||||
/* incorrect index buffer. */
|
||||
return false;
|
||||
}
|
||||
|
||||
return index_hdr_check(&ib->ihdr,
|
||||
bytes - offsetof(struct INDEX_BUFFER, ihdr));
|
||||
}
|
||||
|
||||
void fnd_clear(struct ntfs_fnd *fnd)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < fnd->level; i++) {
|
||||
for (i = fnd->level - 1; i >= 0; i--) {
|
||||
struct indx_node *n = fnd->nodes[i];
|
||||
|
||||
if (!n)
|
||||
@@ -828,9 +875,16 @@ int indx_init(struct ntfs_index *indx, struct ntfs_sb_info *sbi,
|
||||
u32 t32;
|
||||
const struct INDEX_ROOT *root = resident_data(attr);
|
||||
|
||||
t32 = le32_to_cpu(attr->res.data_size);
|
||||
if (t32 <= offsetof(struct INDEX_ROOT, ihdr) ||
|
||||
!index_hdr_check(&root->ihdr,
|
||||
t32 - offsetof(struct INDEX_ROOT, ihdr))) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check root fields. */
|
||||
if (!root->index_block_clst)
|
||||
return -EINVAL;
|
||||
goto out;
|
||||
|
||||
indx->type = type;
|
||||
indx->idx2vbn_bits = __ffs(root->index_block_clst);
|
||||
@@ -842,19 +896,19 @@ int indx_init(struct ntfs_index *indx, struct ntfs_sb_info *sbi,
|
||||
if (t32 < sbi->cluster_size) {
|
||||
/* Index record is smaller than a cluster, use 512 blocks. */
|
||||
if (t32 != root->index_block_clst * SECTOR_SIZE)
|
||||
return -EINVAL;
|
||||
goto out;
|
||||
|
||||
/* Check alignment to a cluster. */
|
||||
if ((sbi->cluster_size >> SECTOR_SHIFT) &
|
||||
(root->index_block_clst - 1)) {
|
||||
return -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
indx->vbn2vbo_bits = SECTOR_SHIFT;
|
||||
} else {
|
||||
/* Index record must be a multiple of cluster size. */
|
||||
if (t32 != root->index_block_clst << sbi->cluster_bits)
|
||||
return -EINVAL;
|
||||
goto out;
|
||||
|
||||
indx->vbn2vbo_bits = sbi->cluster_bits;
|
||||
}
|
||||
@@ -862,7 +916,14 @@ int indx_init(struct ntfs_index *indx, struct ntfs_sb_info *sbi,
|
||||
init_rwsem(&indx->run_lock);
|
||||
|
||||
indx->cmp = get_cmp_func(root);
|
||||
return indx->cmp ? 0 : -EINVAL;
|
||||
if (!indx->cmp)
|
||||
goto out;
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
ntfs_set_state(sbi, NTFS_DIRTY_DIRTY);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct indx_node *indx_new(struct ntfs_index *indx,
|
||||
@@ -1029,6 +1090,13 @@ int indx_read(struct ntfs_index *indx, struct ntfs_inode *ni, CLST vbn,
|
||||
goto out;
|
||||
|
||||
ok:
|
||||
if (!index_buf_check(ib, bytes, &vbn)) {
|
||||
ntfs_inode_err(&ni->vfs_inode, "directory corrupted");
|
||||
ntfs_set_state(ni->mi.sbi, NTFS_DIRTY_ERROR);
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (err == -E_NTFS_FIXUP) {
|
||||
ntfs_write_bh(ni->mi.sbi, &ib->rhdr, &in->nb, 0);
|
||||
err = 0;
|
||||
@@ -1623,9 +1691,9 @@ static int indx_insert_into_root(struct ntfs_index *indx, struct ntfs_inode *ni,
|
||||
|
||||
if (err) {
|
||||
/* Restore root. */
|
||||
if (mi_resize_attr(mi, attr, -ds_root))
|
||||
if (mi_resize_attr(mi, attr, -ds_root)) {
|
||||
memcpy(attr, a_root, asize);
|
||||
else {
|
||||
} else {
|
||||
/* Bug? */
|
||||
ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ static struct inode *ntfs_read_mft(struct inode *inode,
|
||||
le16_to_cpu(ref->seq), le16_to_cpu(rec->seq));
|
||||
goto out;
|
||||
} else if (!is_rec_inuse(rec)) {
|
||||
err = -EINVAL;
|
||||
err = -ESTALE;
|
||||
ntfs_err(sb, "Inode r=%x is not in use!", (u32)ino);
|
||||
goto out;
|
||||
}
|
||||
@@ -92,8 +92,10 @@ static struct inode *ntfs_read_mft(struct inode *inode,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!is_rec_base(rec))
|
||||
goto Ok;
|
||||
if (!is_rec_base(rec)) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Record should contain $I30 root. */
|
||||
is_dir = rec->flags & RECORD_FLAG_DIR;
|
||||
@@ -472,7 +474,6 @@ end_enum:
|
||||
inode->i_flags |= S_NOSEC;
|
||||
}
|
||||
|
||||
Ok:
|
||||
if (ino == MFT_REC_MFT && !sb->s_root)
|
||||
sbi->mft.ni = NULL;
|
||||
|
||||
@@ -526,6 +527,9 @@ struct inode *ntfs_iget5(struct super_block *sb, const struct MFT_REF *ref,
|
||||
make_bad_inode(inode);
|
||||
}
|
||||
|
||||
if (IS_ERR(inode) && name)
|
||||
ntfs_set_state(sb->s_fs_info, NTFS_DIRTY_ERROR);
|
||||
|
||||
return inode;
|
||||
}
|
||||
|
||||
@@ -1647,10 +1651,8 @@ out6:
|
||||
ntfs_remove_reparse(sbi, IO_REPARSE_TAG_SYMLINK, &new_de->ref);
|
||||
|
||||
out5:
|
||||
if (S_ISDIR(mode) || run_is_empty(&ni->file.run))
|
||||
goto out4;
|
||||
|
||||
run_deallocate(sbi, &ni->file.run, false);
|
||||
if (!S_ISDIR(mode))
|
||||
run_deallocate(sbi, &ni->file.run, false);
|
||||
|
||||
out4:
|
||||
clear_rec_inuse(rec);
|
||||
|
||||
@@ -789,12 +789,12 @@ int run_pack(const struct runs_tree *run, CLST svcn, CLST len, u8 *run_buf,
|
||||
u32 run_buf_size, CLST *packed_vcns);
|
||||
int run_unpack(struct runs_tree *run, struct ntfs_sb_info *sbi, CLST ino,
|
||||
CLST svcn, CLST evcn, CLST vcn, const u8 *run_buf,
|
||||
u32 run_buf_size);
|
||||
int run_buf_size);
|
||||
|
||||
#ifdef NTFS3_CHECK_FREE_CLST
|
||||
int run_unpack_ex(struct runs_tree *run, struct ntfs_sb_info *sbi, CLST ino,
|
||||
CLST svcn, CLST evcn, CLST vcn, const u8 *run_buf,
|
||||
u32 run_buf_size);
|
||||
int run_buf_size);
|
||||
#else
|
||||
#define run_unpack_ex run_unpack
|
||||
#endif
|
||||
|
||||
@@ -872,12 +872,15 @@ error:
|
||||
*/
|
||||
int run_unpack(struct runs_tree *run, struct ntfs_sb_info *sbi, CLST ino,
|
||||
CLST svcn, CLST evcn, CLST vcn, const u8 *run_buf,
|
||||
u32 run_buf_size)
|
||||
int run_buf_size)
|
||||
{
|
||||
u64 prev_lcn, vcn64, lcn, next_vcn;
|
||||
const u8 *run_last, *run_0;
|
||||
bool is_mft = ino == MFT_REC_MFT;
|
||||
|
||||
if (run_buf_size < 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* Check for empty. */
|
||||
if (evcn + 1 == svcn)
|
||||
return 0;
|
||||
@@ -999,7 +1002,7 @@ int run_unpack(struct runs_tree *run, struct ntfs_sb_info *sbi, CLST ino,
|
||||
*/
|
||||
int run_unpack_ex(struct runs_tree *run, struct ntfs_sb_info *sbi, CLST ino,
|
||||
CLST svcn, CLST evcn, CLST vcn, const u8 *run_buf,
|
||||
u32 run_buf_size)
|
||||
int run_buf_size)
|
||||
{
|
||||
int ret, err;
|
||||
CLST next_vcn, lcn, len;
|
||||
|
||||
109
fs/ntfs3/xattr.c
109
fs/ntfs3/xattr.c
@@ -42,28 +42,26 @@ static inline size_t packed_ea_size(const struct EA_FULL *ea)
|
||||
* Assume there is at least one xattr in the list.
|
||||
*/
|
||||
static inline bool find_ea(const struct EA_FULL *ea_all, u32 bytes,
|
||||
const char *name, u8 name_len, u32 *off)
|
||||
const char *name, u8 name_len, u32 *off, u32 *ea_sz)
|
||||
{
|
||||
*off = 0;
|
||||
u32 ea_size;
|
||||
|
||||
if (!ea_all || !bytes)
|
||||
*off = 0;
|
||||
if (!ea_all)
|
||||
return false;
|
||||
|
||||
for (;;) {
|
||||
for (; *off < bytes; *off += ea_size) {
|
||||
const struct EA_FULL *ea = Add2Ptr(ea_all, *off);
|
||||
u32 next_off = *off + unpacked_ea_size(ea);
|
||||
|
||||
if (next_off > bytes)
|
||||
return false;
|
||||
|
||||
ea_size = unpacked_ea_size(ea);
|
||||
if (ea->name_len == name_len &&
|
||||
!memcmp(ea->name, name, name_len))
|
||||
!memcmp(ea->name, name, name_len)) {
|
||||
if (ea_sz)
|
||||
*ea_sz = ea_size;
|
||||
return true;
|
||||
|
||||
*off = next_off;
|
||||
if (next_off >= bytes)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -74,12 +72,12 @@ static inline bool find_ea(const struct EA_FULL *ea_all, u32 bytes,
|
||||
static int ntfs_read_ea(struct ntfs_inode *ni, struct EA_FULL **ea,
|
||||
size_t add_bytes, const struct EA_INFO **info)
|
||||
{
|
||||
int err;
|
||||
int err = -EINVAL;
|
||||
struct ntfs_sb_info *sbi = ni->mi.sbi;
|
||||
struct ATTR_LIST_ENTRY *le = NULL;
|
||||
struct ATTRIB *attr_info, *attr_ea;
|
||||
void *ea_p;
|
||||
u32 size;
|
||||
u32 size, off, ea_size;
|
||||
|
||||
static_assert(le32_to_cpu(ATTR_EA_INFO) < le32_to_cpu(ATTR_EA));
|
||||
|
||||
@@ -96,24 +94,31 @@ static int ntfs_read_ea(struct ntfs_inode *ni, struct EA_FULL **ea,
|
||||
|
||||
*info = resident_data_ex(attr_info, sizeof(struct EA_INFO));
|
||||
if (!*info)
|
||||
return -EINVAL;
|
||||
goto out;
|
||||
|
||||
/* Check Ea limit. */
|
||||
size = le32_to_cpu((*info)->size);
|
||||
if (size > sbi->ea_max_size)
|
||||
return -EFBIG;
|
||||
if (size > sbi->ea_max_size) {
|
||||
err = -EFBIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (attr_size(attr_ea) > sbi->ea_max_size)
|
||||
return -EFBIG;
|
||||
if (attr_size(attr_ea) > sbi->ea_max_size) {
|
||||
err = -EFBIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!size) {
|
||||
/* EA info persists, but xattr is empty. Looks like EA problem. */
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Allocate memory for packed Ea. */
|
||||
ea_p = kmalloc(size_add(size, add_bytes), GFP_NOFS);
|
||||
if (!ea_p)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!size) {
|
||||
/* EA info persists, but xattr is empty. Looks like EA problem. */
|
||||
} else if (attr_ea->non_res) {
|
||||
if (attr_ea->non_res) {
|
||||
struct runs_tree run;
|
||||
|
||||
run_init(&run);
|
||||
@@ -124,24 +129,52 @@ static int ntfs_read_ea(struct ntfs_inode *ni, struct EA_FULL **ea,
|
||||
run_close(&run);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
goto out1;
|
||||
} else {
|
||||
void *p = resident_data_ex(attr_ea, size);
|
||||
|
||||
if (!p) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
if (!p)
|
||||
goto out1;
|
||||
memcpy(ea_p, p, size);
|
||||
}
|
||||
|
||||
memset(Add2Ptr(ea_p, size), 0, add_bytes);
|
||||
|
||||
/* Check all attributes for consistency. */
|
||||
for (off = 0; off < size; off += ea_size) {
|
||||
const struct EA_FULL *ef = Add2Ptr(ea_p, off);
|
||||
u32 bytes = size - off;
|
||||
|
||||
/* Check if we can use field ea->size. */
|
||||
if (bytes < sizeof(ef->size))
|
||||
goto out1;
|
||||
|
||||
if (ef->size) {
|
||||
ea_size = le32_to_cpu(ef->size);
|
||||
if (ea_size > bytes)
|
||||
goto out1;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if we can use fields ef->name_len and ef->elength. */
|
||||
if (bytes < offsetof(struct EA_FULL, name))
|
||||
goto out1;
|
||||
|
||||
ea_size = ALIGN(struct_size(ef, name,
|
||||
1 + ef->name_len +
|
||||
le16_to_cpu(ef->elength)),
|
||||
4);
|
||||
if (ea_size > bytes)
|
||||
goto out1;
|
||||
}
|
||||
|
||||
*ea = ea_p;
|
||||
return 0;
|
||||
|
||||
out:
|
||||
out1:
|
||||
kfree(ea_p);
|
||||
*ea = NULL;
|
||||
out:
|
||||
ntfs_set_state(sbi, NTFS_DIRTY_DIRTY);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -163,6 +196,7 @@ static ssize_t ntfs_list_ea(struct ntfs_inode *ni, char *buffer,
|
||||
const struct EA_FULL *ea;
|
||||
u32 off, size;
|
||||
int err;
|
||||
int ea_size;
|
||||
size_t ret;
|
||||
|
||||
err = ntfs_read_ea(ni, &ea_all, 0, &info);
|
||||
@@ -175,8 +209,9 @@ static ssize_t ntfs_list_ea(struct ntfs_inode *ni, char *buffer,
|
||||
size = le32_to_cpu(info->size);
|
||||
|
||||
/* Enumerate all xattrs. */
|
||||
for (ret = 0, off = 0; off < size; off += unpacked_ea_size(ea)) {
|
||||
for (ret = 0, off = 0; off < size; off += ea_size) {
|
||||
ea = Add2Ptr(ea_all, off);
|
||||
ea_size = unpacked_ea_size(ea);
|
||||
|
||||
if (!ea->name_len)
|
||||
break;
|
||||
@@ -230,7 +265,8 @@ static int ntfs_get_ea(struct inode *inode, const char *name, size_t name_len,
|
||||
goto out;
|
||||
|
||||
/* Enumerate all xattrs. */
|
||||
if (!find_ea(ea_all, le32_to_cpu(info->size), name, name_len, &off)) {
|
||||
if (!find_ea(ea_all, le32_to_cpu(info->size), name, name_len, &off,
|
||||
NULL)) {
|
||||
err = -ENODATA;
|
||||
goto out;
|
||||
}
|
||||
@@ -272,7 +308,7 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name,
|
||||
struct EA_FULL *new_ea;
|
||||
struct EA_FULL *ea_all = NULL;
|
||||
size_t add, new_pack;
|
||||
u32 off, size;
|
||||
u32 off, size, ea_sz;
|
||||
__le16 size_pack;
|
||||
struct ATTRIB *attr;
|
||||
struct ATTR_LIST_ENTRY *le;
|
||||
@@ -306,9 +342,8 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name,
|
||||
size_pack = ea_info.size_pack;
|
||||
}
|
||||
|
||||
if (info && find_ea(ea_all, size, name, name_len, &off)) {
|
||||
if (info && find_ea(ea_all, size, name, name_len, &off, &ea_sz)) {
|
||||
struct EA_FULL *ea;
|
||||
size_t ea_sz;
|
||||
|
||||
if (flags & XATTR_CREATE) {
|
||||
err = -EEXIST;
|
||||
@@ -331,8 +366,6 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name,
|
||||
if (ea->flags & FILE_NEED_EA)
|
||||
le16_add_cpu(&ea_info.count, -1);
|
||||
|
||||
ea_sz = unpacked_ea_size(ea);
|
||||
|
||||
le16_add_cpu(&ea_info.size_pack, 0 - packed_ea_size(ea));
|
||||
|
||||
memmove(ea, Add2Ptr(ea, ea_sz), size - off - ea_sz);
|
||||
|
||||
@@ -97,7 +97,6 @@ struct uart_8250_port {
|
||||
struct list_head list; /* ports on this IRQ */
|
||||
u32 capabilities; /* port capabilities */
|
||||
unsigned short bugs; /* port bugs */
|
||||
bool fifo_bug; /* min RX trigger if enabled */
|
||||
unsigned int tx_loadsz; /* transmit fifo load size */
|
||||
unsigned char acr;
|
||||
unsigned char fcr;
|
||||
|
||||
@@ -141,7 +141,7 @@ extern const struct nla_policy rtm_tca_policy[TCA_MAX + 1];
|
||||
*/
|
||||
static inline unsigned int psched_mtu(const struct net_device *dev)
|
||||
{
|
||||
return dev->mtu + dev->hard_header_len;
|
||||
return READ_ONCE(dev->mtu) + dev->hard_header_len;
|
||||
}
|
||||
|
||||
static inline struct net *qdisc_net(struct Qdisc *q)
|
||||
|
||||
@@ -126,22 +126,6 @@ static void get_cpu_map_entry(struct bpf_cpu_map_entry *rcpu)
|
||||
atomic_inc(&rcpu->refcnt);
|
||||
}
|
||||
|
||||
/* called from workqueue, to workaround syscall using preempt_disable */
|
||||
static void cpu_map_kthread_stop(struct work_struct *work)
|
||||
{
|
||||
struct bpf_cpu_map_entry *rcpu;
|
||||
|
||||
rcpu = container_of(work, struct bpf_cpu_map_entry, kthread_stop_wq);
|
||||
|
||||
/* Wait for flush in __cpu_map_entry_free(), via full RCU barrier,
|
||||
* as it waits until all in-flight call_rcu() callbacks complete.
|
||||
*/
|
||||
rcu_barrier();
|
||||
|
||||
/* kthread_stop will wake_up_process and wait for it to complete */
|
||||
kthread_stop(rcpu->kthread);
|
||||
}
|
||||
|
||||
static void __cpu_map_ring_cleanup(struct ptr_ring *ring)
|
||||
{
|
||||
/* The tear-down procedure should have made sure that queue is
|
||||
@@ -169,6 +153,30 @@ static void put_cpu_map_entry(struct bpf_cpu_map_entry *rcpu)
|
||||
}
|
||||
}
|
||||
|
||||
/* called from workqueue, to workaround syscall using preempt_disable */
|
||||
static void cpu_map_kthread_stop(struct work_struct *work)
|
||||
{
|
||||
struct bpf_cpu_map_entry *rcpu;
|
||||
int err;
|
||||
|
||||
rcpu = container_of(work, struct bpf_cpu_map_entry, kthread_stop_wq);
|
||||
|
||||
/* Wait for flush in __cpu_map_entry_free(), via full RCU barrier,
|
||||
* as it waits until all in-flight call_rcu() callbacks complete.
|
||||
*/
|
||||
rcu_barrier();
|
||||
|
||||
/* kthread_stop will wake_up_process and wait for it to complete */
|
||||
err = kthread_stop(rcpu->kthread);
|
||||
if (err) {
|
||||
/* kthread_stop may be called before cpu_map_kthread_run
|
||||
* is executed, so we need to release the memory related
|
||||
* to rcpu.
|
||||
*/
|
||||
put_cpu_map_entry(rcpu);
|
||||
}
|
||||
}
|
||||
|
||||
static void cpu_map_bpf_prog_run_skb(struct bpf_cpu_map_entry *rcpu,
|
||||
struct list_head *listp,
|
||||
struct xdp_cpumap_stats *stats)
|
||||
|
||||
@@ -3191,6 +3191,22 @@ static int ftrace_allocate_records(struct ftrace_page *pg, int count)
|
||||
return cnt;
|
||||
}
|
||||
|
||||
static void ftrace_free_pages(struct ftrace_page *pages)
|
||||
{
|
||||
struct ftrace_page *pg = pages;
|
||||
|
||||
while (pg) {
|
||||
if (pg->records) {
|
||||
free_pages((unsigned long)pg->records, pg->order);
|
||||
ftrace_number_of_pages -= 1 << pg->order;
|
||||
}
|
||||
pages = pg->next;
|
||||
kfree(pg);
|
||||
pg = pages;
|
||||
ftrace_number_of_groups--;
|
||||
}
|
||||
}
|
||||
|
||||
static struct ftrace_page *
|
||||
ftrace_allocate_pages(unsigned long num_to_init)
|
||||
{
|
||||
@@ -3229,17 +3245,7 @@ ftrace_allocate_pages(unsigned long num_to_init)
|
||||
return start_pg;
|
||||
|
||||
free_pages:
|
||||
pg = start_pg;
|
||||
while (pg) {
|
||||
if (pg->records) {
|
||||
free_pages((unsigned long)pg->records, pg->order);
|
||||
ftrace_number_of_pages -= 1 << pg->order;
|
||||
}
|
||||
start_pg = pg->next;
|
||||
kfree(pg);
|
||||
pg = start_pg;
|
||||
ftrace_number_of_groups--;
|
||||
}
|
||||
ftrace_free_pages(start_pg);
|
||||
pr_info("ftrace: FAILED to allocate memory for functions\n");
|
||||
return NULL;
|
||||
}
|
||||
@@ -6183,9 +6189,11 @@ static int ftrace_process_locs(struct module *mod,
|
||||
unsigned long *start,
|
||||
unsigned long *end)
|
||||
{
|
||||
struct ftrace_page *pg_unuse = NULL;
|
||||
struct ftrace_page *start_pg;
|
||||
struct ftrace_page *pg;
|
||||
struct dyn_ftrace *rec;
|
||||
unsigned long skipped = 0;
|
||||
unsigned long count;
|
||||
unsigned long *p;
|
||||
unsigned long addr;
|
||||
@@ -6239,8 +6247,10 @@ static int ftrace_process_locs(struct module *mod,
|
||||
* object files to satisfy alignments.
|
||||
* Skip any NULL pointers.
|
||||
*/
|
||||
if (!addr)
|
||||
if (!addr) {
|
||||
skipped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
end_offset = (pg->index+1) * sizeof(pg->records[0]);
|
||||
if (end_offset > PAGE_SIZE << pg->order) {
|
||||
@@ -6254,8 +6264,10 @@ static int ftrace_process_locs(struct module *mod,
|
||||
rec->ip = addr;
|
||||
}
|
||||
|
||||
/* We should have used all pages */
|
||||
WARN_ON(pg->next);
|
||||
if (pg->next) {
|
||||
pg_unuse = pg->next;
|
||||
pg->next = NULL;
|
||||
}
|
||||
|
||||
/* Assign the last page to ftrace_pages */
|
||||
ftrace_pages = pg;
|
||||
@@ -6277,6 +6289,11 @@ static int ftrace_process_locs(struct module *mod,
|
||||
out:
|
||||
mutex_unlock(&ftrace_lock);
|
||||
|
||||
/* We should have used all pages unless we skipped some */
|
||||
if (pg_unuse) {
|
||||
WARN_ON(!skipped);
|
||||
ftrace_free_pages(pg_unuse);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -5196,28 +5196,34 @@ unsigned long ring_buffer_size(struct trace_buffer *buffer, int cpu)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ring_buffer_size);
|
||||
|
||||
static void rb_clear_buffer_page(struct buffer_page *page)
|
||||
{
|
||||
local_set(&page->write, 0);
|
||||
local_set(&page->entries, 0);
|
||||
rb_init_page(page->page);
|
||||
page->read = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
|
||||
{
|
||||
struct buffer_page *page;
|
||||
|
||||
rb_head_page_deactivate(cpu_buffer);
|
||||
|
||||
cpu_buffer->head_page
|
||||
= list_entry(cpu_buffer->pages, struct buffer_page, list);
|
||||
local_set(&cpu_buffer->head_page->write, 0);
|
||||
local_set(&cpu_buffer->head_page->entries, 0);
|
||||
local_set(&cpu_buffer->head_page->page->commit, 0);
|
||||
|
||||
cpu_buffer->head_page->read = 0;
|
||||
rb_clear_buffer_page(cpu_buffer->head_page);
|
||||
list_for_each_entry(page, cpu_buffer->pages, list) {
|
||||
rb_clear_buffer_page(page);
|
||||
}
|
||||
|
||||
cpu_buffer->tail_page = cpu_buffer->head_page;
|
||||
cpu_buffer->commit_page = cpu_buffer->head_page;
|
||||
|
||||
INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
|
||||
INIT_LIST_HEAD(&cpu_buffer->new_pages);
|
||||
local_set(&cpu_buffer->reader_page->write, 0);
|
||||
local_set(&cpu_buffer->reader_page->entries, 0);
|
||||
local_set(&cpu_buffer->reader_page->page->commit, 0);
|
||||
cpu_buffer->reader_page->read = 0;
|
||||
rb_clear_buffer_page(cpu_buffer->reader_page);
|
||||
|
||||
local_set(&cpu_buffer->entries_bytes, 0);
|
||||
local_set(&cpu_buffer->overrun, 0);
|
||||
|
||||
@@ -6661,6 +6661,7 @@ static int tracing_release_pipe(struct inode *inode, struct file *file)
|
||||
|
||||
free_cpumask_var(iter->started);
|
||||
kfree(iter->fmt);
|
||||
kfree(iter->temp);
|
||||
mutex_destroy(&iter->mutex);
|
||||
kfree(iter);
|
||||
|
||||
@@ -8024,7 +8025,7 @@ static const struct file_operations tracing_err_log_fops = {
|
||||
.open = tracing_err_log_open,
|
||||
.write = tracing_err_log_write,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.llseek = tracing_lseek,
|
||||
.release = tracing_err_log_release,
|
||||
};
|
||||
|
||||
|
||||
@@ -6299,13 +6299,15 @@ static int event_hist_trigger_func(struct event_command *cmd_ops,
|
||||
if (get_named_trigger_data(trigger_data))
|
||||
goto enable;
|
||||
|
||||
if (has_hist_vars(hist_data))
|
||||
save_hist_vars(hist_data);
|
||||
|
||||
ret = create_actions(hist_data);
|
||||
if (ret)
|
||||
goto out_unreg;
|
||||
|
||||
if (has_hist_vars(hist_data) || hist_data->n_var_refs) {
|
||||
if (save_hist_vars(hist_data))
|
||||
goto out_unreg;
|
||||
}
|
||||
|
||||
ret = tracing_map_init(hist_data->map);
|
||||
if (ret)
|
||||
goto out_unreg;
|
||||
|
||||
@@ -143,6 +143,8 @@ stage3:
|
||||
array:
|
||||
/* the last stage: Loop on array */
|
||||
if (code->op == FETCH_OP_LP_ARRAY) {
|
||||
if (ret < 0)
|
||||
ret = 0;
|
||||
total += ret;
|
||||
if (++i < code->param) {
|
||||
code = s3;
|
||||
@@ -204,11 +206,13 @@ store_trace_args(void *data, struct trace_probe *tp, void *rec,
|
||||
if (unlikely(arg->dynamic))
|
||||
*dl = make_data_loc(maxlen, dyndata - base);
|
||||
ret = process_fetch_insn(arg->code, rec, dl, base);
|
||||
if (unlikely(ret < 0 && arg->dynamic)) {
|
||||
*dl = make_data_loc(0, dyndata - base);
|
||||
} else {
|
||||
dyndata += ret;
|
||||
maxlen -= ret;
|
||||
if (arg->dynamic) {
|
||||
if (unlikely(ret < 0)) {
|
||||
*dl = make_data_loc(0, dyndata - base);
|
||||
} else {
|
||||
dyndata += ret;
|
||||
maxlen -= ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -381,7 +381,7 @@ static int damon_mkold_pmd_entry(pmd_t *pmd, unsigned long addr,
|
||||
}
|
||||
|
||||
if (pmd_huge(*pmd)) {
|
||||
damon_pmdp_mkold(pmd, walk->mm, addr);
|
||||
damon_pmdp_mkold(pmd, walk->vma, addr);
|
||||
spin_unlock(ptl);
|
||||
return 0;
|
||||
}
|
||||
@@ -393,7 +393,7 @@ static int damon_mkold_pmd_entry(pmd_t *pmd, unsigned long addr,
|
||||
pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
|
||||
if (!pte_present(*pte))
|
||||
goto out;
|
||||
damon_ptep_mkold(pte, walk->mm, addr);
|
||||
damon_ptep_mkold(pte, walk->vma, addr);
|
||||
out:
|
||||
pte_unmap_unlock(pte, ptl);
|
||||
return 0;
|
||||
|
||||
@@ -391,6 +391,8 @@ static int head_onwire_len(int ctrl_len, bool secure)
|
||||
int head_len;
|
||||
int rem_len;
|
||||
|
||||
BUG_ON(ctrl_len < 0 || ctrl_len > CEPH_MSG_MAX_CONTROL_LEN);
|
||||
|
||||
if (secure) {
|
||||
head_len = CEPH_PREAMBLE_SECURE_LEN;
|
||||
if (ctrl_len > CEPH_PREAMBLE_INLINE_LEN) {
|
||||
@@ -409,6 +411,10 @@ static int head_onwire_len(int ctrl_len, bool secure)
|
||||
static int __tail_onwire_len(int front_len, int middle_len, int data_len,
|
||||
bool secure)
|
||||
{
|
||||
BUG_ON(front_len < 0 || front_len > CEPH_MSG_MAX_FRONT_LEN ||
|
||||
middle_len < 0 || middle_len > CEPH_MSG_MAX_MIDDLE_LEN ||
|
||||
data_len < 0 || data_len > CEPH_MSG_MAX_DATA_LEN);
|
||||
|
||||
if (!front_len && !middle_len && !data_len)
|
||||
return 0;
|
||||
|
||||
@@ -521,29 +527,34 @@ static int decode_preamble(void *p, struct ceph_frame_desc *desc)
|
||||
desc->fd_aligns[i] = ceph_decode_16(&p);
|
||||
}
|
||||
|
||||
if (desc->fd_lens[0] < 0 ||
|
||||
desc->fd_lens[0] > CEPH_MSG_MAX_CONTROL_LEN) {
|
||||
pr_err("bad control segment length %d\n", desc->fd_lens[0]);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (desc->fd_lens[1] < 0 ||
|
||||
desc->fd_lens[1] > CEPH_MSG_MAX_FRONT_LEN) {
|
||||
pr_err("bad front segment length %d\n", desc->fd_lens[1]);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (desc->fd_lens[2] < 0 ||
|
||||
desc->fd_lens[2] > CEPH_MSG_MAX_MIDDLE_LEN) {
|
||||
pr_err("bad middle segment length %d\n", desc->fd_lens[2]);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (desc->fd_lens[3] < 0 ||
|
||||
desc->fd_lens[3] > CEPH_MSG_MAX_DATA_LEN) {
|
||||
pr_err("bad data segment length %d\n", desc->fd_lens[3]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* This would fire for FRAME_TAG_WAIT (it has one empty
|
||||
* segment), but we should never get it as client.
|
||||
*/
|
||||
if (!desc->fd_lens[desc->fd_seg_cnt - 1]) {
|
||||
pr_err("last segment empty\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (desc->fd_lens[0] > CEPH_MSG_MAX_CONTROL_LEN) {
|
||||
pr_err("control segment too big %d\n", desc->fd_lens[0]);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (desc->fd_lens[1] > CEPH_MSG_MAX_FRONT_LEN) {
|
||||
pr_err("front segment too big %d\n", desc->fd_lens[1]);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (desc->fd_lens[2] > CEPH_MSG_MAX_MIDDLE_LEN) {
|
||||
pr_err("middle segment too big %d\n", desc->fd_lens[2]);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (desc->fd_lens[3] > CEPH_MSG_MAX_DATA_LEN) {
|
||||
pr_err("data segment too big %d\n", desc->fd_lens[3]);
|
||||
pr_err("last segment empty, segment count %d\n",
|
||||
desc->fd_seg_cnt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
@@ -784,6 +784,16 @@ static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key,
|
||||
TCA_FLOWER_KEY_PORT_SRC_MAX, &mask->tp_range.tp_max.src,
|
||||
TCA_FLOWER_UNSPEC, sizeof(key->tp_range.tp_max.src));
|
||||
|
||||
if (mask->tp_range.tp_min.dst != mask->tp_range.tp_max.dst) {
|
||||
NL_SET_ERR_MSG(extack,
|
||||
"Both min and max destination ports must be specified");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (mask->tp_range.tp_min.src != mask->tp_range.tp_max.src) {
|
||||
NL_SET_ERR_MSG(extack,
|
||||
"Both min and max source ports must be specified");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (mask->tp_range.tp_min.dst && mask->tp_range.tp_max.dst &&
|
||||
ntohs(key->tp_range.tp_max.dst) <=
|
||||
ntohs(key->tp_range.tp_min.dst)) {
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
|
||||
#define QFQ_MTU_SHIFT 16 /* to support TSO/GSO */
|
||||
#define QFQ_MIN_LMAX 512 /* see qfq_slot_insert */
|
||||
#define QFQ_MAX_LMAX (1UL << QFQ_MTU_SHIFT)
|
||||
|
||||
#define QFQ_MAX_AGG_CLASSES 8 /* max num classes per aggregate allowed */
|
||||
|
||||
@@ -214,9 +215,14 @@ static struct qfq_class *qfq_find_class(struct Qdisc *sch, u32 classid)
|
||||
return container_of(clc, struct qfq_class, common);
|
||||
}
|
||||
|
||||
static struct netlink_range_validation lmax_range = {
|
||||
.min = QFQ_MIN_LMAX,
|
||||
.max = QFQ_MAX_LMAX,
|
||||
};
|
||||
|
||||
static const struct nla_policy qfq_policy[TCA_QFQ_MAX + 1] = {
|
||||
[TCA_QFQ_WEIGHT] = { .type = NLA_U32 },
|
||||
[TCA_QFQ_LMAX] = { .type = NLA_U32 },
|
||||
[TCA_QFQ_WEIGHT] = NLA_POLICY_RANGE(NLA_U32, 1, QFQ_MAX_WEIGHT),
|
||||
[TCA_QFQ_LMAX] = NLA_POLICY_FULL_RANGE(NLA_U32, &lmax_range),
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -375,8 +381,13 @@ static int qfq_change_agg(struct Qdisc *sch, struct qfq_class *cl, u32 weight,
|
||||
u32 lmax)
|
||||
{
|
||||
struct qfq_sched *q = qdisc_priv(sch);
|
||||
struct qfq_aggregate *new_agg = qfq_find_agg(q, lmax, weight);
|
||||
struct qfq_aggregate *new_agg;
|
||||
|
||||
/* 'lmax' can range from [QFQ_MIN_LMAX, pktlen + stab overhead] */
|
||||
if (lmax > QFQ_MAX_LMAX)
|
||||
return -EINVAL;
|
||||
|
||||
new_agg = qfq_find_agg(q, lmax, weight);
|
||||
if (new_agg == NULL) { /* create new aggregate */
|
||||
new_agg = kzalloc(sizeof(*new_agg), GFP_ATOMIC);
|
||||
if (new_agg == NULL)
|
||||
@@ -408,27 +419,25 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
|
||||
}
|
||||
|
||||
err = nla_parse_nested_deprecated(tb, TCA_QFQ_MAX, tca[TCA_OPTIONS],
|
||||
qfq_policy, NULL);
|
||||
qfq_policy, extack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (tb[TCA_QFQ_WEIGHT]) {
|
||||
if (tb[TCA_QFQ_WEIGHT])
|
||||
weight = nla_get_u32(tb[TCA_QFQ_WEIGHT]);
|
||||
if (!weight || weight > (1UL << QFQ_MAX_WSHIFT)) {
|
||||
pr_notice("qfq: invalid weight %u\n", weight);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else
|
||||
else
|
||||
weight = 1;
|
||||
|
||||
if (tb[TCA_QFQ_LMAX])
|
||||
if (tb[TCA_QFQ_LMAX]) {
|
||||
lmax = nla_get_u32(tb[TCA_QFQ_LMAX]);
|
||||
else
|
||||
} else {
|
||||
/* MTU size is user controlled */
|
||||
lmax = psched_mtu(qdisc_dev(sch));
|
||||
|
||||
if (lmax < QFQ_MIN_LMAX || lmax > (1UL << QFQ_MTU_SHIFT)) {
|
||||
pr_notice("qfq: invalid max length %u\n", lmax);
|
||||
return -EINVAL;
|
||||
if (lmax < QFQ_MIN_LMAX || lmax > QFQ_MAX_LMAX) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"MTU size out of bounds for qfq");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
inv_w = ONE_FP / weight;
|
||||
|
||||
@@ -4,14 +4,14 @@
|
||||
#include <linux/mm.h> /* for handle_mm_fault() */
|
||||
#include <linux/ftrace.h>
|
||||
|
||||
extern void my_direct_func(struct vm_area_struct *vma,
|
||||
unsigned long address, unsigned int flags);
|
||||
extern void my_direct_func(struct vm_area_struct *vma, unsigned long address,
|
||||
unsigned int flags, struct pt_regs *regs);
|
||||
|
||||
void my_direct_func(struct vm_area_struct *vma,
|
||||
unsigned long address, unsigned int flags)
|
||||
void my_direct_func(struct vm_area_struct *vma, unsigned long address,
|
||||
unsigned int flags, struct pt_regs *regs)
|
||||
{
|
||||
trace_printk("handle mm fault vma=%p address=%lx flags=%x\n",
|
||||
vma, address, flags);
|
||||
trace_printk("handle mm fault vma=%p address=%lx flags=%x regs=%p\n",
|
||||
vma, address, flags, regs);
|
||||
}
|
||||
|
||||
extern void my_tramp(void *);
|
||||
@@ -26,7 +26,9 @@ asm (
|
||||
" pushq %rdi\n"
|
||||
" pushq %rsi\n"
|
||||
" pushq %rdx\n"
|
||||
" pushq %rcx\n"
|
||||
" call my_direct_func\n"
|
||||
" popq %rcx\n"
|
||||
" popq %rdx\n"
|
||||
" popq %rsi\n"
|
||||
" popq %rdi\n"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user