Linux 5.15.200
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.200 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/RCU/Design/Requirements/Requirements.rst | 2 Documentation/core-api/local_ops.rst | 2 Documentation/kernel-hacking/locking.rst | 17 Documentation/timers/hrtimers.rst | 2 Documentation/translations/it_IT/kernel-hacking/locking.rst | 14 Documentation/translations/zh_CN/core-api/local_ops.rst | 2 Makefile | 2 arch/arm/include/asm/string.h | 5 arch/arm/mach-spear/time.c | 8 arch/riscv/include/asm/cacheflush.h | 15 arch/riscv/kernel/probes/uprobes.c | 10 arch/x86/include/asm/kfence.h | 7 block/bfq-cgroup.c | 2 drivers/android/binderfs.c | 8 drivers/block/rbd.c | 33 - drivers/bluetooth/hci_qca.c | 10 drivers/char/tpm/tpm-dev-common.c | 4 drivers/clocksource/arm_arch_timer.c | 12 drivers/clocksource/timer-sp804.c | 6 drivers/hid/hid-ids.h | 4 drivers/hid/hid-multitouch.c | 1 drivers/hid/hid-playstation.c | 5 drivers/hid/hid-quirks.c | 2 drivers/hid/intel-ish-hid/ishtp-hid-client.c | 1 drivers/hwmon/occ/common.c | 1 drivers/iommu/iommu.c | 3 drivers/net/ethernet/cavium/liquidio/lio_main.c | 39 - drivers/net/ethernet/cavium/liquidio/lio_vf_main.c | 4 drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c | 10 drivers/net/ethernet/google/gve/gve_ethtool.c | 46 + drivers/net/ethernet/google/gve/gve_main.c | 4 drivers/net/macvlan.c | 5 drivers/net/usb/sr9700.c | 5 drivers/net/wireless/ti/wlcore/tx.c | 5 drivers/nvme/target/tcp.c | 100 +-- drivers/platform/x86/intel/telemetry/debugfs.c | 4 drivers/platform/x86/intel/telemetry/pltdrv.c | 2 drivers/platform/x86/toshiba_haps.c | 2 drivers/spi/spi-tegra20-slink.c | 6 drivers/spi/spi-tegra210-quad.c | 36 + drivers/staging/wlan-ng/hfa384x_usb.c | 4 drivers/staging/wlan-ng/prism2usb.c | 6 drivers/target/iscsi/iscsi_target_util.c | 10 fs/gfs2/log.c | 3 fs/gfs2/super.c | 4 fs/hfsplus/dir.c | 2 fs/hfsplus/hfsplus_fs.h | 8 fs/hfsplus/unicode.c | 24 fs/hfsplus/xattr.c | 6 fs/ksmbd/smb2pdu.c | 5 include/linux/timer.h | 17 kernel/time/timer.c | 318 +++++++++--- kernel/trace/ring_buffer.c | 2 kernel/trace/trace.h | 7 kernel/trace/trace_entries.h | 14 kernel/trace/trace_export.c | 21 mm/kfence/core.c | 25 net/bluetooth/hci_event.c | 3 net/bridge/netfilter/ebtables.c | 2 net/mac80211/key.c | 3 net/mac80211/ocb.c | 3 net/mac80211/sta_info.c | 7 net/netfilter/nf_log.c | 4 net/netfilter/nf_tables_api.c | 2 net/netfilter/nft_set_pipapo.c | 8 net/netfilter/x_tables.c | 2 net/sunrpc/xprt.c | 2 net/tipc/crypto.c | 4 net/wireless/util.c | 8 sound/pci/hda/patch_realtek.c | 1 sound/soc/amd/renoir/acp3x-pdm-dma.c | 2 sound/soc/codecs/tlv320adcx140.c | 3 sound/soc/ti/davinci-evm.c | 39 + virt/kvm/eventfd.c | 44 - 74 files changed, 743 insertions(+), 316 deletions(-)
Andreas Gruenbacher (1):
gfs2: Fix NULL pointer dereference in gfs2_log_flush
Andrew Cooper (1):
x86/kfence: fix booting on 32bit non-PAE systems
Andrew Fasano (1):
netfilter: nf_tables: fix inverted genmask check in nft_map_catchall_activate()
Arnd Bergmann (1):
hwmon: (occ) Mark occ_init_attribute() as __printf
Baochen Qiang (1):
wifi: mac80211: collect station statistics earlier when disconnect
Björn Töpel (2):
riscv: uprobes: Add missing fence.i after building the XOL buffer
riscv: Replace function-like macro by static inline function
Breno Leitao (5):
spi: tegra210-quad: Return IRQ_HANDLED when timeout already processed transfer
spi: tegra210-quad: Move curr_xfer read inside spinlock
spi: tegra210-quad: Protect curr_xfer assignment in tegra_qspi_setup_transfer_one
spi: tegra210-quad: Protect curr_xfer in tegra_qspi_combined_seq_xfer
spi: tegra210-quad: Protect curr_xfer clearing in tegra_qspi_non_combined_seq_xfer
Carlos Llamas (1):
binderfs: fix ida_alloc_max() upper bound
Chris Bainbridge (1):
ASoC: amd: fix memory leak in acp3x pdm dma ops
Chris Chiu (1):
HID: quirks: Add another Chicony HP 5MP Cameras to hid_ignore_list
Daniel Gomez (1):
netfilter: replace -EEXIST with -EBUSY
Daniel Hodges (1):
tipc: use kfree_sensitive() for session key material
DaytonCL (1):
HID: multitouch: add MT_QUIRK_STICKY_FINGERS to MT_CLS_VTL
Debarghya Kundu (1):
gve: Fix stats report corruption on queue count change
Dimitrios Katsaros (1):
ASoC: tlv320adcx140: Propagate error codes during probe
Eric Dumazet (1):
macvlan: fix error recovery in macvlan_common_newlink()
Ethan Nelson-Moore (1):
net: usb: sr9700: support devices with virtual driver CD
Fabio M. De Francesco (1):
nvmet-tcp: don't map pages which can't come from HIGHMEM
Felix Gu (1):
spi: tegra: Fix a memory leak in tegra_slink_probe()
Greg Kroah-Hartman (1):
Linux 5.15.200
Ilya Dryomov (1):
rbd: check for EOD after exclusive lock is ensured to be held
Junrui Luo (2):
dpaa2-switch: prevent ZERO_SIZE_PTR dereference when num_ifs is zero
dpaa2-switch: add bounds check for if_id in IRQ handler
Kang Chen (1):
hfsplus: fix slab-out-of-bounds read in hfsplus_uni2asc()
Kaushlendra Kumar (2):
platform/x86: intel_telemetry: Fix swapped arrays in PSS output platform/x86: intel_telemetry: Fix PSS event register mask
Kery Qi (1):
ASoC: davinci-evm: Fix reference leak in davinci_evm_probe
Lu Baolu (1):
iommu: disable SVA when CONFIG_X86 is set
Maurizio Lombardi (4):
scsi: target: iscsi: Fix use-after-free in iscsit_dec_session_usage_count()
scsi: target: iscsi: Fix use-after-free in iscsit_dec_conn_usage_count()
nvmet-tcp: add an helper to free the cmd buffers
nvmet-tcp: fix memory leak when performing a controller reset
Max Yuan (1):
gve: Correct ethtool rx_dropped calculation
Miri Korenblit (1):
wifi: mac80211: don't increment crypto_tx_tailroom_needed_cnt twice
Moon Hee Lee (1):
wifi: mac80211: ocb: skip rx_no_sta when interface is not joined
Pablo Neira Ayuso (1):
netfilter: nft_set_pipapo: clamp maximum map bucket size to INT_MAX
Pauli Virtanen (1):
Bluetooth: hci_event: call disconnect callback before deleting conn
Peter Åstrand (1):
wifi: wlcore: ensure skb headroom before skb_push
Pimyn Girgis (1):
mm/kfence: randomize the freelist on initialization
Rafael J. Wysocki (1):
platform/x86: toshiba_haps: Fix memory leaks in add/remove routines
Rodrigo Lugathe da Conceição Alves (1):
HID: Apply quirk HID_QUIRK_ALWAYS_POLL to Edifier QR30 (2d99:a101)
Ruslan Krupitsa (1):
ALSA: hda/realtek: add HP Laptop 15s-eq1xxx mute LED quirk
Sagi Grimberg (1):
nvmet-tcp: fix regression in data_digest calculation
Sean Christopherson (1):
KVM: Don't clobber irqfd routing type when deassigning irqfd
Siarhei Vishniakou (1):
HID: playstation: Center initial joystick axes to prevent spurious events
Steven Rostedt (1):
tracing: Fix ftrace event field alignments
Steven Rostedt (Google) (4):
ARM: spear: Do not use timer namespace for timer_shutdown() function clocksource/drivers/arm_arch_timer: Do not use timer namespace for timer_shutdown() function clocksource/drivers/sp804: Do not use timer namespace for timer_shutdown() function
timers: Update the documentation to reflect on the new timer_shutdown() API
Thomas Gleixner (10):
Documentation: Remove bogus claim about del_timer_sync()
timers: Get rid of del_singleshot_timer_sync()
timers: Replace BUG_ON()s
timers: Rename del_timer() to timer_delete()
Documentation: Replace del_timer/del_timer_sync()
timers: Silently ignore timers with a NULL function
timers: Split [try_to_]del_timer[_sync]() to prepare for shutdown mode
timers: Add shutdown mechanism to the internal functions
timers: Provide timer_shutdown[_sync]()
Bluetooth: hci_qca: Fix the teardown problem for real
Thomas Weissschuh (1):
ARM: 9468/1: fix memset64() on big-endian
Varun Prakash (1):
nvmet-tcp: pass iov_len instead of sg->length to bvec_set_page()
Veerendranath Jakkam (1):
wifi: cfg80211: Fix bitrate calculation overflow for HE rates
Wupeng Ma (1):
ring-buffer: Avoid softlockup in ring_buffer_resize() during memory free
Yipeng Zou (1):
timers: Fix NULL function pointer race in timer_shutdown_sync()
YunJe Shin (1):
nvmet-tcp: add bounds checks in nvmet_tcp_build_pdu_iovec
Zhang Lixu (1):
HID: intel-ish-hid: Reset enum_devices_done before enumeration
ZhangGuoDong (1):
smb/server: call ksmbd_session_rpc_close() on error path in create_smb2_pipe()
Zilin Guan (3):
net: liquidio: Initialize netdev pointer before queue setup
net: liquidio: Fix off-by-one error in PF setup_nic_devices() cleanup
net: liquidio: Fix off-by-one error in VF setup_nic_devices() cleanup
shechenglong (1):
block,bfq: fix aux stat accumulation destination
Greg Kroah-Hartman
maintainerDocumentation/RCU/Design/Requirements/Requirements.rst +1 -1
@@ -1858,7 +1858,7 @@ unloaded. After a given module has been unloaded, any attempt to call one of its functions results in a segmentation fault. The module-unload functions must therefore cancel any delayed calls to loadable-module functions, for example, any outstanding mod_timer() must be dealt -with via del_timer_sync() or similar. +with via timer_shutdown_sync() or similar. Unfortunately, there is no way to cancel an RCU callback; once you invoke call_rcu(), the callback function is eventually going to be
Documentation/core-api/local_ops.rst +1 -1
@@ -191,7 +191,7 @@ Here is a sample module which implements a basic per cpu counter using static void __exit test_exit(void) { - del_timer_sync(&test_timer); + timer_shutdown_sync(&test_timer); } module_init(test_init);
Documentation/kernel-hacking/locking.rst +10 -7
@@ -970,7 +970,7 @@ you might do the following:: while (list) { struct foo *next = list->next; - del_timer(&list->timer); + timer_delete(&list->timer); kfree(list); list = next; }
@@ -984,7 +984,7 @@ the lock after we spin_unlock_bh(), and then try to free the element (which has already been freed!). This can be avoided by checking the result of -del_timer(): if it returns 1, the timer has been deleted. +timer_delete(): if it returns 1, the timer has been deleted. If 0, it means (in this case) that it is currently running, so we can do::
@@ -993,7 +993,7 @@ do:: while (list) { struct foo *next = list->next; - if (!del_timer(&list->timer)) { + if (!timer_delete(&list->timer)) { /* Give timer a chance to delete this */ spin_unlock_bh(&list_lock); goto retry;
@@ -1008,9 +1008,12 @@ do:: Another common problem is deleting timers which restart themselves (by calling add_timer() at the end of their timer function). Because this is a fairly common case which is prone to races, you should -use del_timer_sync() (``include/linux/timer.h``) to -handle this case. It returns the number of times the timer had to be -deleted before we finally stopped it from adding itself back in. +use timer_delete_sync() (``include/linux/timer.h``) to + +Before freeing a timer, timer_shutdown() or timer_shutdown_sync() should be +called which will keep it from being rearmed. Any subsequent attempt to +rearm the timer will be silently ignored by the core code. + Locking Speed =============
@@ -1338,7 +1341,7 @@ lock. - kfree() -- add_timer() and del_timer() +- add_timer() and timer_delete() Mutex API reference ===================
Documentation/timers/hrtimers.rst +1 -1
@@ -118,7 +118,7 @@ existing timer wheel code, as it is mature and well suited. Sharing code was not really a win, due to the different data structures. Also, the hrtimer functions now have clearer behavior and clearer names - such as hrtimer_try_to_cancel() and hrtimer_cancel() [which are roughly -equivalent to del_timer() and del_timer_sync()] - so there's no direct +equivalent to timer_delete() and timer_delete_sync()] - so there's no direct 1:1 mapping between them on the algorithmic level, and thus no real potential for code sharing either.
Documentation/translations/it_IT/kernel-hacking/locking.rst +6 -8
@@ -998,7 +998,7 @@ potreste fare come segue:: while (list) { struct foo *next = list->next; - del_timer(&list->timer); + timer_delete(&list->timer); kfree(list); list = next; }
@@ -1011,7 +1011,7 @@ e prenderà il *lock* solo dopo spin_unlock_bh(), e cercherà di eliminare il suo oggetto (che però è già stato eliminato). Questo può essere evitato controllando il valore di ritorno di -del_timer(): se ritorna 1, il temporizzatore è stato già +timer_delete(): se ritorna 1, il temporizzatore è stato già rimosso. Se 0, significa (in questo caso) che il temporizzatore è in esecuzione, quindi possiamo fare come segue::
@@ -1020,7 +1020,7 @@ esecuzione, quindi possiamo fare come segue:: while (list) { struct foo *next = list->next; - if (!del_timer(&list->timer)) { + if (!timer_delete(&list->timer)) { /* Give timer a chance to delete this */ spin_unlock_bh(&list_lock); goto retry;
@@ -1034,10 +1034,8 @@ esecuzione, quindi possiamo fare come segue:: Un altro problema è l'eliminazione dei temporizzatori che si riavviano da soli (chiamando add_timer() alla fine della loro esecuzione). Dato che questo è un problema abbastanza comune con una propensione -alle corse critiche, dovreste usare del_timer_sync() -(``include/linux/timer.h``) per gestire questo caso. Questa ritorna il -numero di volte che il temporizzatore è stato interrotto prima che -fosse in grado di fermarlo senza che si riavviasse. +alle corse critiche, dovreste usare timer_delete_sync() +(``include/linux/timer.h``) per gestire questo caso. Velocità della sincronizzazione ===============================
@@ -1382,7 +1380,7 @@ contesto, o trattenendo un qualsiasi *lock*. - kfree() -- add_timer() e del_timer() +- add_timer() e timer_delete() Riferimento per l'API dei Mutex ===============================
Documentation/translations/zh_CN/core-api/local_ops.rst +1 -1
@@ -185,7 +185,7 @@ UP之间没有不同的行为,在你的架构的 ``local.h`` 中包括 ``asm-g static void __exit test_exit(void) { - del_timer_sync(&test_timer); + timer_shutdown_sync(&test_timer); } module_init(test_init);
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 199 +SUBLEVEL = 200 EXTRAVERSION = NAME = Trick or Treat
arch/arm/include/asm/string.h +4 -1
@@ -42,7 +42,10 @@ static inline void *memset32(uint32_t *p, uint32_t v, __kernel_size_t n)extern void *__memset64 (uint64_t *,uint32_t low,__kernel_size_t ,uint32_t hi);static inline void *memset64 (uint64_t *p,uint64_t v,__kernel_size_t n) { -return __memset64 (p, v, n *8 , v >>32 ); +if (IS_ENABLED (CONFIG_CPU_LITTLE_ENDIAN )) +return __memset64 (p, v, n *8 , v >>32 ); +else +return __memset64 (p, v >>32 , n *8 , v); }/*
arch/arm/mach-spear/time.c +4 -4
@@ -90,7 +90,7 @@ static void __init spear_clocksource_init(void) 200, 16, clocksource_mmio_readw_up); } -static inline void timer_shutdown (struct clock_event_device *evt) +static inline void spear_timer_shutdown (struct clock_event_device *evt) {u16 val =readw (gpt_base +CR (CLKEVT ));
@@ -101,7 +101,7 @@ static inline void timer_shutdown(struct clock_event_device *evt)static int spear_shutdown (struct clock_event_device *evt) { -timer_shutdown (evt); +spear_timer_shutdown (evt);return 0 ; }
@@ -111,7 +111,7 @@ static int spear_set_oneshot(struct clock_event_device *evt)u16 val;/* stop the timer */ -timer_shutdown (evt); +spear_timer_shutdown (evt); val =readw (gpt_base +CR (CLKEVT )); val |=CTRL_ONE_SHOT ;
@@ -126,7 +126,7 @@ static int spear_set_periodic(struct clock_event_device *evt)u16 val;/* stop the timer */ -timer_shutdown (evt); +spear_timer_shutdown (evt); period =clk_get_rate (gpt_clk) /HZ ; period >>=CTRL_PRESCALER16 ;
arch/riscv/include/asm/cacheflush.h +10 -5
@@ -22,11 +22,6 @@ static inline void flush_dcache_page(struct page *page) }#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1 -/* -* RISC-V doesn't have an instruction to flush parts of the instruction cache, -* so instead we just flush the whole thing. -*/ -#define flush_icache_range (start, end) flush_icache_all()#define flush_icache_user_page (vma, pg, addr, len) \ flush_icache_mm(vma->vm_mm, 0)
@@ -42,6 +37,16 @@ void flush_icache_mm(struct mm_struct *mm, bool local);#endif /* CONFIG_SMP */ +/* +* RISC-V doesn't have an instruction to flush parts of the instruction cache, +* so instead we just flush the whole thing. +*/ +#define flush_icache_range flush_icache_range +static inline void flush_icache_range (unsigned long start,unsigned long end) +{ +flush_icache_all (); +} +/* * Bits in sys_riscv_flush_icache()'s flags argument. */
arch/riscv/kernel/probes/uprobes.c +2 -8
@@ -161,6 +161,7 @@ void arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr,/* Initialize the slot */ void *kaddr =kmap_atomic (page);void *dst = kaddr + (vaddr & ~PAGE_MASK ); +unsigned long start = (unsigned long )dst;memcpy (dst, src, len);
@@ -170,13 +171,6 @@ void arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr, *(uprobe_opcode_t *)dst = __BUG_INSN_32; } +flush_icache_range (start, start + len);kunmap_atomic (kaddr); - -/* -* We probably need flush_icache_user_page() but it needs vma. -* This should work on most of architectures by default. If -* architecture needs to do something different it can define -* its own version of the function. -*/ -flush_dcache_page (page); }
arch/x86/include/asm/kfence.h +4 -3
@@ -42,7 +42,7 @@ static inline bool kfence_protect_page(unsigned long addr, bool protect) {unsigned int level;pte_t *pte =lookup_address (addr, &level); -pteval_t val; +pteval_t val, new;if (WARN_ON (!pte || level !=PG_LEVEL_4K ))return false;
@@ -57,11 +57,12 @@ static inline bool kfence_protect_page(unsigned long addr, bool protect)return true;/* -* Otherwise, invert the entire PTE. This avoids writing out an +* Otherwise, flip the Present bit, taking care to avoid writing an * L1TF-vulnerable PTE (not present, without the high address bits * set). */ -set_pte (pte,__pte (~val)); + new = val ^ _PAGE_PRESENT; +set_pte (pte,__pte (flip_protnone_guard (val, new,PTE_PFN_MASK )));/* * If the page was protected (non-present) and we're making it
block/bfq-cgroup.c +1 -1
@@ -387,7 +387,7 @@ static void bfqg_stats_add_aux(struct bfqg_stats *to, struct bfqg_stats *from)blkg_rwstat_add_aux (&to->merged, &from->merged);blkg_rwstat_add_aux (&to->service_time, &from->service_time);blkg_rwstat_add_aux (&to->wait_time, &from->wait_time); -bfq_stat_add_aux (&from->time, &from->time); +bfq_stat_add_aux (&to->time, &from->time);bfq_stat_add_aux (&to->avg_queue_size_sum, &from->avg_queue_size_sum);bfq_stat_add_aux (&to->avg_queue_size_samples, &from->avg_queue_size_samples);
drivers/android/binderfs.c +4 -4
@@ -130,8 +130,8 @@ static int binderfs_binder_device_create(struct inode *ref_inode,mutex_lock (&binderfs_minors_mutex);if (++info->device_count <= info->mount_opts.max) minor =ida_alloc_max (&binderfs_minors, - use_reserve ?BINDERFS_MAX_MINOR : -BINDERFS_MAX_MINOR_CAPPED , + use_reserve ?BINDERFS_MAX_MINOR -1 : +BINDERFS_MAX_MINOR_CAPPED -1 ,GFP_KERNEL );else minor = -ENOSPC ;
@@ -433,8 +433,8 @@ static int binderfs_binder_ctl_create(struct super_block *sb)/* Reserve a new minor number for the new device. */ mutex_lock (&binderfs_minors_mutex); minor =ida_alloc_max (&binderfs_minors, - use_reserve ?BINDERFS_MAX_MINOR : -BINDERFS_MAX_MINOR_CAPPED , + use_reserve ?BINDERFS_MAX_MINOR -1 : +BINDERFS_MAX_MINOR_CAPPED -1 ,GFP_KERNEL );mutex_unlock (&binderfs_minors_mutex);if (minor <0 ) {
drivers/block/rbd.c +21 -12
@@ -3497,11 +3497,29 @@ static void rbd_img_object_requests(struct rbd_img_request *img_req)rbd_assert (!need_exclusive_lock (img_req) ||__rbd_is_lock_owner (rbd_dev)); -if (rbd_img_is_write (img_req)) { -rbd_assert (!img_req->snapc); +if (test_bit (IMG_REQ_CHILD , &img_req->flags)) { +rbd_assert (!rbd_img_is_write (img_req)); + }else { +struct request *rq =blk_mq_rq_from_pdu (img_req); +u64 off = (u64 )blk_rq_pos (rq) <<SECTOR_SHIFT ; +u64 len =blk_rq_bytes (rq); +u64 mapping_size; +down_read (&rbd_dev->header_rwsem); - img_req->snapc =ceph_get_snap_context (rbd_dev->header.snapc); + mapping_size = rbd_dev->mapping.size; +if (rbd_img_is_write (img_req)) { +rbd_assert (!img_req->snapc); + img_req->snapc = +ceph_get_snap_context (rbd_dev->header.snapc); + }up_read (&rbd_dev->header_rwsem); + +if (unlikely (off + len > mapping_size)) { +rbd_warn (rbd_dev,"beyond EOD (%llu~%llu > %llu)" , + off, len, mapping_size); + img_req->pending.result = -EIO ; +return ; + } }for_each_obj_request (img_req, obj_req) {
@@ -4727,7 +4745,6 @@ static void rbd_queue_workfn(struct work_struct *work)struct request *rq =blk_mq_rq_from_pdu (img_request);u64 offset = (u64 )blk_rq_pos (rq) <<SECTOR_SHIFT ;u64 length =blk_rq_bytes (rq); -u64 mapping_size;int result;/* Ignore/skip any zero-length requests */
@@ -4740,17 +4757,9 @@ static void rbd_queue_workfn(struct work_struct *work)blk_mq_start_request (rq);down_read (&rbd_dev->header_rwsem); - mapping_size = rbd_dev->mapping.size;rbd_img_capture_header (img_request);up_read (&rbd_dev->header_rwsem); -if (offset + length > mapping_size) { -rbd_warn (rbd_dev,"beyond EOD (%llu~%llu > %llu)" , offset, - length, mapping_size); - result = -EIO ; - goto err_img_request; - } -dout ("%s rbd_dev %p img_req %p %s %llu~%llu\n" , __func__, rbd_dev, img_request,obj_op_name (op_type), offset, length);
drivers/bluetooth/hci_qca.c +8 -2
@@ -709,9 +709,15 @@ static int qca_close(struct hci_uart *hu)skb_queue_purge (&qca->tx_wait_q);skb_queue_purge (&qca->txq);skb_queue_purge (&qca->rx_memdump_q); +/* +* Shut the timers down so they can't be rearmed when +* destroy_workqueue() drains pending work which in turn might try +* to arm a timer. After shutdown rearm attempts are silently +* ignored by the timer core code. +*/ +timer_shutdown_sync (&qca->tx_idle_timer); +timer_shutdown_sync (&qca->wake_retrans_timer);destroy_workqueue (qca->workqueue); -del_timer_sync (&qca->tx_idle_timer); -del_timer_sync (&qca->wake_retrans_timer); qca->hu =NULL ;kfree_skb (qca->rx_skb);
drivers/char/tpm/tpm-dev-common.c +2 -2
@@ -157,7 +157,7 @@ ssize_t tpm_common_read(struct file *file, char __user *buf, out:if (!priv->response_length) { *off =0 ; -del_singleshot_timer_sync (&priv->user_read_timer); +del_timer_sync (&priv->user_read_timer);flush_work (&priv->timeout_work); }mutex_unlock (&priv->buffer_mutex);
@@ -264,7 +264,7 @@ __poll_t tpm_common_poll(struct file *file, poll_table *wait)void tpm_common_release (struct file *file,struct file_priv *priv) {flush_work (&priv->async_work); -del_singleshot_timer_sync (&priv->user_read_timer); +del_timer_sync (&priv->user_read_timer);flush_work (&priv->timeout_work); file->private_data =NULL ; priv->response_length =0 ;
drivers/clocksource/arm_arch_timer.c +6 -6
@@ -691,8 +691,8 @@ static irqreturn_t arch_timer_handler_virt_mem(int irq, void *dev_id)return timer_handler (ARCH_TIMER_MEM_VIRT_ACCESS , evt); } -static __always_inline int timer_shutdown(const int access, -struct clock_event_device *clk) +static __always_inline int arch_timer_shutdown(const int access, +struct clock_event_device *clk) {unsigned long ctrl;
@@ -705,22 +705,22 @@ static __always_inline int timer_shutdown(const int access,static int arch_timer_shutdown_virt (struct clock_event_device *clk) { -return timer_shutdown (ARCH_TIMER_VIRT_ACCESS , clk); +return arch_timer_shutdown (ARCH_TIMER_VIRT_ACCESS , clk); }static int arch_timer_shutdown_phys (struct clock_event_device *clk) { -return timer_shutdown (ARCH_TIMER_PHYS_ACCESS , clk); +return arch_timer_shutdown (ARCH_TIMER_PHYS_ACCESS , clk); }static int arch_timer_shutdown_virt_mem (struct clock_event_device *clk) { -return timer_shutdown (ARCH_TIMER_MEM_VIRT_ACCESS , clk); +return arch_timer_shutdown (ARCH_TIMER_MEM_VIRT_ACCESS , clk); }static int arch_timer_shutdown_phys_mem (struct clock_event_device *clk) { -return timer_shutdown (ARCH_TIMER_MEM_PHYS_ACCESS , clk); +return arch_timer_shutdown (ARCH_TIMER_MEM_PHYS_ACCESS , clk); } static __always_inline void set_next_event(const int access, unsigned long evt,
drivers/clocksource/timer-sp804.c +3 -3
@@ -155,14 +155,14 @@ static irqreturn_t sp804_timer_interrupt(int irq, void *dev_id)return IRQ_HANDLED ; } -static inline void timer_shutdown (struct clock_event_device *evt) +static inline void evt_timer_shutdown (struct clock_event_device *evt) {writel (0 , common_clkevt->ctrl); }static int sp804_shutdown (struct clock_event_device *evt) { -timer_shutdown (evt); +evt_timer_shutdown (evt);return 0 ; }
@@ -171,7 +171,7 @@ static int sp804_set_periodic(struct clock_event_device *evt)unsigned long ctrl =TIMER_CTRL_32BIT |TIMER_CTRL_IE |TIMER_CTRL_PERIODIC |TIMER_CTRL_ENABLE ; -timer_shutdown (evt); +evt_timer_shutdown (evt);writel (common_clkevt->reload, common_clkevt->load);writel (ctrl, common_clkevt->ctrl);return 0 ;
drivers/hid/hid-ids.h +4 -0
@@ -285,6 +285,7 @@#define USB_DEVICE_ID_CHICONY_ACER_SWITCH12 0x1421#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA 0xb824#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2 0xb82c +#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA3 0xb882#define USB_VENDOR_ID_CHUNGHWAT 0x2247#define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001
@@ -400,6 +401,9 @@#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001 0xa001#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_C002 0xc002 +#define USB_VENDOR_ID_EDIFIER 0x2d99 +#define USB_DEVICE_ID_EDIFIER_QR30 0xa101/* EDIFIER Hal0 2.0 SE */ +#define USB_VENDOR_ID_ELAN 0x04f3#define USB_DEVICE_ID_TOSHIBA_CLICK_L9W 0x0401#define USB_DEVICE_ID_HP_X2 0x074d
drivers/hid/hid-multitouch.c +1 -0
@@ -379,6 +379,7 @@ static const struct mt_class mt_classes[] = { { .name = MT_CLS_VTL, .quirks = MT_QUIRK_ALWAYS_VALID | MT_QUIRK_CONTACT_CNT_ACCURATE | + MT_QUIRK_STICKY_FINGERS | MT_QUIRK_FORCE_GET_FEATURE, }, { .name = MT_CLS_GOOGLE,
drivers/hid/hid-playstation.c +5 -0
@@ -463,11 +463,16 @@ static struct input_dev *ps_gamepad_create(struct hid_device *hdev,if (IS_ERR (gamepad))return ERR_CAST (gamepad); +/* Set initial resting state for joysticks to 128 (center) */ input_set_abs_params (gamepad,ABS_X ,0 ,255 ,0 ,0 ); + gamepad->absinfo[ABS_X ].value =128 ;input_set_abs_params (gamepad,ABS_Y ,0 ,255 ,0 ,0 ); + gamepad->absinfo[ABS_Y ].value =128 ;input_set_abs_params (gamepad,ABS_Z ,0 ,255 ,0 ,0 );input_set_abs_params (gamepad,ABS_RX ,0 ,255 ,0 ,0 ); + gamepad->absinfo[ABS_RX ].value =128 ;input_set_abs_params (gamepad,ABS_RY ,0 ,255 ,0 ,0 ); + gamepad->absinfo[ABS_RY ].value =128 ;input_set_abs_params (gamepad,ABS_RZ ,0 ,255 ,0 ,0 );input_set_abs_params (gamepad,ABS_HAT0X ,-1 ,1 ,0 ,0 );
drivers/hid/hid-quirks.c +2 -0
@@ -81,6 +81,7 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_PS3), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_WIIU), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER), HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET }, + { HID_USB_DEVICE(USB_VENDOR_ID_EDIFIER, USB_DEVICE_ID_EDIFIER_QR30), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II), HID_QUIRK_MULTI_INPUT },
@@ -740,6 +741,7 @@ static const struct hid_device_id hid_ignore_list[] = { { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA) }, { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2) }, + { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA3) }, { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI4713) },
drivers/hid/intel-ish-hid/ishtp-hid-client.c +1 -0
@@ -493,6 +493,7 @@ static int ishtp_enum_enum_devices(struct ishtp_cl *hid_ishtp_cl)int rv;/* Send HOSTIF_DM_ENUM_DEVICES */ + client_data->enum_devices_done = false;memset (&msg,0 ,sizeof (struct hostif_msg )); msg.hdr.command =HOSTIF_DM_ENUM_DEVICES ; rv = ishtp_cl_send(hid_ishtp_cl, (unsigned char *)&msg,
drivers/hwmon/occ/common.c +1 -0
@@ -752,6 +752,7 @@ static ssize_t occ_show_extended(struct device *dev,* are dynamically allocated, we cannot use the existing kernel macros which * stringify the name argument. */ +__printf(7, 8) static void occ_init_attribute(struct occ_attribute *attr, int mode, ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf), ssize_t (*store)(struct device *dev, struct device_attribute *attr,
drivers/iommu/iommu.c +3 -0
@@ -3068,6 +3068,9 @@ iommu_sva_bind_device(struct device *dev, struct mm_struct *mm, void *drvdata)if (!group)return ERR_PTR (-ENODEV ); +if (IS_ENABLED (CONFIG_X86 )) +return ERR_PTR (-EOPNOTSUPP ); +/* Ensure device count and domain don't change while we're binding */ mutex_lock (&group->mutex);
drivers/net/ethernet/cavium/liquidio/lio_main.c +20 -19
@@ -3529,6 +3529,23 @@ static int setup_nic_devices(struct octeon_device *octeon_dev)*/ netdev->netdev_ops = &lionetdevops; + lio =GET_LIO (netdev); + +memset (lio,0 ,sizeof (struct lio )); + + lio->ifidx = ifidx_or_pfnum; + + props = &octeon_dev->props[i]; + props->gmxport = resp->cfg_info.linfo.gmxport; + props->netdev = netdev; + +/* Point to the properties for octeon device to which this +* interface belongs. +*/ + lio->oct_dev = octeon_dev; + lio->octprops = props; + lio->netdev = netdev; + retval =netif_set_real_num_rx_queues (netdev, num_oqueues);if (retval) { dev_err(&octeon_dev->pci_dev->dev,
@@ -3545,16 +3562,6 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) goto setup_nic_dev_free; } - lio =GET_LIO (netdev); - -memset (lio,0 ,sizeof (struct lio )); - - lio->ifidx = ifidx_or_pfnum; - - props = &octeon_dev->props[i]; - props->gmxport = resp->cfg_info.linfo.gmxport; - props->netdev = netdev; - lio->linfo.num_rxpciq = num_oqueues; lio->linfo.num_txpciq = num_iqueues;for (j =0 ; j < num_oqueues; j++) {
@@ -3620,13 +3627,6 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) netdev->min_mtu =LIO_MIN_MTU_SIZE ; netdev->max_mtu =LIO_MAX_MTU_SIZE ; -/* Point to the properties for octeon device to which this -* interface belongs. -*/ - lio->oct_dev = octeon_dev; - lio->octprops = props; - lio->netdev = netdev; -dev_dbg (&octeon_dev->pci_dev->dev,"if%d gmx: %d hw_addr: 0x%llx\n" , i, lio->linfo.gmxport,CVM_CAST64 (lio->linfo.hw_addr));
@@ -3772,6 +3772,7 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) &octeon_dev->pci_dev->dev);if (!devlink) {dev_err (&octeon_dev->pci_dev->dev,"devlink alloc failed\n" ); + i--; goto setup_nic_dev_free; }
@@ -3792,11 +3793,11 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) setup_nic_dev_free: -while (i--) { +do {dev_err (&octeon_dev->pci_dev->dev,"NIC ifidx:%d Setup failed\n" , i);liquidio_destroy_nic_device (octeon_dev, i); - } + }while (i--); setup_nic_dev_done:
drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +2 -2
@@ -2230,11 +2230,11 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) setup_nic_dev_free: -while (i--) { +do {dev_err (&octeon_dev->pci_dev->dev,"NIC ifidx:%d Setup failed\n" , i);liquidio_destroy_nic_device (octeon_dev, i); - } + }while (i--); setup_nic_dev_done:
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +10 -0
@@ -1509,6 +1509,10 @@ static irqreturn_t dpaa2_switch_irq0_handler_thread(int irq_num, void *arg) } if_id = (status &0xFFFF0000 ) >>16 ; +if (if_id >= ethsw->sw_attr.num_ifs) { +dev_err (dev,"Invalid if_id %d in IRQ status\n" , if_id); + goto out; + } port_priv = ethsw->ports[if_id];if (status &DPSW_IRQ_EVENT_LINK_CHANGED ) {
@@ -2972,6 +2976,12 @@ static int dpaa2_switch_init(struct fsl_mc_device *sw_dev) goto err_close; } +if (!ethsw->sw_attr.num_ifs) { +dev_err (dev,"DPSW device has no interfaces\n" ); + err = -ENODEV ; + goto err_close; + } + err =dpsw_get_api_version (ethsw->mc_io,0 , ðsw->major, ðsw->minor);
drivers/net/ethernet/google/gve/gve_ethtool.c +30 -16
79 lines not on this page · raw message
drivers/net/ethernet/google/gve/gve_main.c +2 -2
@@ -135,9 +135,9 @@ static int gve_alloc_stats_report(struct gve_priv *priv)int tx_stats_num, rx_stats_num; tx_stats_num = (GVE_TX_STATS_REPORT_NUM +NIC_TX_STATS_REPORT_NUM ) * - priv->tx_cfg.num_queues; + priv->tx_cfg.max_queues; rx_stats_num = (GVE_RX_STATS_REPORT_NUM +NIC_RX_STATS_REPORT_NUM ) * - priv->rx_cfg.num_queues; + priv->rx_cfg.max_queues; priv->stats_report_len =struct_size (priv->stats_report, stats,size_add (tx_stats_num, rx_stats_num)); priv->stats_report =
drivers/net/macvlan.c +3 -2
@@ -1527,9 +1527,10 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,/* the macvlan port may be freed by macvlan_uninit when fail to register. * so we destroy the macvlan port only when it's valid. */ -if (create &&macvlan_port_get_rtnl (lowerdev)) { +if (macvlan_port_get_rtnl (lowerdev)) {macvlan_flush_sources (port, vlan); -macvlan_port_destroy (port->dev); +if (create) +macvlan_port_destroy (port->dev); }return err; }
drivers/net/usb/sr9700.c +5 -0
@@ -539,6 +539,11 @@ static const struct usb_device_id products[] = { USB_DEVICE(0x0fe6, 0x9700), /* SR9700 device */ .driver_info = (unsigned long)&sr9700_driver_info, }, + { +/* SR9700 with virtual driver CD-ROM - interface 0 is the CD-ROM device */ + USB_DEVICE_INTERFACE_NUMBER(0x0fe6, 0x9702, 1), + .driver_info = (unsigned long)&sr9700_driver_info, + }, {}, /* END */ };
drivers/net/wireless/ti/wlcore/tx.c +5 -0
@@ -210,6 +210,11 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif, total_blocks =wlcore_hw_calc_tx_blocks (wl, total_len, spare_blocks);if (total_blocks <= wl->tx_blocks_available) { +if (skb_headroom (skb) < (total_len - skb->len) && +pskb_expand_head (skb, (total_len - skb->len),0 ,GFP_ATOMIC )) { +wl1271_free_tx_id (wl, id); +return -EAGAIN ; + } desc =skb_push (skb, total_len - skb->len); wlcore_hw_set_tx_desc_blocks(wl, desc, total_blocks,
drivers/nvme/target/tcp.c +48 -52
217 lines not on this page · raw message
drivers/platform/x86/intel/telemetry/debugfs.c +2 -2
@@ -449,7 +449,7 @@ static int telem_pss_states_show(struct seq_file *s, void *unused)for (index =0 ; index < debugfs_conf->pss_ltr_evts; index++) {seq_printf (s,"%-32s\t%u\n" , debugfs_conf->pss_ltr_data[index].name, - pss_s0ix_wakeup[index]); + pss_ltr_blkd[index]); }seq_puts (s,"\n--------------------------------------\n" );
@@ -459,7 +459,7 @@ static int telem_pss_states_show(struct seq_file *s, void *unused)for (index =0 ; index < debugfs_conf->pss_wakeup_evts; index++) {seq_printf (s,"%-32s\t%u\n" , debugfs_conf->pss_wakeup[index].name, - pss_ltr_blkd[index]); + pss_s0ix_wakeup[index]); }return 0 ;
drivers/platform/x86/intel/telemetry/pltdrv.c +1 -1
@@ -610,7 +610,7 @@ static int telemetry_setup(struct platform_device *pdev)/* Get telemetry Info */ events = (read_buf &TELEM_INFO_SRAMEVTS_MASK ) >>TELEM_INFO_SRAMEVTS_SHIFT ; - event_regs = read_buf &TELEM_INFO_SRAMEVTS_MASK ; + event_regs = read_buf &TELEM_INFO_NENABLES_MASK ;if ((events <TELEM_MAX_EVENTS_SRAM ) || (event_regs <TELEM_MAX_EVENTS_SRAM )) {dev_err (&pdev->dev,"PSS:Insufficient Space for SRAM Trace\n" );
drivers/platform/x86/toshiba_haps.c +1 -1
@@ -185,7 +185,7 @@ static int toshiba_haps_add(struct acpi_device *acpi_dev)pr_info ("Toshiba HDD Active Protection Sensor device\n" ); - haps =kzalloc (sizeof (struct toshiba_haps_dev ),GFP_KERNEL ); + haps =devm_kzalloc (&acpi_dev->dev,sizeof (*haps),GFP_KERNEL );if (!haps)return -ENOMEM ;
drivers/spi/spi-tegra20-slink.c +4 -2
@@ -1087,8 +1087,10 @@ static int tegra_slink_probe(struct platform_device *pdev)reset_control_deassert (tspi->rst); spi_irq =platform_get_irq (pdev,0 ); -if (spi_irq <0 ) -return spi_irq; +if (spi_irq <0 ) { + ret = spi_irq; + goto exit_pm_put; + } tspi->irq = spi_irq; ret = request_threaded_irq(tspi->irq, tegra_slink_isr, tegra_slink_isr_thread, IRQF_ONESHOT,
drivers/spi/spi-tegra210-quad.c +32 -4
@@ -794,6 +794,7 @@ static u32 tegra_qspi_setup_transfer_one(struct spi_device *spi, struct spi_tranu32 command1, command2, speed = t->speed_hz;u8 bits_per_word = t->bits_per_word;u32 tx_tap =0 , rx_tap =0 ; +unsigned long flags;int req_mode;if (speed != tqspi->cur_speed) {
@@ -801,10 +802,12 @@ static u32 tegra_qspi_setup_transfer_one(struct spi_device *spi, struct spi_tran tqspi->cur_speed = speed; } +spin_lock_irqsave (&tqspi->lock, flags); tqspi->cur_pos =0 ; tqspi->cur_rx_pos =0 ; tqspi->cur_tx_pos =0 ; tqspi->curr_xfer = t; +spin_unlock_irqrestore (&tqspi->lock, flags);if (is_first_of_msg) {tegra_qspi_mask_clear_irq (tqspi);
@@ -1046,6 +1049,7 @@ static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi,u32 address_value =0 ;u32 cmd_config =0 , addr_config =0 ;u8 cmd_value =0 , val =0 ; +unsigned long flags;/* Enable Combined sequence mode */ val =tegra_qspi_readl (tqspi,QSPI_GLOBAL_CONFIG );
@@ -1152,12 +1156,16 @@ static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi,tegra_qspi_transfer_end (spi);spi_transfer_delay_exec (xfer); } +spin_lock_irqsave (&tqspi->lock, flags); tqspi->curr_xfer =NULL ; +spin_unlock_irqrestore (&tqspi->lock, flags); transfer_phase++; } exit: +spin_lock_irqsave (&tqspi->lock, flags); tqspi->curr_xfer =NULL ; +spin_unlock_irqrestore (&tqspi->lock, flags); msg->status = ret;return ret;
@@ -1170,6 +1178,7 @@ static int tegra_qspi_non_combined_seq_xfer(struct tegra_qspi *tqspi,struct spi_transfer *transfer;bool is_first_msg = true;int ret =0 , val =0 ; +unsigned long flags; msg->status =0 ; msg->actual_length =0 ;
@@ -1239,7 +1248,9 @@ static int tegra_qspi_non_combined_seq_xfer(struct tegra_qspi *tqspi, msg->actual_length += xfer->len + dummy_bytes; complete_xfer: +spin_lock_irqsave (&tqspi->lock, flags); tqspi->curr_xfer =NULL ; +spin_unlock_irqrestore (&tqspi->lock, flags);if (ret <0 ) {tegra_qspi_transfer_end (spi);
@@ -1310,10 +1321,11 @@ static int tegra_qspi_transfer_one_message(struct spi_master *master,static irqreturn_t handle_cpu_based_xfer (struct tegra_qspi *tqspi) { -struct spi_transfer *t = tqspi->curr_xfer; +struct spi_transfer *t;unsigned long flags;spin_lock_irqsave (&tqspi->lock, flags); + t = tqspi->curr_xfer;if (tqspi->tx_status || tqspi->rx_status) {tegra_qspi_handle_error (tqspi);
@@ -1344,7 +1356,7 @@ static irqreturn_t handle_cpu_based_xfer(struct tegra_qspi *tqspi)static irqreturn_t handle_dma_based_xfer (struct tegra_qspi *tqspi) { -struct spi_transfer *t = tqspi->curr_xfer; +struct spi_transfer *t;unsigned int total_fifo_words;unsigned long flags;long wait_status;
@@ -1381,6 +1393,7 @@ static irqreturn_t handle_dma_based_xfer(struct tegra_qspi *tqspi) }spin_lock_irqsave (&tqspi->lock, flags); + t = tqspi->curr_xfer;if (err) {tegra_qspi_dma_unmap_xfer (tqspi, t);
@@ -1420,15 +1433,30 @@ static irqreturn_t handle_dma_based_xfer(struct tegra_qspi *tqspi)static irqreturn_t tegra_qspi_isr_thread (int irq,void *context_data) {struct tegra_qspi *tqspi = context_data; +u32 status; + +/* +* Read transfer status to check if interrupt was triggered by transfer +* completion +*/ + status =tegra_qspi_readl (tqspi,QSPI_TRANS_STATUS );/* * Occasionally the IRQ thread takes a long time to wake up (usually * when the CPU that it's running on is excessively busy) and we have * already reached the timeout before and cleaned up the timed out * transfer. Avoid any processing in that case and bail out early. +* +* If no transfer is in progress, check if this was a real interrupt +* that the timeout handler already processed, or a spurious one. */ -if (!tqspi->curr_xfer) -return IRQ_NONE ; +if (!tqspi->curr_xfer) { +/* Spurious interrupt - transfer not ready */ +if (!(status &QSPI_RDY )) +return IRQ_NONE ; +/* Real interrupt, already handled by timeout path */ +return IRQ_HANDLED ; + } tqspi->status_reg =tegra_qspi_readl (tqspi,QSPI_FIFO_STATUS );
drivers/staging/wlan-ng/hfa384x_usb.c +2 -2
@@ -1116,8 +1116,8 @@ static int hfa384x_usbctlx_complete_sync(struct hfa384x *hw,if (ctlx ==get_active_ctlx (hw)) {spin_unlock_irqrestore (&hw->ctlxq.lock, flags); -del_singleshot_timer_sync (&hw->reqtimer); -del_singleshot_timer_sync (&hw->resptimer); +del_timer_sync (&hw->reqtimer); +del_timer_sync (&hw->resptimer); hw->req_timer_done =1 ; hw->resp_timer_done =1 ;usb_kill_urb (&hw->ctlx_urb);
drivers/staging/wlan-ng/prism2usb.c +3 -3
@@ -171,9 +171,9 @@ static void prism2sta_disconnect_usb(struct usb_interface *interface)*/ prism2sta_ifstate (wlandev, P80211ENUM_ifstate_disable); -del_singleshot_timer_sync (&hw->throttle); -del_singleshot_timer_sync (&hw->reqtimer); -del_singleshot_timer_sync (&hw->resptimer); +del_timer_sync (&hw->throttle); +del_timer_sync (&hw->reqtimer); +del_timer_sync (&hw->resptimer);/* Unlink all the URBs. This "removes the wheels" * from the entire CTLX handling mechanism.
drivers/target/iscsi/iscsi_target_util.c +8 -2
@@ -785,8 +785,11 @@ void iscsit_dec_session_usage_count(struct iscsi_session *sess)spin_lock_bh (&sess->session_usage_lock); sess->session_usage_count--; -if (!sess->session_usage_count && sess->session_waiting_on_uc) +if (!sess->session_usage_count && sess->session_waiting_on_uc) { +spin_unlock_bh (&sess->session_usage_lock);complete (&sess->session_waiting_on_uc_comp); +return ; + }spin_unlock_bh (&sess->session_usage_lock); }
@@ -854,8 +857,11 @@ void iscsit_dec_conn_usage_count(struct iscsi_conn *conn)spin_lock_bh (&conn->conn_usage_lock); conn->conn_usage_count--; -if (!conn->conn_usage_count && conn->conn_waiting_on_uc) +if (!conn->conn_usage_count && conn->conn_waiting_on_uc) { +spin_unlock_bh (&conn->conn_usage_lock);complete (&conn->conn_waiting_on_uc_comp); +return ; + }spin_unlock_bh (&conn->conn_usage_lock); }
fs/gfs2/log.c +2 -1
@@ -1094,7 +1094,8 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)lops_before_commit (sdp, tr);if (gfs2_withdrawn (sdp)) goto out_withdraw; -gfs2_log_submit_bio (&sdp->sd_jdesc->jd_log_bio,REQ_OP_WRITE ); +if (sdp->sd_jdesc) +gfs2_log_submit_bio (&sdp->sd_jdesc->jd_log_bio,REQ_OP_WRITE );if (gfs2_withdrawn (sdp)) goto out_withdraw;
fs/gfs2/super.c +4 -0
@@ -67,9 +67,13 @@ void gfs2_jindex_free(struct gfs2_sbd *sdp) sdp->sd_journals =0 ;spin_unlock (&sdp->sd_jindex_spin); +down_write (&sdp->sd_log_flush_lock); sdp->sd_jdesc =NULL ; +up_write (&sdp->sd_log_flush_lock); +while (!list_empty (&list)) { jd = list_first_entry(&list, struct gfs2_jdesc, jd_list); +BUG_ON (jd->jd_log_bio);gfs2_free_journal_extents (jd);list_del (&jd->jd_list);iput (jd->jd_inode);
fs/hfsplus/dir.c +1 -1
@@ -204,7 +204,7 @@ static int hfsplus_readdir(struct file *file, struct dir_context *ctx) fd.entrylength); type =be16_to_cpu (entry.type); len =NLS_MAX_CHARSET_SIZE *HFSPLUS_MAX_STRLEN ; - err =hfsplus_uni2asc (sb, &fd.key->cat.name, strbuf, &len); + err =hfsplus_uni2asc_str (sb, &fd.key->cat.name, strbuf, &len);if (err) goto out;if (type ==HFSPLUS_FOLDER ) {
fs/hfsplus/hfsplus_fs.h +6 -2
@@ -516,8 +516,12 @@ int hfsplus_strcasecmp(const struct hfsplus_unistr *s1, const struct hfsplus_unistr *s2);int hfsplus_strcmp (const struct hfsplus_unistr *s1,const struct hfsplus_unistr *s2); -int hfsplus_uni2asc (struct super_block *sb,const struct hfsplus_unistr *ustr, -char *astr,int *len_p); +int hfsplus_uni2asc_str (struct super_block *sb, +const struct hfsplus_unistr *ustr,char *astr, +int *len_p); +int hfsplus_uni2asc_xattr_str (struct super_block *sb, +const struct hfsplus_attr_unistr *ustr, +char *astr,int *len_p);int hfsplus_asc2uni (struct super_block *sb,struct hfsplus_unistr *ustr,int max_unistr_len,const char *astr,int len);int hfsplus_hash_dentry (const struct dentry *dentry,struct qstr *str);
fs/hfsplus/unicode.c +19 -5
@@ -143,9 +143,8 @@ static u16 *hfsplus_compose_lookup(u16 *p, u16 cc)return NULL ; } -int hfsplus_uni2asc (struct super_block *sb, -const struct hfsplus_unistr *ustr, -char *astr,int *len_p) +static int hfsplus_uni2asc (struct super_block *sb,const struct hfsplus_unistr *ustr, +int max_len,char *astr,int *len_p) {const hfsplus_unichr *ip;struct nls_table *nls =HFSPLUS_SB (sb)->nls;
@@ -158,8 +157,8 @@ int hfsplus_uni2asc(struct super_block *sb, ip = ustr->unicode; ustrlen =be16_to_cpu (ustr->length); -if (ustrlen >HFSPLUS_MAX_STRLEN ) { - ustrlen =HFSPLUS_MAX_STRLEN ; +if (ustrlen > max_len) { + ustrlen = max_len;pr_err ("invalid length %u has been corrected to %d\n" ,be16_to_cpu (ustr->length), ustrlen); }
@@ -280,6 +279,21 @@ int hfsplus_uni2asc(struct super_block *sb,return res; } +inline int hfsplus_uni2asc_str (struct super_block *sb, +const struct hfsplus_unistr *ustr,char *astr, +int *len_p) +{ +return hfsplus_uni2asc (sb, ustr,HFSPLUS_MAX_STRLEN , astr, len_p); +} + +inline int hfsplus_uni2asc_xattr_str (struct super_block *sb, +const struct hfsplus_attr_unistr *ustr, +char *astr,int *len_p) +{ +return hfsplus_uni2asc (sb, (const struct hfsplus_unistr *)ustr, +HFSPLUS_ATTR_MAX_STRLEN , astr, len_p); +} +/* * Convert one or more ASCII characters into a single unicode character. * Returns the number of ASCII characters corresponding to the unicode char.
fs/hfsplus/xattr.c +3 -3
@@ -737,9 +737,9 @@ ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size) goto end_listxattr; xattr_name_len =NLS_MAX_CHARSET_SIZE *HFSPLUS_ATTR_MAX_STRLEN ; -if (hfsplus_uni2asc (inode->i_sb, - (const struct hfsplus_unistr *)&fd.key->attr.key_name, - strbuf, &xattr_name_len)) { +if (hfsplus_uni2asc_xattr_str (inode->i_sb, + &fd.key->attr.key_name, strbuf, + &xattr_name_len)) {pr_err ("unicode conversion failed\n" ); res = -EIO ; goto end_listxattr;
fs/ksmbd/smb2pdu.c +4 -1
@@ -2263,7 +2263,7 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work) {struct smb2_create_rsp *rsp;struct smb2_create_req *req; -int id; +int id =-1 ;int err;char *name;
@@ -2320,6 +2320,9 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)break ; } +if (id >=0 ) +ksmbd_session_rpc_close (work->sess, id); +if (!IS_ERR (name))kfree (name);
include/linux/timer.h +15 -2
@@ -169,7 +169,6 @@ static inline int timer_pending(const struct timer_list * timer) }extern void add_timer_on (struct timer_list *timer,int cpu); -extern int del_timer (struct timer_list * timer);extern int mod_timer (struct timer_list *timer,unsigned long expires);extern int mod_timer_pending (struct timer_list *timer,unsigned long expires);extern int timer_reduce (struct timer_list *timer,unsigned long expires);
@@ -184,6 +183,9 @@ extern void add_timer(struct timer_list *timer);extern int try_to_del_timer_sync (struct timer_list *timer);extern int timer_delete_sync (struct timer_list *timer); +extern int timer_delete (struct timer_list *timer); +extern int timer_shutdown_sync (struct timer_list *timer); +extern int timer_shutdown (struct timer_list *timer);/** * del_timer_sync - Delete a pending timer and wait for a running callback
@@ -198,7 +200,18 @@ static inline int del_timer_sync(struct timer_list *timer)return timer_delete_sync (timer); } -#define del_singleshot_timer_sync (t) del_timer_sync(t) +/** +* del_timer - Delete a pending timer +* @timer: The timer to be deleted +* +* See timer_delete() for detailed explanation. +* +* Do not use in new code. Use timer_delete() instead. +*/ +static inline int del_timer (struct timer_list *timer) +{ +return timer_delete (timer); +}extern void init_timers (void );struct hrtimer ;
kernel/time/timer.c +260 -58
488 lines not on this page · raw message
kernel/trace/ring_buffer.c +2 -0
@@ -2322,6 +2322,8 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, list) {list_del_init (&bpage->list);free_buffer_page (bpage); + +cond_resched (); } } out_err_unlock:
kernel/trace/trace.h +5 -2
@@ -65,14 +65,17 @@ enum trace_type {#undef __field_fn#define __field_fn (type, item) type item; +#undef __field_packed +#define __field_packed (type, item) type item; +#undef __field_struct#define __field_struct (type, item) __field(type, item)#undef __field_desc#define __field_desc (type, container, item) -#undef __field_packed -#define __field_packed (type, container, item) +#undef __field_desc_packed +#define __field_desc_packed (type, container, item)#undef __array#define __array (type, item, size) type item[size];
kernel/trace/trace_entries.h +7 -7
@@ -78,8 +78,8 @@ FTRACE_ENTRY_PACKED(funcgraph_entry, ftrace_graph_ent_entry, F_STRUCT( __field_struct( struct ftrace_graph_ent, graph_ent ) - __field_packed( unsigned long, graph_ent, func ) - __field_packed( int, graph_ent, depth ) + __field_desc_packed( unsigned long, graph_ent, func ) + __field_desc_packed( int, graph_ent, depth ) ), F_printk("--> %ps (%d)", (void *)__entry->func, __entry->depth)
@@ -92,11 +92,11 @@ FTRACE_ENTRY_PACKED(funcgraph_exit, ftrace_graph_ret_entry, F_STRUCT( __field_struct( struct ftrace_graph_ret, ret ) - __field_packed( unsigned long, ret, func ) - __field_packed( int, ret, depth ) - __field_packed( unsigned int, ret, overrun ) - __field_packed( unsigned long long, ret, calltime) - __field_packed( unsigned long long, ret, rettime ) + __field_desc_packed( unsigned long, ret, func ) + __field_desc_packed( int, ret, depth ) + __field_desc_packed( unsigned int, ret, overrun ) + __field_desc_packed( unsigned long long, ret, calltime) + __field_desc_packed( unsigned long long, ret, rettime ) ), F_printk("<-- %ps (%d) (start: %llx end: %llx) over: %d",
kernel/trace/trace_export.c +15 -6
@@ -42,11 +42,14 @@ static int ftrace_event_register(struct trace_event_call *call,#undef __field_fn#define __field_fn (type, item) type item; +#undef __field_packed +#define __field_packed (type, item) type item; +#undef __field_desc#define __field_desc (type, container, item) type item; -#undef __field_packed -#define __field_packed (type, container, item) type item; +#undef __field_desc_packed +#define __field_desc_packed (type, container, item) type item;#undef __array#define __array (type, item, size) type item[size];
@@ -101,11 +104,14 @@ static void __always_unused ____ftrace_check_##name(void) \#undef __field_fn#define __field_fn (_type, _item) __field_ext(_type, _item, FILTER_TRACE_FN) +#undef __field_packed +#define __field_packed (_type, _item) __field_ext_packed(_type, _item, FILTER_OTHER) +#undef __field_desc#define __field_desc (_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER) -#undef __field_packed -#define __field_packed (_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER) +#undef __field_desc_packed +#define __field_desc_packed (_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER)#undef __array#define __array (_type, _item, _len) { \
@@ -139,11 +145,14 @@ static struct trace_event_fields ftrace_event_fields_##name[] = { \#undef __field_fn#define __field_fn (type, item) +#undef __field_packed +#define __field_packed (type, item) +#undef __field_desc#define __field_desc (type, container, item) -#undef __field_packed -#define __field_packed (type, container, item) +#undef __field_desc_packed +#define __field_desc_packed (type, container, item)#undef __array#define __array (type, item, len)
mm/kfence/core.c +21 -4
@@ -520,7 +520,7 @@ static bool __init kfence_init_pool(void) {unsigned long addr = (unsigned long )__kfence_pool;struct page *pages; -int i; +int i, rand;char *p;if (!__kfence_pool)
@@ -576,13 +576,30 @@ static bool __init kfence_init_pool(void)INIT_LIST_HEAD (&meta->list);raw_spin_lock_init (&meta->lock); meta->state =KFENCE_OBJECT_UNUSED ; - meta->addr = addr;/* Initialize for validation in metadata_to_pageaddr(). */ -list_add_tail (&meta->list, &kfence_freelist); +/* Use addr to randomize the freelist. */ + meta->addr = i;/* Protect the right redzone. */ -if (unlikely (!kfence_protect (addr +PAGE_SIZE ))) +if (unlikely (!kfence_protect (addr +2 * i *PAGE_SIZE +PAGE_SIZE ))) { + addr +=2 * i *PAGE_SIZE ; goto err; + } + } + +for (i =CONFIG_KFENCE_NUM_OBJECTS ; i >0 ; i--) { + rand =get_random_u32 () % i; +swap (kfence_metadata[i -1 ].addr, kfence_metadata[rand].addr); + } +for (i =0 ; i <CONFIG_KFENCE_NUM_OBJECTS ; i++) { +struct kfence_metadata *meta_1 = &kfence_metadata[i]; +struct kfence_metadata *meta_2 = &kfence_metadata[meta_1->addr]; + +list_add_tail (&meta_2->list, &kfence_freelist); + } + +for (i =0 ; i <CONFIG_KFENCE_NUM_OBJECTS ; i++) { + kfence_metadata[i].addr = addr; addr +=2 *PAGE_SIZE ; }
net/bluetooth/hci_event.c +3 -0
@@ -2373,6 +2373,9 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)hci_req_reenable_advertising (hdev); } +/* Inform sockets conn is gone before we delete it */ +hci_disconn_cfm (conn,HCI_ERROR_UNSPECIFIED ); +/* If the disconnection failed for any reason, the upper layer * does not retry to disconnect in current implementation. * Hence, we need to do some basic cleanup here and re-enable
net/bridge/netfilter/ebtables.c +1 -1
@@ -1299,7 +1299,7 @@ int ebt_register_template(const struct ebt_table *t, int (*table_init)(struct nelist_for_each_entry (tmpl, &template_tables, list) {if (WARN_ON_ONCE (strcmp (t->name, tmpl->name) ==0 )) {mutex_unlock (&ebt_mutex); -return -EEXIST ; +return -EBUSY ; } }
net/mac80211/key.c +2 -1
@@ -910,7 +910,8 @@ void ieee80211_reenable_keys(struct ieee80211_sub_if_data *sdata)if (ieee80211_sdata_running (sdata)) {list_for_each_entry (key, &sdata->key_list, list) { -increment_tailroom_need_count (sdata); +if (!(key->flags &KEY_FLAG_TAINTED )) +increment_tailroom_need_count (sdata);ieee80211_key_enable_hw_accel (key); } }
net/mac80211/ocb.c +3 -0
@@ -47,6 +47,9 @@ void ieee80211_ocb_rx_no_sta(struct ieee80211_sub_if_data *sdata,struct sta_info *sta;int band; +if (!ifocb->joined) +return ; +/* XXX: Consider removing the least recently used entry and * allow new one to be added. */
net/mac80211/sta_info.c +4 -3
@@ -1101,6 +1101,10 @@ static void __sta_info_destroy_part2(struct sta_info *sta) } } + sinfo =kzalloc (sizeof (*sinfo),GFP_KERNEL ); +if (sinfo) +sta_set_sinfo (sta, sinfo, true); +if (sta->uploaded) { ret =drv_sta_state (local, sdata, sta,IEEE80211_STA_NONE ,IEEE80211_STA_NOTEXIST );
@@ -1109,9 +1113,6 @@ static void __sta_info_destroy_part2(struct sta_info *sta)sta_dbg (sdata,"Removed STA %pM\n" , sta->sta.addr); - sinfo =kzalloc (sizeof (*sinfo),GFP_KERNEL ); -if (sinfo) -sta_set_sinfo (sta, sinfo, true);cfg80211_del_sta_sinfo (sdata->dev, sta->sta.addr, sinfo,GFP_KERNEL );kfree (sinfo);
net/netfilter/nf_log.c +2 -2
@@ -89,7 +89,7 @@ int nf_log_register(u_int8_t pf, struct nf_logger *logger)if (pf ==NFPROTO_UNSPEC ) {for (i =NFPROTO_UNSPEC ; i <NFPROTO_NUMPROTO ; i++) {if (rcu_access_pointer (loggers[i][logger->type])) { - ret = -EEXIST ; + ret = -EBUSY ; goto unlock; } }
@@ -97,7 +97,7 @@ int nf_log_register(u_int8_t pf, struct nf_logger *logger)rcu_assign_pointer (loggers[i][logger->type], logger); }else {if (rcu_access_pointer (loggers[pf][logger->type])) { - ret = -EEXIST ; + ret = -EBUSY ; goto unlock; }rcu_assign_pointer (loggers[pf][logger->type], logger);
net/netfilter/nf_tables_api.c +1 -1
@@ -5141,7 +5141,7 @@ static void nft_map_catchall_activate(const struct nft_ctx *ctx,list_for_each_entry (catchall, &set->catchall_list, list) { ext =nft_set_elem_ext (set, catchall->elem); -if (!nft_set_elem_active (ext, genmask)) +if (nft_set_elem_active (ext, genmask))continue ; elem.priv = catchall->elem;
net/netfilter/nft_set_pipapo.c +8 -0
@@ -667,6 +667,11 @@ static int pipapo_resize(struct nft_pipapo_field *f, int old_rules, int rules) } mt: +if (rules > (INT_MAX /sizeof (*new_mt))) { +kvfree (new_lt); +return -ENOMEM ; + } + new_mt =kvmalloc (rules *sizeof (*new_mt),GFP_KERNEL );if (!new_mt) {kvfree (new_lt);
@@ -1360,6 +1365,9 @@ static struct nft_pipapo_match *pipapo_clone(struct nft_pipapo_match *old) src->bsize *sizeof (*dst->lt) * src->groups * NFT_PIPAPO_BUCKETS(src->bb)); +if (src->rules > (INT_MAX /sizeof (*src->mt))) + goto out_mt; + dst->mt =kvmalloc (src->rules *sizeof (*src->mt),GFP_KERNEL );if (!dst->mt) goto out_mt;
net/netfilter/x_tables.c +1 -1
@@ -1761,7 +1761,7 @@ EXPORT_SYMBOL_GPL(xt_hook_ops_alloc);int xt_register_template (const struct xt_table *table,int (*table_init)(struct net *net)) { -int ret = -EEXIST , af = table->af; +int ret = -EBUSY , af = table->af;struct xt_template *t;mutex_lock (&xt[af].mutex);
net/sunrpc/xprt.c +1 -1
@@ -1160,7 +1160,7 @@ xprt_request_enqueue_receive(struct rpc_task *task)spin_unlock (&xprt->queue_lock);/* Turn off autodisconnect */ -del_singleshot_timer_sync (&xprt->timer); +del_timer_sync (&xprt->timer); }/**
net/tipc/crypto.c +2 -2
@@ -1230,7 +1230,7 @@ void tipc_crypto_key_flush(struct tipc_crypto *c) rx = c; tx =tipc_net (rx->net)->crypto_tx;if (cancel_delayed_work (&rx->work)) { -kfree (rx->skey); +kfree_sensitive (rx->skey); rx->skey =NULL ;atomic_xchg (&rx->key_distr,0 );tipc_node_put (rx->node);
@@ -2405,7 +2405,7 @@ static void tipc_crypto_work_rx(struct work_struct *work)break ;default :synchronize_rcu (); -kfree (rx->skey); +kfree_sensitive (rx->skey); rx->skey =NULL ;break ; }
net/wireless/util.c +5 -3
@@ -1418,12 +1418,14 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate) tmp = result; tmp *=SCALE ;do_div (tmp, mcs_divisors[rate->mcs]); - result = tmp;/* and take NSS, DCM into account */ - result = (result * rate->nss) /8 ; + tmp *= rate->nss; +do_div (tmp,8 );if (rate->he_dcm) - result /=2 ; +do_div (tmp,2 ); + + result = tmp;return result /10000 ; }
sound/pci/hda/patch_realtek.c +1 -0
@@ -9333,6 +9333,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x103c ,0x863e ,"HP Spectre x360 15-df1xxx" ,ALC285_FIXUP_HP_SPECTRE_X360_DF1 ),SND_PCI_QUIRK (0x103c ,0x86e8 ,"HP Spectre x360 15-eb0xxx" ,ALC285_FIXUP_HP_SPECTRE_X360_EB1 ),SND_PCI_QUIRK (0x103c ,0x86f9 ,"HP Spectre x360 13-aw0xxx" ,ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED ), +SND_PCI_QUIRK (0x103c ,0x8706 ,"HP Laptop 15s-eq1xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x8716 ,"HP Elite Dragonfly G2 Notebook PC" ,ALC285_FIXUP_HP_GPIO_AMP_INIT ),SND_PCI_QUIRK (0x103c ,0x8720 ,"HP EliteBook x360 1040 G8 Notebook PC" ,ALC285_FIXUP_HP_GPIO_AMP_INIT ), SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
sound/soc/amd/renoir/acp3x-pdm-dma.c +2 -0
@@ -295,9 +295,11 @@ static int acp_pdm_dma_close(struct snd_soc_component *component, struct snd_pcm_substream *substream) {struct pdm_dev_data *adata =dev_get_drvdata (component->dev); +struct pdm_stream_instance *rtd = substream->runtime->private_data;disable_pdm_interrupts (adata->acp_base); adata->capture_stream =NULL ; +kfree (rtd);return 0 ; }
sound/soc/codecs/tlv320adcx140.c +3 -0
@@ -1098,6 +1098,9 @@ static int adcx140_i2c_probe(struct i2c_client *i2c, adcx140->gpio_reset =devm_gpiod_get_optional (adcx140->dev,"reset" ,GPIOD_OUT_LOW );if (IS_ERR (adcx140->gpio_reset)) +return dev_err_probe (&i2c->dev,PTR_ERR (adcx140->gpio_reset), +"Failed to get Reset GPIO\n" ); +if (!adcx140->gpio_reset)dev_info (&i2c->dev,"Reset GPIO not defined\n" ); adcx140->supply_areg = devm_regulator_get_optional(adcx140->dev,
sound/soc/ti/davinci-evm.c +31 -8
@@ -404,27 +404,32 @@ static int davinci_evm_probe(struct platform_device *pdev)return -EINVAL ; dai->cpus->of_node =of_parse_phandle (np,"ti,mcasp-controller" ,0 ); -if (!dai->cpus->of_node) -return -EINVAL ; +if (!dai->cpus->of_node) { + ret = -EINVAL ; + goto err_put; + } dai->platforms->of_node = dai->cpus->of_node; evm_soc_card.dev = &pdev->dev; ret =snd_soc_of_parse_card_name (&evm_soc_card,"ti,model" );if (ret) -return ret; + goto err_put; mclk =devm_clk_get (&pdev->dev,"mclk" );if (PTR_ERR (mclk) == -EPROBE_DEFER ) { -return -EPROBE_DEFER ; + ret = -EPROBE_DEFER ; + goto err_put; }else if (IS_ERR (mclk)) {dev_dbg (&pdev->dev,"mclk not found.\n" ); mclk =NULL ; } drvdata =devm_kzalloc (&pdev->dev,sizeof (*drvdata),GFP_KERNEL ); -if (!drvdata) -return -ENOMEM ; +if (!drvdata) { + ret = -ENOMEM ; + goto err_put; + } drvdata->mclk = mclk;
@@ -434,7 +439,8 @@ static int davinci_evm_probe(struct platform_device *pdev)if (!drvdata->mclk) {dev_err (&pdev->dev,"No clock or clock rate defined.\n" ); -return -EINVAL ; + ret = -EINVAL ; + goto err_put; } drvdata->sysclk =clk_get_rate (drvdata->mclk); }else if (drvdata->mclk) {
@@ -450,8 +456,25 @@ static int davinci_evm_probe(struct platform_device *pdev)snd_soc_card_set_drvdata (&evm_soc_card, drvdata); ret =devm_snd_soc_register_card (&pdev->dev, &evm_soc_card); -if (ret) +if (ret) {dev_err (&pdev->dev,"snd_soc_register_card failed (%d)\n" , ret); + goto err_put; + } + +return ret; + +err_put: + dai->platforms->of_node =NULL ; + +if (dai->cpus->of_node) { +of_node_put (dai->cpus->of_node); + dai->cpus->of_node =NULL ; + } + +if (dai->codecs->of_node) { +of_node_put (dai->codecs->of_node); + dai->codecs->of_node =NULL ; + }return ret; }
virt/kvm/eventfd.c +24 -20
71 lines not on this page · raw message