6.4.10-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainerPATCH 121/165 parisc/mm: preallocate fixmap page tables at init
In reply to Greg Kroah-HartmanFrom: Mike Rapoport (IBM) <[email protected]>
commit c2ff2b736c41cc63bb0aaec85cccfead9fbcfe92 upstream.
Christoph Biedl reported early OOM on recent kernels:
swapper: page allocation failure: order:0, mode:0x100(__GFP_ZERO),
nodemask=(null)
CPU: 0 PID: 0 Comm: swapper Not tainted 6.3.0-rc4+ #16
Hardware name: 9000/785/C3600
Backtrace:
[<10408594>] show_stack+0x48/0x5c
[<10e152d8>] dump_stack_lvl+0x48/0x64
[<10e15318>] dump_stack+0x24/0x34
[<105cf7f8>] warn_alloc+0x10c/0x1c8
[<105d068c>] __alloc_pages+0xbbc/0xcf8
[<105d0e4c>] __get_free_pages+0x28/0x78
[<105ad10c>] __pte_alloc_kernel+0x30/0x98
[<10406934>] set_fixmap+0xec/0xf4
[<10411ad4>] patch_map.constprop.0+0xa8/0xdc
[<10411bb0>] __patch_text_multiple+0xa8/0x208
[<10411d78>] patch_text+0x30/0x48
[<1041246c>] arch_jump_label_transform+0x90/0xcc
[<1056f734>] jump_label_update+0xd4/0x184
[<1056fc9c>] static_key_enable_cpuslocked+0xc0/0x110
[<1056fd08>] static_key_enable+0x1c/0x2c
[<1011362c>] init_mem_debugging_and_hardening+0xdc/0xf8
[<1010141c>] start_kernel+0x5f0/0xa98
[<10105da8>] start_parisc+0xb8/0xe4 Mem-Info:
active_anon:0 inactive_anon:0 isolated_anon:0
active_file:0 inactive_file:0 isolated_file:0 unevictable:0 dirty:0 writeback:0
slab_reclaimable:0 slab_unreclaimable:0
mapped:0 shmem:0 pagetables:0
sec_pagetables:0 bounce:0
kernel_misc_reclaimable:0
free:0 free_pcp:0 free_cma:0
Node 0 active_anon:0kB inactive_anon:0kB active_file:0kB
inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:0kB dirty:0kB writeback:0kB shmem:0kB +writeback_tmp:0kB kernel_stack:0kB pagetables:0kB sec_pagetables:0kB all_unreclaimable? no
Normal free:0kB boost:0kB min:0kB low:0kB high:0kB
reserved_highatomic:0KB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB +present:1048576kB managed:1039360kB mlocked:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
lowmem_reserve[]: 0 0
Normal: 0*4kB 0*8kB 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB
0*1024kB 0*2048kB 0*4096kB = 0kB
0 total pagecache pages
0 pages in swap cache
Free swap = 0kB
Total swap = 0kB
262144 pages RAM
0 pages HighMem/MovableOnly
2304 pages reserved
Backtrace:
[<10411d78>] patch_text+0x30/0x48
[<1041246c>] arch_jump_label_transform+0x90/0xcc
[<1056f734>] jump_label_update+0xd4/0x184
[<1056fc9c>] static_key_enable_cpuslocked+0xc0/0x110
[<1056fd08>] static_key_enable+0x1c/0x2c
[<1011362c>] init_mem_debugging_and_hardening+0xdc/0xf8
[<1010141c>] start_kernel+0x5f0/0xa98
[<10105da8>] start_parisc+0xb8/0xe4
Kernel Fault: Code=15 (Data TLB miss fault) at addr 0f7fe3c0
CPU: 0 PID: 0 Comm: swapper Not tainted 6.3.0-rc4+ #16
Hardware name: 9000/785/C3600This happens because patching static key code temporarily maps it via fixmap and if it happens before page allocator is initialized set_fixmap() cannot allocate memory using pte_alloc_kernel().
Make sure that fixmap page tables are preallocated early so that pte_offset_kernel() in set_fixmap() never resorts to pte allocation.
--- arch/parisc/mm/fixmap.c | 3 --- arch/parisc/mm/init.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-)
arch/parisc/mm/fixmap.c +0 -3
@@ -19,9 +19,6 @@ void notrace set_fixmap(enum fixed_addrepmd_t *pmd =pmd_offset (pud, vaddr);pte_t *pte; -if (pmd_none (*pmd)) - pte =pte_alloc_kernel (pmd, vaddr); - pte =pte_offset_kernel (pmd, vaddr);set_pte_at (&init_mm, vaddr, pte,__mk_pte (phys,PAGE_KERNEL_RWX ));flush_tlb_kernel_range (vaddr, vaddr +PAGE_SIZE );
arch/parisc/mm/init.c +34 -0
@@ -671,6 +671,39 @@ static void __init gateway_init(void) PAGE_SIZE, PAGE_GATEWAY, 1); } +static void __init fixmap_init (void ) +{ +unsigned long addr =FIXMAP_START ; +unsigned long end =FIXMAP_START +FIXMAP_SIZE ; +pgd_t *pgd =pgd_offset_k (addr); +p4d_t *p4d =p4d_offset (pgd, addr); +pud_t *pud =pud_offset (p4d, addr); +pmd_t *pmd; + +BUILD_BUG_ON (FIXMAP_SIZE >PMD_SIZE ); + +#if CONFIG_PGTABLE_LEVELS ==3 +if (pud_none (*pud)) { + pmd =memblock_alloc (PAGE_SIZE <<PMD_TABLE_ORDER , +PAGE_SIZE <<PMD_TABLE_ORDER ); +if (!pmd) +panic ("fixmap: pmd allocation failed.\n" ); +pud_populate (NULL , pud, pmd); + } +#endif + + pmd =pmd_offset (pud, addr); +do { +pte_t *pte =memblock_alloc (PAGE_SIZE ,PAGE_SIZE ); +if (!pte) +panic ("fixmap: pte allocation failed.\n" ); + +pmd_populate_kernel (&init_mm, pmd, pte); + + addr +=PAGE_SIZE ; + }while (addr < end); +} +static void __init parisc_bootmem_free (void ) {unsigned long max_zone_pfn[MAX_NR_ZONES ] = {0 , };
@@ -685,6 +718,7 @@ void __init paging_init(void)setup_bootmem ();pagetable_init ();gateway_init (); +fixmap_init ();flush_cache_all_local ();/* start with known state */ flush_tlb_all_local (NULL );
Greg Kroah-Hartman
maintainerPATCH 122/165 arm64/fpsimd: Sync and zero pad FPSIMD state for streaming SVE
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit 69af56ae56a48a2522aad906c4461c6c7c092737 upstream.
We have a function sve_sync_from_fpsimd_zeropad() which is used by the ptrace code to update the SVE state when the user writes to the the FPSIMD register set. Currently this checks that the task has SVE enabled but this will miss updates for tasks which have streaming SVE enabled if SVE has not been enabled for the thread, also do the conversion if the task has streaming SVE enabled.
--- arch/arm64/kernel/fpsimd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/kernel/fpsimd.c +2 -1
@@ -835,7 +835,8 @@ void sve_sync_from_fpsimd_zeropad(structvoid *sst = task->thread.sve_state;struct user_fpsimd_state const *fst = &task->thread.uw.fpsimd_state; -if (!test_tsk_thread_flag (task,TIF_SVE )) +if (!test_tsk_thread_flag (task,TIF_SVE ) && + !thread_sm_enabled (&task->thread))return ; vq =sve_vq_from_vl (thread_get_cur_vl (&task->thread));
Greg Kroah-Hartman
maintainerPATCH 123/165 arm64/fpsimd: Clear SME state in the target task when setting the VL
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit c9bb40b7f786662e33d71afe236442b0b61f0446 upstream.
When setting SME vector lengths we clear TIF_SME to reenable SME traps, doing a reallocation of the backing storage on next use. We do this using clear_thread_flag() which operates on the current thread, meaning that when setting the vector length via ptrace we may both not force traps for the target task and force a spurious flush of any SME state that the tracing task may have.
Clear the flag in the target task.
--- arch/arm64/kernel/fpsimd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/kernel/fpsimd.c +1 -1
@@ -910,7 +910,7 @@ int vec_set_vector_length(struct task_st*/ task->thread.svcr &= ~(SVCR_SM_MASK |SVCR_ZA_MASK ); -clear_thread_flag (TIF_SME ); +clear_tsk_thread_flag (task,TIF_SME ); free_sme = true; } }
Greg Kroah-Hartman
maintainerPATCH 124/165 arm64/fpsimd: Sync FPSIMD state with SVE for SME only systems
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit 507ea5dd92d23fcf10e4d1a68a443c86a49753ed upstream.
Currently we guard FPSIMD/SVE state conversions with a check for the system supporting SVE but SME only systems may need to sync streaming mode SVE state so add a check for SME support too. These functions are only used by the ptrace code.
--- arch/arm64/kernel/fpsimd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/kernel/fpsimd.c +2 -2
@@ -679,7 +679,7 @@ static void fpsimd_to_sve(struct task_stvoid *sst = task->thread.sve_state;struct user_fpsimd_state const *fst = &task->thread.uw.fpsimd_state; -if (!system_supports_sve ()) +if (!system_supports_sve () && !system_supports_sme ())return ; vq =sve_vq_from_vl (thread_get_cur_vl (&task->thread));
@@ -705,7 +705,7 @@ static void sve_to_fpsimd(struct task_stunsigned int i;__uint128_t const *p; -if (!system_supports_sve ()) +if (!system_supports_sve () && !system_supports_sme ())return ; vl =thread_get_cur_vl (&task->thread);
Greg Kroah-Hartman
maintainerPATCH 125/165 arm64/ptrace: Flush FP state when setting ZT0
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit 89a65c3f170e5c3b05a626046c68354e2afd7912 upstream.
When setting ZT0 via ptrace we do not currently force a reload of the floating point register state from memory, do that to ensure that the newly set value gets loaded into the registers on next task execution.
The function was templated off the function for FPSIMD which due to our providing the option of embedding a FPSIMD regset within the SVE regset does not directly include the flush.
--- arch/arm64/kernel/ptrace.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/kernel/ptrace.c +2 -0
@@ -1180,6 +1180,8 @@ static int zt_set(struct task_struct *target,if (ret ==0 ) target->thread.svcr |=SVCR_ZA_MASK ; +fpsimd_flush_task_state (target); +return ret; }
Signature · 1 line
2.41.0
Greg Kroah-Hartman
maintainerPATCH 126/165 arm64/ptrace: Dont enable SVE when setting streaming SVE
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit 045aecdfcb2e060db142d83a0f4082380c465d2c upstream.
Systems which implement SME without also implementing SVE are architecturally valid but were not initially supported by the kernel, unfortunately we missed one issue in the ptrace code.
The SVE register setting code is shared between SVE and streaming mode SVE. When we set full SVE register state we currently enable TIF_SVE unconditionally, in the case where streaming SVE is being configured on a system that supports vanilla SVE this is not an issue since we always initialise enough state for both vector lengths but on a system which only support SME it will result in us attempting to restore the SVE vector length after having set streaming SVE registers.
Fix this by making the enabling of SVE conditional on setting SVE vector state. If we set streaming SVE state and SVE was not already enabled this will result in a SVE access trap on next use of normal SVE, this will cause us to flush our register state but this is fine since the only way to trigger a SVE access trap would be to exit streaming mode which will cause the in register state to be flushed anyway.
--- arch/arm64/kernel/ptrace.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/arm64/kernel/ptrace.c +5 -3
@@ -932,11 +932,13 @@ static int sve_set_common(struct task_st/* * Ensure target->thread.sve_state is up to date with target's * FPSIMD regs, so that a short copyin leaves trailing -* registers unmodified. Always enable SVE even if going into -* streaming mode. +* registers unmodified. Only enable SVE if we are +* configuring normal SVE, a system with streaming SVE may not +* have normal SVE. */ fpsimd_sync_to_sve (target); -set_tsk_thread_flag (target,TIF_SVE ); +if (type ==ARM64_VEC_SVE ) +set_tsk_thread_flag (target,TIF_SVE ); target->thread.fp_type =FP_STATE_SVE ;BUILD_BUG_ON (SVE_PT_SVE_OFFSET !=sizeof (header));
Greg Kroah-Hartman
maintainerPATCH 127/165 open: make RESOLVE_CACHED correctly test for O_TMPFILE
In reply to Greg Kroah-HartmanFrom: Aleksa Sarai <[email protected]>
commit a0fc452a5d7fed986205539259df1d60546f536c upstream.
O_TMPFILE is actually __O_TMPFILE|O_DIRECTORY. This means that the old fast-path check for RESOLVE_CACHED would reject all users passing O_DIRECTORY with -EAGAIN, when in fact the intended test was to check for __O_TMPFILE.
Message-Id: <[email protected]>
--- fs/open.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/open.c +1 -1
@@ -1271,7 +1271,7 @@ inline int build_open_flags(const struct lookup_flags |=LOOKUP_IN_ROOT ;if (how->resolve &RESOLVE_CACHED ) {/* Don't bother even trying for create/truncate/tmpfile open */ -if (flags & (O_TRUNC |O_CREAT |O_TMPFILE )) +if (flags & (O_TRUNC |O_CREAT | __O_TMPFILE))return -EAGAIN ; lookup_flags |=LOOKUP_CACHED ; }
Greg Kroah-Hartman
maintainerPATCH 128/165 drm/ttm: check null pointer before accessing when swapping
In reply to Greg Kroah-HartmanFrom: Guchun Chen <[email protected]>
commit 2dedcf414bb01b8d966eb445db1d181d92304fb2 upstream.
Add a check to avoid null pointer dereference as below:
[ 90.002283] general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] PREEMPT SMP KASAN NOPTI [ 90.002292] KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] [ 90.002346] ? exc_general_protection+0x159/0x240 [ 90.002352] ? asm_exc_general_protection+0x26/0x30 [ 90.002357] ? ttm_bo_evict_swapout_allowable+0x322/0x5e0 [ttm] [ 90.002365] ? ttm_bo_evict_swapout_allowable+0x42e/0x5e0 [ttm] [ 90.002373] ttm_bo_swapout+0x134/0x7f0 [ttm] [ 90.002383] ? __pfx_ttm_bo_swapout+0x10/0x10 [ttm] [ 90.002391] ? lock_acquire+0x44d/0x4f0 [ 90.002398] ? ttm_device_swapout+0xa5/0x260 [ttm] [ 90.002412] ? lock_acquired+0x355/0xa00 [ 90.002416] ? do_raw_spin_trylock+0xb6/0x190 [ 90.002421] ? __pfx_lock_acquired+0x10/0x10 [ 90.002426] ? ttm_global_swapout+0x25/0x210 [ttm] [ 90.002442] ttm_device_swapout+0x198/0x260 [ttm] [ 90.002456] ? __pfx_ttm_device_swapout+0x10/0x10 [ttm] [ 90.002472] ttm_global_swapout+0x75/0x210 [ttm] [ 90.002486] ttm_tt_populate+0x187/0x3f0 [ttm] [ 90.002501] ttm_bo_handle_move_mem+0x437/0x590 [ttm] [ 90.002517] ttm_bo_validate+0x275/0x430 [ttm] [ 90.002530] ? __pfx_ttm_bo_validate+0x10/0x10 [ttm] [ 90.002544] ? kasan_save_stack+0x33/0x60 [ 90.002550] ? kasan_set_track+0x25/0x30 [ 90.002554] ? __kasan_kmalloc+0x8f/0xa0 [ 90.002558] ? amdgpu_gtt_mgr_new+0x81/0x420 [amdgpu] [ 90.003023] ? ttm_resource_alloc+0xf6/0x220 [ttm] [ 90.003038] amdgpu_bo_pin_restricted+0x2dd/0x8b0 [amdgpu] [ 90.003210] ? __x64_sys_ioctl+0x131/0x1a0 [ 90.003210] ? do_syscall_64+0x60/0x90
--- drivers/gpu/drm/ttm/ttm_bo.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/ttm/ttm_bo.c +2 -1
@@ -519,7 +519,8 @@ static bool ttm_bo_evict_swapout_allowabif (bo->pin_count) { *locked = false; - *busy = false; +if (busy) + *busy = false;return false; }
Greg Kroah-Hartman
maintainerPATCH 129/165 drm/i915: Fix premature release of requests reusable memory
In reply to Greg Kroah-HartmanFrom: Janusz Krzysztofik <[email protected]>
commit a337b64f0d5717248a0c894e2618e658e6a9de9f upstream.
Infinite waits for completion of GPU activity have been observed in CI, mostly inside __i915_active_wait(), triggered by igt@gem_barrier_race or igt@perf@stress-open-close. Root cause analysis, based of ftrace dumps generated with a lot of extra trace_printk() calls added to the code, revealed loops of request dependencies being accidentally built, preventing the requests from being processed, each waiting for completion of another one's activity.
After we substitute a new request for a last active one tracked on a timeline, we set up a dependency of our new request to wait on completion of current activity of that previous one. While doing that, we must take care of keeping the old request still in memory until we use its attributes for setting up that await dependency, or we can happen to set up the await dependency on an unrelated request that already reuses the memory previously allocated to the old one, already released. Combined with perf adding consecutive kernel context remote requests to different user context timelines, unresolvable loops of await dependencies can be built, leading do infinite waits.
We obtain a pointer to the previous request to wait upon when we substitute it with a pointer to our new request in an active tracker, e.g. in intel_timeline.last_request. In some processing paths we protect that old request from being freed before we use it by getting a reference to it under RCU protection, but in others, e.g. __i915_request_commit() -> __i915_request_add_to_timeline() -> __i915_request_ensure_ordering(), we don't. But anyway, since the requests' memory is SLAB_FAILSAFE_BY_RCU, that RCU protection is not sufficient against reuse of memory.
We could protect i915_request's memory from being prematurely reused by calling its release function via call_rcu() and using rcu_read_lock() consequently, as proposed in v1. However, that approach leads to significant (up to 10 times) increase of SLAB utilization by i915_request SLAB cache. Another potential approach is to take a reference to the previous active fence.
When updating an active fence tracker, we first lock the new fence, substitute a pointer of the current active fence with the new one, then we lock the substituted fence. With this approach, there is a time window after the substitution and before the lock when the request can be concurrently released by an interrupt handler and its memory reused, then we may happen to lock and return a new, unrelated request.
Always get a reference to the current active fence first, before replacing it with a new one. Having it protected from premature release and reuse, lock it and then replace with the new one but only if not yet signalled via a potential concurrent interrupt nor replaced with another one by a potential concurrent thread, otherwise retry, starting from getting a reference to the new current one. Adjust users to not get a reference to the previous active fence themselves and always put the reference got by __i915_active_fence_set() when no longer needed.
v3: Fix lockdep splat reports and other issues caused by incorrect use of
try_cmpxchg() (use (cmpxchg() != prev) instead)
v2: Protect request's memory by getting a reference to it in favor of
delegating its release to call_rcu() (Chris)
--- drivers/gpu/drm/i915/i915_active.c | 99 +++++++++++++++++++++++++----------- drivers/gpu/drm/i915/i915_request.c | 11 ++++ 2 files changed, 81 insertions(+), 29 deletions(-)
drivers/gpu/drm/i915/i915_active.c +70 -29
@@ -449,8 +449,11 @@ int i915_active_add_request(struct i915_ } }while (unlikely (is_barrier (active))); -if (!__i915_active_fence_set (active, fence)) + fence =__i915_active_fence_set (active, fence); +if (!fence)__i915_active_acquire (ref); +else +dma_fence_put (fence); out:i915_active_release (ref);
@@ -469,13 +472,9 @@ __i915_active_set_fence(struct i915_actireturn NULL ; } -rcu_read_lock (); prev =__i915_active_fence_set (active, fence); -if (prev) - prev =dma_fence_get_rcu (prev); -else +if (!prev)__i915_active_acquire (ref); -rcu_read_unlock ();return prev; }
@@ -1019,10 +1018,11 @@ void i915_request_add_active_barriers(st* * Records the new @fence as the last active fence along its timeline in * this active tracker, moving the tracking callbacks from the previous -* fence onto this one. Returns the previous fence (if not already completed), -* which the caller must ensure is executed before the new fence. To ensure -* that the order of fences within the timeline of the i915_active_fence is -* understood, it should be locked by the caller. +* fence onto this one. Gets and returns a reference to the previous fence +* (if not already completed), which the caller must put after making sure +* that it is executed before the new fence. To ensure that the order of +* fences within the timeline of the i915_active_fence is understood, it +* should be locked by the caller. */ struct dma_fence * __i915_active_fence_set(struct i915_active_fence *active,
@@ -1031,7 +1031,23 @@ __i915_active_fence_set(struct i915_actistruct dma_fence *prev;unsigned long flags; -if (fence ==rcu_access_pointer (active->fence)) +/* +* In case of fences embedded in i915_requests, their memory is +* SLAB_FAILSAFE_BY_RCU, then it can be reused right after release +* by new requests. Then, there is a risk of passing back a pointer +* to a new, completely unrelated fence that reuses the same memory +* while tracked under a different active tracker. Combined with i915 +* perf open/close operations that build await dependencies between +* engine kernel context requests and user requests from different +* timelines, this can lead to dependency loops and infinite waits. +* +* As a countermeasure, we try to get a reference to the active->fence +* first, so if we succeed and pass it back to our user then it is not +* released and potentially reused by an unrelated request before the +* user has a chance to set up an await dependency on it. +*/ + prev =i915_active_fence_get (active); +if (fence == prev)return fence;GEM_BUG_ON (test_bit (DMA_FENCE_FLAG_SIGNALED_BIT , &fence->flags));
@@ -1040,27 +1056,56 @@ __i915_active_fence_set(struct i915_acti* Consider that we have two threads arriving (A and B), with * C already resident as the active->fence. * -* A does the xchg first, and so it sees C or NULL depending -* on the timing of the interrupt handler. If it is NULL, the -* previous fence must have been signaled and we know that -* we are first on the timeline. If it is still present, -* we acquire the lock on that fence and serialise with the interrupt -* handler, in the process removing it from any future interrupt -* callback. A will then wait on C before executing (if present). -* -* As B is second, it sees A as the previous fence and so waits for -* it to complete its transition and takes over the occupancy for -* itself -- remembering that it needs to wait on A before executing. +* Both A and B have got a reference to C or NULL, depending on the +* timing of the interrupt handler. Let's assume that if A has got C +* then it has locked C first (before B). * * Note the strong ordering of the timeline also provides consistent * nesting rules for the fence->lock; the inner lock is always the * older lock. */ spin_lock_irqsave (fence->lock, flags); - prev =xchg (__active_fence_slot (active), fence); -if (prev) { -GEM_BUG_ON (prev == fence); +if (prev)spin_lock_nested (prev->lock,SINGLE_DEPTH_NESTING ); + +/* +* A does the cmpxchg first, and so it sees C or NULL, as before, or +* something else, depending on the timing of other threads and/or +* interrupt handler. If not the same as before then A unlocks C if +* applicable and retries, starting from an attempt to get a new +* active->fence. Meanwhile, B follows the same path as A. +* Once A succeeds with cmpxch, B fails again, retires, gets A from +* active->fence, locks it as soon as A completes, and possibly +* succeeds with cmpxchg. +*/ +while (cmpxchg (__active_fence_slot (active), prev, fence) != prev) { +if (prev) { +spin_unlock (prev->lock); +dma_fence_put (prev); + } +spin_unlock_irqrestore (fence->lock, flags); + + prev =i915_active_fence_get (active); +GEM_BUG_ON (prev == fence); + +spin_lock_irqsave (fence->lock, flags); +if (prev) +spin_lock_nested (prev->lock,SINGLE_DEPTH_NESTING ); + } + +/* +* If prev is NULL then the previous fence must have been signaled +* and we know that we are first on the timeline. If it is still +* present then, having the lock on that fence already acquired, we +* serialise with the interrupt handler, in the process of removing it +* from any future interrupt callback. A will then wait on C before +* executing (if present). +* +* As B is second, it sees A as the previous fence and so waits for +* it to complete its transition and takes over the occupancy for +* itself -- remembering that it needs to wait on A before executing. +*/ +if (prev) {__list_del_entry (&active->cb.node);spin_unlock (prev->lock);/* serialise with prev->cb_list */ }
@@ -1077,11 +1122,7 @@ int i915_active_fence_set(struct i915_acint err =0 ;/* Must maintain timeline ordering wrt previous active requests */ -rcu_read_lock (); fence =__i915_active_fence_set (active, &rq->fence); -if (fence)/* but the previous fence may not belong to that timeline! */ - fence =dma_fence_get_rcu (fence); -rcu_read_unlock ();if (fence) { err =i915_request_await_dma_fence (rq, fence);dma_fence_put (fence);
drivers/gpu/drm/i915/i915_request.c +11 -0
@@ -1661,6 +1661,11 @@ __i915_request_ensure_parallel_ordering(request_to_parent (rq)->parallel.last_rq =i915_request_get (rq); +/* +* Users have to put a reference potentially got by +* __i915_active_fence_set() to the returned request +* when no longer needed +*/ return to_request (__i915_active_fence_set (&timeline->last_request, &rq->fence)); }
@@ -1707,6 +1712,10 @@ __i915_request_ensure_ordering(struct i9 0); } +/* +* Users have to put the reference to prev potentially got +* by __i915_active_fence_set() when no longer needed +*/ return prev; }
@@ -1760,6 +1769,8 @@ __i915_request_add_to_timeline(struct i9 prev =__i915_request_ensure_ordering (rq, timeline); else prev =__i915_request_ensure_parallel_ordering (rq, timeline); +if (prev) +i915_request_put (prev);/* * Make sure that no request gazumped us - if it was allocated after
Greg Kroah-Hartman
maintainerPATCH 130/165 drm/i915/gt: Cleanup aux invalidation registers
In reply to Greg Kroah-HartmanFrom: Andi Shyti <[email protected]>
commit d14560ac1b595aa2e792365e91fea6aeaee66c2b upstream.
Fix the 'NV' definition postfix that is supposed to be INV.
Take the chance to also order properly the registers based on their address and call the GEN12_GFX_CCS_AUX_INV address as GEN12_CCS_AUX_INV like all the other similar registers.
Remove also VD1, VD3 and VE1 registers that don't exist and add BCS0 and CCS0.
--- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 8 ++++---- drivers/gpu/drm/i915/gt/intel_gt_regs.h | 16 ++++++++-------- drivers/gpu/drm/i915/gt/intel_lrc.c | 6 +++--- 3 files changed, 15 insertions(+), 15 deletions(-)
drivers/gpu/drm/i915/gt/gen8_engine_cs.c +4 -4
@@ -256,8 +256,8 @@ int gen12_emit_flush_rcs(struct i915_reqif (!HAS_FLAT_CCS (rq->engine->i915)) {/* hsdes: 1809175790 */ - cs =gen12_emit_aux_table_inv (rq->engine->gt, - cs,GEN12_GFX_CCS_AUX_NV ); + cs =gen12_emit_aux_table_inv (rq->engine->gt, cs, +GEN12_CCS_AUX_INV ); } *cs++ =preparser_disable (false);
@@ -317,10 +317,10 @@ int gen12_emit_flush_xcs(struct i915_reqif (aux_inv) {/* hsdes: 1809175790 */ if (rq->engine->class ==VIDEO_DECODE_CLASS ) cs =gen12_emit_aux_table_inv (rq->engine->gt, - cs,GEN12_VD0_AUX_NV ); + cs,GEN12_VD0_AUX_INV );else cs =gen12_emit_aux_table_inv (rq->engine->gt, - cs,GEN12_VE0_AUX_NV ); + cs,GEN12_VE0_AUX_INV ); }if (mode &EMIT_INVALIDATE )
drivers/gpu/drm/i915/gt/intel_gt_regs.h +8 -8
@@ -331,9 +331,11 @@#define GEN8_PRIVATE_PAT_HI _MMIO(0x40e0 + 4)#define GEN10_PAT_INDEX (index) _MMIO(0x40e0 + (index) * 4)#define BSD_HWS_PGA_GEN7 _MMIO(0x4180) -#define GEN12_GFX_CCS_AUX_NV _MMIO(0x4208) -#define GEN12_VD0_AUX_NV _MMIO(0x4218) -#define GEN12_VD1_AUX_NV _MMIO(0x4228) + +#define GEN12_CCS_AUX_INV _MMIO(0x4208) +#define GEN12_VD0_AUX_INV _MMIO(0x4218) +#define GEN12_VE0_AUX_INV _MMIO(0x4238) +#define GEN12_BCS0_AUX_INV _MMIO(0x4248)#define GEN8_RTCR _MMIO(0x4260)#define GEN8_M1TCR _MMIO(0x4264)
@@ -341,14 +343,12 @@#define GEN8_BTCR _MMIO(0x426c)#define GEN8_VTCR _MMIO(0x4270) -#define GEN12_VD2_AUX_NV _MMIO(0x4298) -#define GEN12_VD3_AUX_NV _MMIO(0x42a8) -#define GEN12_VE0_AUX_NV _MMIO(0x4238) -#define BLT_HWS_PGA_GEN7 _MMIO(0x4280) -#define GEN12_VE1_AUX_NV _MMIO(0x42b8) +#define GEN12_VD2_AUX_INV _MMIO(0x4298) +#define GEN12_CCS0_AUX_INV _MMIO(0x42c8)#define AUX_INV REG_BIT(0) +#define VEBOX_HWS_PGA_GEN7 _MMIO(0x4380)#define GEN12_AUX_ERR_DBG _MMIO(0x43f4)
drivers/gpu/drm/i915/gt/intel_lrc.c +3 -3
@@ -1367,7 +1367,7 @@ gen12_emit_indirect_ctx_rcs(const struct/* hsdes: 1809175790 */ if (!HAS_FLAT_CCS (ce->engine->i915)) cs =gen12_emit_aux_table_inv (ce->engine->gt, - cs,GEN12_GFX_CCS_AUX_NV ); + cs,GEN12_CCS_AUX_INV );/* Wa_16014892111 */ if (IS_DG2 (ce->engine->i915))
@@ -1394,10 +1394,10 @@ gen12_emit_indirect_ctx_xcs(const structif (!HAS_FLAT_CCS (ce->engine->i915)) {if (ce->engine->class ==VIDEO_DECODE_CLASS ) cs =gen12_emit_aux_table_inv (ce->engine->gt, - cs,GEN12_VD0_AUX_NV ); + cs,GEN12_VD0_AUX_INV );else if (ce->engine->class ==VIDEO_ENHANCEMENT_CLASS ) cs =gen12_emit_aux_table_inv (ce->engine->gt, - cs,GEN12_VE0_AUX_NV ); + cs,GEN12_VE0_AUX_INV ); }return cs;
Greg Kroah-Hartman
maintainerPATCH 131/165 Revert "page cache: fix page_cache_next/prev_miss off by one"
In reply to Greg Kroah-HartmanFrom: Mike Kravetz <[email protected]>
commit 16f8eb3eea9eb2a1568279d64ca4dc977e7aa538 upstream.
This reverts commit 9425c591e06a9ab27a145ba655fb50532cf0bcc9
The reverted commit fixed up routines primarily used by readahead code such that they could also be used by hugetlb. Unfortunately, this caused a performance regression as pointed out by the Closes: tag.
The hugetlb code which uses page_cache_next_miss will be addressed in a subsequent patch.
--- mm/filemap.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-)
mm/filemap.c +10 -16
@@ -1760,9 +1760,7 @@ bool __folio_lock_or_retry(struct folio* * Return: The index of the gap if found, otherwise an index outside the * range specified (in which case 'return - index >= max_scan' will be true). -* In the rare case of index wrap-around, 0 will be returned. 0 will also -* be returned if index == 0 and there is a gap at the index. We can not -* wrap-around if passed index == 0. +* In the rare case of index wrap-around, 0 will be returned. */ pgoff_t page_cache_next_miss (struct address_space *mapping,pgoff_t index,unsigned long max_scan)
@@ -1772,13 +1770,12 @@ pgoff_t page_cache_next_miss(struct addrwhile (max_scan--) {void *entry =xas_next (&xas);if (!entry ||xa_is_value (entry)) -return xas.xa_index; -if (xas.xa_index ==0 && index !=0 ) -return xas.xa_index; +break ; +if (xas.xa_index ==0 ) +break ; } -/* No gaps in range and no wrap-around, return index beyond range */ -return xas.xa_index +1 ; +return xas.xa_index; }EXPORT_SYMBOL (page_cache_next_miss);
@@ -1799,9 +1796,7 @@ EXPORT_SYMBOL(page_cache_next_miss);* * Return: The index of the gap if found, otherwise an index outside the * range specified (in which case 'index - return >= max_scan' will be true). -* In the rare case of wrap-around, ULONG_MAX will be returned. ULONG_MAX -* will also be returned if index == ULONG_MAX and there is a gap at the -* index. We can not wrap-around if passed index == ULONG_MAX. +* In the rare case of wrap-around, ULONG_MAX will be returned. */ pgoff_t page_cache_prev_miss (struct address_space *mapping,pgoff_t index,unsigned long max_scan)
@@ -1811,13 +1806,12 @@ pgoff_t page_cache_prev_miss(struct addrwhile (max_scan--) {void *entry =xas_prev (&xas);if (!entry ||xa_is_value (entry)) -return xas.xa_index; -if (xas.xa_index ==ULONG_MAX && index !=ULONG_MAX ) -return xas.xa_index; +break ; +if (xas.xa_index ==ULONG_MAX ) +break ; } -/* No gaps in range and no wrap-around, return index beyond range */ -return xas.xa_index -1 ; +return xas.xa_index; }EXPORT_SYMBOL (page_cache_prev_miss);
Greg Kroah-Hartman
maintainerPATCH 132/165 sunvnet: fix sparc64 build error after gso code split
In reply to Greg Kroah-HartmanFrom: Stephen Rothwell <[email protected]>
commit d9ffa069e006fa2873b94fbf2387546942d4f85b upstream.
After merging the net-next tree, today's linux-next build (sparc64 defconfig) failed like this:
drivers/net/ethernet/sun/sunvnet_common.c: In function 'vnet_handle_offloads':drivers/net/ethernet/sun/sunvnet_common.c:1277:16: error: implicit declaration of function 'skb_gso_segment'; did you mean 'skb_gso_reset'? [-Werror=implicit-function-declaration]
1277 | segs = skb_gso_segment(skb, dev->features & ~NETIF_F_TSO);
| ^~~~~~~~~~~~~~~
| skb_gso_resetdrivers/net/ethernet/sun/sunvnet_common.c:1277:14: warning: assignment to 'struct sk_buff *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
1277 | segs = skb_gso_segment(skb, dev->features & ~NETIF_F_TSO);
| ^
--- drivers/net/ethernet/sun/sunvnet_common.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/sun/sunvnet_common.c +1 -0
@@ -25,6 +25,7 @@#endif #include <net/ip.h> +#include <net/gso.h> #include <net/icmp.h> #include <net/route.h>
Greg Kroah-Hartman
maintainerPATCH 133/165 clk: imx93: Propagate correct error in imx93_clocks_probe()
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
commit a29b2fccf5f2689a9637be85ff1f51c834c6fb33 upstream.
smatch reports:
drivers/clk/imx/clk-imx93.c:294 imx93_clocks_probe() error: uninitialized symbol 'base'.
Indeed, in case of an error, the wrong (yet uninitialized) variable is converted to an error code and returned.
Fix this by propagating the error code in the correct variable.
--- drivers/clk/imx/clk-imx93.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/imx/clk-imx93.c +1 -1
@@ -291,7 +291,7 @@ static int imx93_clocks_probe(struct pla anatop_base =devm_of_iomap (dev, np,0 ,NULL );of_node_put (np);if (WARN_ON (IS_ERR (anatop_base))) { - ret =PTR_ERR (base); + ret =PTR_ERR (anatop_base); goto unregister_hws; }
Greg Kroah-Hartman
maintainerPATCH 134/165 file: reinstate f_pos locking optimization for regular files
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 797964253d358cf8d705614dda394dbe30120223 upstream.
In commit 20ea1e7d13c1 ("file: always lock position for FMODE_ATOMIC_POS") we ended up always taking the file pos lock, because pidfd_getfd() could get a reference to the file even when it didn't have an elevated file count due to threading of other sharing cases.
But Mateusz Guzik reports that the extra locking is actually measurable, so let's re-introduce the optimization, and only force the locking for directory traversal.
Directories need the lock for correctness reasons, while regular files only need it for "POSIX semantics". Since pidfd_getfd() is about debuggers etc special things that are _way_ outside of POSIX, we can relax the rules for that case.
--- fs/file.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
fs/file.c +17 -1
@@ -1036,12 +1036,28 @@ unsigned long __fdget_raw(unsigned int freturn __fget_light (fd,0 ); } +/* +* Try to avoid f_pos locking. We only need it if the +* file is marked for FMODE_ATOMIC_POS, and it can be +* accessed multiple ways. +* +* Always do it for directories, because pidfd_getfd() +* can make a file accessible even if it otherwise would +* not be, and for directories this is a correctness +* issue, not a "POSIX requirement". +*/ +static inline bool file_needs_f_pos_lock (struct file *file) +{ +return (file->f_mode &FMODE_ATOMIC_POS ) && + (file_count (file) >1 ||S_ISDIR (file_inode (file)->i_mode)); +} +unsigned long __fdget_pos (unsigned int fd) {unsigned long v =__fdget (fd);struct file *file = (struct file *)(v & ~3 ); -if (file && (file->f_mode &FMODE_ATOMIC_POS )) { +if (file &&file_needs_f_pos_lock (file)) { v |=FDPUT_POS_UNLOCK ;mutex_lock (&file->f_pos_lock); }
Greg Kroah-Hartman
maintainerPATCH 135/165 mm: kmem: fix a NULL pointer dereference in obj_stock_flush_required()
In reply to Greg Kroah-HartmanFrom: Roman Gushchin <[email protected]>
commit 3b8abb3239530c423c0b97e42af7f7e856e1ee96 upstream.
KCSAN found an issue in obj_stock_flush_required():stock->cached_objcg can be reset between the check and dereference:
==================================================================
BUG: KCSAN: data-race in drain_all_stock / drain_obj_stock
write to 0xffff888237c2a2f8 of 8 bytes by task 19625 on cpu 0:
drain_obj_stock+0x408/0x4e0 mm/memcontrol.c:3306 refill_obj_stock+0x9c/0x1e0 mm/memcontrol.c:3340 obj_cgroup_uncharge+0xe/0x10 mm/memcontrol.c:3408 memcg_slab_free_hook mm/slab.h:587 [inline] __cache_free mm/slab.c:3373 [inline] __do_kmem_cache_free mm/slab.c:3577 [inline] kmem_cache_free+0x105/0x280 mm/slab.c:3602 __d_free fs/dcache.c:298 [inline] dentry_free fs/dcache.c:375 [inline] __dentry_kill+0x422/0x4a0 fs/dcache.c:621 dentry_kill+0x8d/0x1e0 dput+0x118/0x1f0 fs/dcache.c:913 __fput+0x3bf/0x570 fs/file_table.c:329 ____fput+0x15/0x20 fs/file_table.c:349 task_work_run+0x123/0x160 kernel/task_work.c:179 resume_user_mode_work include/linux/resume_user_mode.h:49 [inline] exit_to_user_mode_loop+0xcf/0xe0 kernel/entry/common.c:171 exit_to_user_mode_prepare+0x6a/0xa0 kernel/entry/common.c:203 __syscall_exit_to_user_mode_work kernel/entry/common.c:285 [inline] syscall_exit_to_user_mode+0x26/0x140 kernel/entry/common.c:296 do_syscall_64+0x4d/0xc0 arch/x86/entry/common.c:86 entry_SYSCALL_64_after_hwframe+0x63/0xcd
read to 0xffff888237c2a2f8 of 8 bytes by task 19632 on cpu 1:
obj_stock_flush_required mm/memcontrol.c:3319 [inline] drain_all_stock+0x174/0x2a0 mm/memcontrol.c:2361 try_charge_memcg+0x6d0/0xd10 mm/memcontrol.c:2703 try_charge mm/memcontrol.c:2837 [inline] mem_cgroup_charge_skmem+0x51/0x140 mm/memcontrol.c:7290 sock_reserve_memory+0xb1/0x390 net/core/sock.c:1025 sk_setsockopt+0x800/0x1e70 net/core/sock.c:1525 udp_lib_setsockopt+0x99/0x6c0 net/ipv4/udp.c:2692 udp_setsockopt+0x73/0xa0 net/ipv4/udp.c:2817 sock_common_setsockopt+0x61/0x70 net/core/sock.c:3668 __sys_setsockopt+0x1c3/0x230 net/socket.c:2271 __do_sys_setsockopt net/socket.c:2282 [inline] __se_sys_setsockopt net/socket.c:2279 [inline] __x64_sys_setsockopt+0x66/0x80 net/socket.c:2279 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
value changed: 0xffff8881382d52c0 -> 0xffff888138893740
Reported by Kernel Concurrency Sanitizer on:
CPU: 1 PID: 19632 Comm: syz-executor.0 Not tainted 6.3.0-rc2-syzkaller-00387-g534293368afa #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/02/2023
Fix it by using READ_ONCE()/WRITE_ONCE() for all accesses to stock->cached_objcg.
--- mm/memcontrol.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
mm/memcontrol.c +10 -9
@@ -3208,12 +3208,12 @@ void mod_objcg_state(struct obj_cgroup ** accumulating over a page of vmstat data or when pgdat or idx * changes. */ -if (stock->cached_objcg != objcg) { +if (READ_ONCE (stock->cached_objcg) != objcg) { old =drain_obj_stock (stock);obj_cgroup_get (objcg); stock->nr_bytes =atomic_read (&objcg->nr_charged_bytes) ?atomic_xchg (&objcg->nr_charged_bytes,0 ) :0 ; - stock->cached_objcg = objcg; +WRITE_ONCE (stock->cached_objcg, objcg); stock->cached_pgdat = pgdat; }else if (stock->cached_pgdat != pgdat) {/* Flush the existing cached vmstat data */
@@ -3267,7 +3267,7 @@ static bool consume_obj_stock(struct objlocal_lock_irqsave (&memcg_stock.stock_lock, flags); stock =this_cpu_ptr (&memcg_stock); -if (objcg == stock->cached_objcg && stock->nr_bytes >= nr_bytes) { +if (objcg ==READ_ONCE (stock->cached_objcg) && stock->nr_bytes >= nr_bytes) { stock->nr_bytes -= nr_bytes; ret = true; }
@@ -3279,7 +3279,7 @@ static bool consume_obj_stock(struct objstatic struct obj_cgroup *drain_obj_stock (struct memcg_stock_pcp *stock) { -struct obj_cgroup *old = stock->cached_objcg; +struct obj_cgroup *old =READ_ONCE (stock->cached_objcg);if (!old)return NULL ;
@@ -3332,7 +3332,7 @@ static struct obj_cgroup *drain_obj_stoc stock->cached_pgdat =NULL ; } - stock->cached_objcg =NULL ; +WRITE_ONCE (stock->cached_objcg,NULL );/* * The `old' objects needs to be released by the caller via * obj_cgroup_put() outside of memcg_stock_pcp::stock_lock.
@@ -3343,10 +3343,11 @@ static struct obj_cgroup *drain_obj_stocstatic bool obj_stock_flush_required (struct memcg_stock_pcp *stock,struct mem_cgroup *root_memcg) { +struct obj_cgroup *objcg =READ_ONCE (stock->cached_objcg);struct mem_cgroup *memcg; -if (stock->cached_objcg) { - memcg =obj_cgroup_memcg (stock->cached_objcg); +if (objcg) { + memcg =obj_cgroup_memcg (objcg);if (memcg &&mem_cgroup_is_descendant (memcg, root_memcg))return true; }
@@ -3365,10 +3366,10 @@ static void refill_obj_stock(struct obj_local_lock_irqsave (&memcg_stock.stock_lock, flags); stock =this_cpu_ptr (&memcg_stock); -if (stock->cached_objcg != objcg) {/* reset if necessary */ +if (READ_ONCE (stock->cached_objcg) != objcg) {/* reset if necessary */ old =drain_obj_stock (stock);obj_cgroup_get (objcg); - stock->cached_objcg = objcg; +WRITE_ONCE (stock->cached_objcg, objcg); stock->nr_bytes =atomic_read (&objcg->nr_charged_bytes) ?atomic_xchg (&objcg->nr_charged_bytes,0 ) :0 ; allow_uncharge = true;/* Allow uncharge when objcg changes */
Greg Kroah-Hartman
maintainerPATCH 136/165 fs/ntfs3: Use __GFP_NOWARN allocation at ntfs_load_attr_list()
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit ea303f72d70ce2f0b0aa94ab127085289768c5a6 upstream.
syzbot is reporting too large allocation at ntfs_load_attr_list(), for a crafted filesystem can have huge data_size.
--- fs/ntfs3/attrlist.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/ntfs3/attrlist.c +2 -2
@@ -52,7 +52,7 @@ int ntfs_load_attr_list(struct ntfs_inodif (!attr->non_res) { lsize =le32_to_cpu (attr->res.data_size); - le =kmalloc (al_aligned (lsize),GFP_NOFS ); + le =kmalloc (al_aligned (lsize),GFP_NOFS | __GFP_NOWARN);if (!le) { err = -ENOMEM ; goto out;
@@ -80,7 +80,7 @@ int ntfs_load_attr_list(struct ntfs_inodif (err <0 ) goto out; - le =kmalloc (al_aligned (lsize),GFP_NOFS ); + le =kmalloc (al_aligned (lsize),GFP_NOFS | __GFP_NOWARN);if (!le) { err = -ENOMEM ; goto out;
Greg Kroah-Hartman
maintainerPATCH 137/165 kasan,kmsan: remove __GFP_KSWAPD_RECLAIM usage from kasan/kmsan
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit 726ccdba1521007fab4b2b7565d255fa0f2b770c upstream.
syzbot is reporting lockdep warning in __stack_depot_save(), for the caller of __stack_depot_save() (i.e. __kasan_record_aux_stack() in this report) is responsible for masking __GFP_KSWAPD_RECLAIM flag in order not to wake kswapd which in turn wakes kcompactd.
Since kasan/kmsan functions might be called with arbitrary locks held, mask __GFP_KSWAPD_RECLAIM flag from all GFP_NOWAIT/GFP_ATOMIC allocations in kasan/kmsan.
Note that kmsan_save_stack_with_flags() is changed to mask both __GFP_DIRECT_RECLAIM flag and __GFP_KSWAPD_RECLAIM flag, for wakeup_kswapd() from wake_all_kswapds() from __alloc_pages_slowpath() calls wakeup_kcompactd() if __GFP_KSWAPD_RECLAIM flag is set and __GFP_DIRECT_RECLAIM flag is not set.
--- mm/kasan/generic.c | 4 ++-- mm/kasan/tags.c | 2 +- mm/kmsan/core.c | 6 +++--- mm/kmsan/instrumentation.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-)
mm/kasan/generic.c +2 -2
@@ -489,7 +489,7 @@ static void __kasan_record_aux_stack(voireturn ; alloc_meta->aux_stack[1 ] = alloc_meta->aux_stack[0 ]; - alloc_meta->aux_stack[0 ] =kasan_save_stack (GFP_NOWAIT , can_alloc); + alloc_meta->aux_stack[0 ] =kasan_save_stack (0 , can_alloc); }void kasan_record_aux_stack (void *addr)
@@ -519,7 +519,7 @@ void kasan_save_free_info(struct kmem_caif (!free_meta)return ; -kasan_set_track (&free_meta->free_track,GFP_NOWAIT ); +kasan_set_track (&free_meta->free_track,0 );/* The object was freed and has free track set. */ *(u8 *)kasan_mem_to_shadow (object) =KASAN_SLAB_FREETRACK ; }
mm/kasan/tags.c +1 -1
@@ -140,5 +140,5 @@ void kasan_save_alloc_info(struct kmem_cvoid kasan_save_free_info (struct kmem_cache *cache,void *object) { -save_stack_info (cache, object,GFP_NOWAIT , true); +save_stack_info (cache, object,0 , true); }
mm/kmsan/core.c +3 -3
@@ -74,7 +74,7 @@ depot_stack_handle_t kmsan_save_stack_wi nr_entries =stack_trace_save (entries,KMSAN_STACK_DEPTH ,0 );/* Don't sleep. */ - flags &= ~__GFP_DIRECT_RECLAIM; + flags &= ~(__GFP_DIRECT_RECLAIM | __GFP_KSWAPD_RECLAIM); handle =__stack_depot_save (entries, nr_entries, flags, true);return stack_depot_set_extra_bits (handle, extra);
@@ -245,7 +245,7 @@ depot_stack_handle_t kmsan_internal_chai extra_bits =kmsan_extra_bits (depth, uaf); entries[0 ] =KMSAN_CHAIN_MAGIC_ORIGIN ; - entries[1 ] =kmsan_save_stack_with_flags (GFP_ATOMIC ,0 ); + entries[1 ] =kmsan_save_stack_with_flags (__GFP_HIGH,0 ); entries[2 ] = id;/* * @entries is a local var in non-instrumented code, so KMSAN does not
@@ -253,7 +253,7 @@ depot_stack_handle_t kmsan_internal_chai* positives when __stack_depot_save() passes it to instrumented code. */ kmsan_internal_unpoison_memory (entries,sizeof (entries), false); - handle =__stack_depot_save (entries,ARRAY_SIZE (entries),GFP_ATOMIC , + handle =__stack_depot_save (entries,ARRAY_SIZE (entries), __GFP_HIGH, true);return stack_depot_set_extra_bits (handle, extra_bits); }
mm/kmsan/instrumentation.c +1 -1
@@ -282,7 +282,7 @@ void __msan_poison_alloca(void *address,/* stack_depot_save() may allocate memory. */ kmsan_enter_runtime (); - handle =stack_depot_save (entries,ARRAY_SIZE (entries),GFP_ATOMIC ); + handle =stack_depot_save (entries,ARRAY_SIZE (entries), __GFP_HIGH);kmsan_leave_runtime (); kmsan_internal_set_shadow_origin(address, size, -1, handle,
Greg Kroah-Hartman
maintainerPATCH 138/165 fs/sysv: Null check to prevent null-ptr-deref bug
In reply to Greg Kroah-HartmanFrom: Prince Kumar Maurya <[email protected]>
commit ea2b62f305893992156a798f665847e0663c9f41 upstream.
sb_getblk(inode->i_sb, parent) return a null ptr and taking lock on that leads to the null-ptr-deref bug.
Message-Id: <[email protected]>
--- fs/sysv/itree.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/sysv/itree.c +4 -0
@@ -145,6 +145,10 @@ static int alloc_branch(struct inode *in*/ parent =block_to_cpu (SYSV_SB (inode->i_sb), branch[n-1 ].key); bh =sb_getblk (inode->i_sb, parent); +if (!bh) { +sysv_free_block (inode->i_sb, branch[n].key); +break ; + }lock_buffer (bh);memset (bh->b_data,0 , blocksize); branch[n].bh = bh;
Greg Kroah-Hartman
maintainerPATCH 139/165 Bluetooth: L2CAP: Fix use-after-free in l2cap_sock_ready_cb
In reply to Greg Kroah-HartmanFrom: Sungwoo Kim <[email protected]>
commit 1728137b33c00d5a2b5110ed7aafb42e7c32e4a1 upstream.
l2cap_sock_release(sk) frees sk. However, sk's children are still alive and point to the already free'd sk's address.
To fix this, l2cap_sock_release(sk) also cleans sk's children.
==================================================================
BUG: KASAN: use-after-free in l2cap_sock_ready_cb+0xb7/0x100 net/bluetooth/l2cap_sock.c:1650 Read of size 8 at addr ffff888104617aa8 by task kworker/u3:0/276 CPU: 0 PID: 276 Comm: kworker/u3:0 Not tainted 6.2.0-00001-gef397bd4d5fb-dirty #59 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 Workqueue: hci2 hci_rx_work Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x72/0x95 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:306 [inline] print_report+0x175/0x478 mm/kasan/report.c:417 kasan_report+0xb1/0x130 mm/kasan/report.c:517 l2cap_sock_ready_cb+0xb7/0x100 net/bluetooth/l2cap_sock.c:1650 l2cap_chan_ready+0x10e/0x1e0 net/bluetooth/l2cap_core.c:1386 l2cap_config_req+0x753/0x9f0 net/bluetooth/l2cap_core.c:4480 l2cap_bredr_sig_cmd net/bluetooth/l2cap_core.c:5739 [inline] l2cap_sig_channel net/bluetooth/l2cap_core.c:6509 [inline] l2cap_recv_frame+0xe2e/0x43c0 net/bluetooth/l2cap_core.c:7788 l2cap_recv_acldata+0x6ed/0x7e0 net/bluetooth/l2cap_core.c:8506 hci_acldata_packet net/bluetooth/hci_core.c:3813 [inline] hci_rx_work+0x66e/0xbc0 net/bluetooth/hci_core.c:4048 process_one_work+0x4ea/0x8e0 kernel/workqueue.c:2289 worker_thread+0x364/0x8e0 kernel/workqueue.c:2436 kthread+0x1b9/0x200 kernel/kthread.c:376 ret_from_fork+0x2c/0x50 arch/x86/entry/entry_64.S:308 </TASK> Allocated by task 288: kasan_save_stack+0x22/0x50 mm/kasan/common.c:45 kasan_set_track+0x25/0x30 mm/kasan/common.c:52 ____kasan_kmalloc mm/kasan/common.c:374 [inline] __kasan_kmalloc+0x82/0x90 mm/kasan/common.c:383 kasan_kmalloc include/linux/kasan.h:211 [inline] __do_kmalloc_node mm/slab_common.c:968 [inline] __kmalloc+0x5a/0x140 mm/slab_common.c:981 kmalloc include/linux/slab.h:584 [inline] sk_prot_alloc+0x113/0x1f0 net/core/sock.c:2040 sk_alloc+0x36/0x3c0 net/core/sock.c:2093 l2cap_sock_alloc.constprop.0+0x39/0x1c0 net/bluetooth/l2cap_sock.c:1852 l2cap_sock_create+0x10d/0x220 net/bluetooth/l2cap_sock.c:1898 bt_sock_create+0x183/0x290 net/bluetooth/af_bluetooth.c:132 __sock_create+0x226/0x380 net/socket.c:1518 sock_create net/socket.c:1569 [inline] __sys_socket_create net/socket.c:1606 [inline] __sys_socket_create net/socket.c:1591 [inline] __sys_socket+0x112/0x200 net/socket.c:1639 __do_sys_socket net/socket.c:1652 [inline] __se_sys_socket net/socket.c:1650 [inline] __x64_sys_socket+0x40/0x50 net/socket.c:1650 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x3f/0x90 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x72/0xdc Freed by task 288: kasan_save_stack+0x22/0x50 mm/kasan/common.c:45 kasan_set_track+0x25/0x30 mm/kasan/common.c:52 kasan_save_free_info+0x2e/0x50 mm/kasan/generic.c:523 ____kasan_slab_free mm/kasan/common.c:236 [inline] ____kasan_slab_free mm/kasan/common.c:200 [inline] __kasan_slab_free+0x10a/0x190 mm/kasan/common.c:244 kasan_slab_free include/linux/kasan.h:177 [inline] slab_free_hook mm/slub.c:1781 [inline] slab_free_freelist_hook mm/slub.c:1807 [inline] slab_free mm/slub.c:3787 [inline] __kmem_cache_free+0x88/0x1f0 mm/slub.c:3800 sk_prot_free net/core/sock.c:2076 [inline] __sk_destruct+0x347/0x430 net/core/sock.c:2168 sk_destruct+0x9c/0xb0 net/core/sock.c:2183 __sk_free+0x82/0x220 net/core/sock.c:2194 sk_free+0x7c/0xa0 net/core/sock.c:2205 sock_put include/net/sock.h:1991 [inline] l2cap_sock_kill+0x256/0x2b0 net/bluetooth/l2cap_sock.c:1257 l2cap_sock_release+0x1a7/0x220 net/bluetooth/l2cap_sock.c:1428 __sock_release+0x80/0x150 net/socket.c:650 sock_close+0x19/0x30 net/socket.c:1368 __fput+0x17a/0x5c0 fs/file_table.c:320 task_work_run+0x132/0x1c0 kernel/task_work.c:179 resume_user_mode_work include/linux/resume_user_mode.h:49 [inline] exit_to_user_mode_loop kernel/entry/common.c:171 [inline] exit_to_user_mode_prepare+0x113/0x120 kernel/entry/common.c:203 __syscall_exit_to_user_mode_work kernel/entry/common.c:285 [inline] syscall_exit_to_user_mode+0x21/0x50 kernel/entry/common.c:296 do_syscall_64+0x4c/0x90 arch/x86/entry/common.c:86 entry_SYSCALL_64_after_hwframe+0x72/0xdc The buggy address belongs to the object at ffff888104617800 which belongs to the cache kmalloc-1k of size 1024
The buggy address is located 680 bytes inside of
1024-byte region [ffff888104617800, ffff888104617c00)
The buggy address belongs to the physical page:
page:00000000dbca6a80 refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff888104614000 pfn:0x104614
head:00000000dbca6a80 order:2 compound_mapcount:0 subpages_mapcount:0 compound_pincount:0
flags: 0x200000000010200(slab|head|node=0|zone=2)
raw: 0200000000010200 ffff888100041dc0 ffffea0004212c10 ffffea0004234b10
raw: ffff888104614000 0000000000080002 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff888104617980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff888104617a00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff888104617a80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff888104617b00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff888104617b80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================Ack: This bug is found by FuzzBT with a modified Syzkaller. Other contributors are Ruoyu Wu and Hui Peng.
--- net/bluetooth/l2cap_sock.c | 2 ++ 1 file changed, 2 insertions(+)
net/bluetooth/l2cap_sock.c +2 -0
@@ -46,6 +46,7 @@ static const struct proto_ops l2cap_sockstatic void l2cap_sock_init (struct sock *sk,struct sock *parent);static struct sock *l2cap_sock_alloc (struct net *net,struct socket *sock,int proto,gfp_t prio,int kern); +static void l2cap_sock_cleanup_listen (struct sock *parent);bool l2cap_is_socket (struct socket *sock) {
@@ -1415,6 +1416,7 @@ static int l2cap_sock_release(struct socif (!sk)return 0 ; +l2cap_sock_cleanup_listen (sk);bt_sock_unlink (&l2cap_sk_list, sk); err =l2cap_sock_shutdown (sock,SHUT_RDWR );
Greg Kroah-Hartman
maintainerPATCH 140/165 debugobjects: Recheck debug_objects_enabled before reporting
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit 8b64d420fe2450f82848178506d3e3a0bd195539 upstream.
syzbot is reporting false a positive ODEBUG message immediately after ODEBUG was disabled due to OOM.
[ 1062.309646][T22911] ODEBUG: Out of memory. ODEBUG disabled [ 1062.886755][ T5171] ------------[ cut here ]------------ [ 1062.892770][ T5171] ODEBUG: assert_init not available (active state 0) object: ffffc900056afb20 object type: timer_list hint: process_timeout+0x0/0x40
CPU 0 [ T5171] CPU 1 [T22911]
-------------- --------------
debug_object_assert_init() {
if (!debug_objects_enabled)
return;
db = get_bucket(addr);
lookup_object_or_alloc() {
debug_objects_enabled = 0;
return NULL;
}
debug_objects_oom() {
pr_warn("Out of memory. ODEBUG disabled\n");
// all buckets get emptied here, and
}
lookup_object_or_alloc(addr, db, descr, false, true) {
// this bucket is already empty.
return ERR_PTR(-ENOENT);
}
// Emits false positive warning.
debug_print_object(&o, "assert_init");
}Recheck debug_object_enabled in debug_print_object() to avoid that.
--- lib/debugobjects.c | 9 +++++++++ 1 file changed, 9 insertions(+)
lib/debugobjects.c +9 -0
@@ -498,6 +498,15 @@ static void debug_print_object(struct deconst struct debug_obj_descr *descr = obj->descr;static int limit; +/* +* Don't report if lookup_object_or_alloc() by the current thread +* failed because lookup_object_or_alloc()/debug_objects_oom() by a +* concurrent thread turned off debug_objects_enabled and cleared +* the hash buckets. +*/ +if (!debug_objects_enabled) +return ; +if (limit <5 && descr != descr_test) {void *hint = descr->debug_hint ? descr->debug_hint (obj->object) :NULL ;
Greg Kroah-Hartman
maintainerPATCH 141/165 net: usbnet: Fix WARNING in usbnet_start_xmit/usb_submit_urb
In reply to Greg Kroah-HartmanFrom: Alan Stern <[email protected]>
commit 5e1627cb43ddf1b24b92eb26f8d958a3f5676ccb upstream.
The syzbot fuzzer identified a problem in the usbnet driver:
usb 1-1: BOGUS urb xfer, pipe 3 != type 1
WARNING: CPU: 0 PID: 754 at drivers/usb/core/urb.c:504 usb_submit_urb+0xed6/0x1880 drivers/usb/core/urb.c:504 Modules linked in: CPU: 0 PID: 754 Comm: kworker/0:2 Not tainted 6.4.0-rc7-syzkaller-00014-g692b7dc87ca6 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023 Workqueue: mld mld_ifc_work RIP: 0010:usb_submit_urb+0xed6/0x1880 drivers/usb/core/urb.c:504 Code: 7c 24 18 e8 2c b4 5b fb 48 8b 7c 24 18 e8 42 07 f0 fe 41 89 d8 44 89 e1 4c 89 ea 48 89 c6 48 c7 c7 a0 c9 fc 8a e8 5a 6f 23 fb <0f> 0b e9 58 f8 ff ff e8 fe b3 5b fb 48 81 c5 c0 05 00 00 e9 84 f7 RSP: 0018:ffffc9000463f568 EFLAGS: 00010086 RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000 RDX: ffff88801eb28000 RSI: ffffffff814c03b7 RDI: 0000000000000001 RBP: ffff8881443b7190 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000003 R13: ffff88802a77cb18 R14: 0000000000000003 R15: ffff888018262500 FS: 0000000000000000(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000556a99c15a18 CR3: 0000000028c71000 CR4: 0000000000350ef0 Call Trace: <TASK> usbnet_start_xmit+0xfe5/0x2190 drivers/net/usb/usbnet.c:1453 __netdev_start_xmit include/linux/netdevice.h:4918 [inline] netdev_start_xmit include/linux/netdevice.h:4932 [inline] xmit_one net/core/dev.c:3578 [inline] dev_hard_start_xmit+0x187/0x700 net/core/dev.c:3594
...
This bug is caused by the fact that usbnet trusts the bulk endpoint addresses its probe routine receives in the driver_info structure, and it does not check to see that these endpoints actually exist and have the expected type and directions.
The fix is simply to add such a check.
--- drivers/net/usb/usbnet.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/usb/usbnet.c +6 -0
@@ -1775,6 +1775,10 @@ usbnet_probe (struct usb_interface *udev }else if (!info->in || !info->out) status =usbnet_get_endpoints (dev, udev);else { +u8 ep_addrs[3 ] = { + info->in +USB_DIR_IN , info->out +USB_DIR_OUT ,0 + }; + dev->in =usb_rcvbulkpipe (xdev, info->in); dev->out =usb_sndbulkpipe (xdev, info->out);if (!(info->flags &FLAG_NO_SETINT ))
@@ -1784,6 +1788,8 @@ usbnet_probe (struct usb_interface *udevelse status =0 ; +if (status ==0 && !usb_check_bulk_endpoints (udev, ep_addrs)) + status = -EINVAL ; }if (status >=0 && dev->status) status =init_status (dev, udev);
Greg Kroah-Hartman
maintainerPATCH 142/165 fs: Protect reconfiguration of sb read-write from racing writes
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit c541dce86c537714b6761a79a969c1623dfa222b upstream.
The reconfigure / remount code takes a lot of effort to protect filesystem's reconfiguration code from racing writes on remounting read-only. However during remounting read-only filesystem to read-write mode userspace writes can start immediately once we clear SB_RDONLY flag. This is inconvenient for example for ext4 because we need to do some writes to the filesystem (such as preparation of quota files) before we can take userspace writes so we are clearing SB_RDONLY flag before we are fully ready to accept userpace writes and syzbot has found a way to exploit this [1]. Also as far as I'm reading the code the filesystem remount code was protected from racing writes in the legacy mount path by the mount's MNT_READONLY flag so this is relatively new problem. It is actually fairly easy to protect remount read-write from racing writes using sb->s_readonly_remount flag so let's just do that instead of having to workaround these races in the filesystem code.
[1] https://lore.kernel.org/all/[email protected]/T/
Message-Id: <[email protected]>
--- fs/super.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
fs/super.c +10 -1
@@ -903,6 +903,7 @@ int reconfigure_super(struct fs_contextstruct super_block *sb = fc->root->d_sb;int retval;bool remount_ro = false; +bool remount_rw = false;bool force = fc->sb_flags &SB_FORCE ;if (fc->sb_flags_mask & ~MS_RMT_MASK )
@@ -920,7 +921,7 @@ int reconfigure_super(struct fs_context bdev_read_only(sb->s_bdev))return -EACCES ;#endif - + remount_rw = !(fc->sb_flags &SB_RDONLY ) &&sb_rdonly (sb); remount_ro = (fc->sb_flags &SB_RDONLY ) && !sb_rdonly (sb); }
@@ -950,6 +951,14 @@ int reconfigure_super(struct fs_contextif (retval)return retval; } + }else if (remount_rw) { +/* +* We set s_readonly_remount here to protect filesystem's +* reconfigure code from writes from userspace until +* reconfigure finishes. +*/ + sb->s_readonly_remount =1 ; +smp_wmb (); }if (fc->ops->reconfigure) {
Greg Kroah-Hartman
maintainerPATCH 143/165 mm/gup: do not return 0 from pin_user_pages_fast() for bad args
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
commit 9883c7f84053cec2826ca3c56254601b5ce9cdbe upstream.
These routines are not intended to return zero, the callers cannot do anything sane with a 0 return. They should return an error which means future calls to GUP will not succeed, or they should return some non-zero number of pinned pages which means GUP should be called again.
If start + nr_pages overflows it should return -EOVERFLOW to signal the arguments are invalid.
Syzkaller keeps tripping on this when fuzzing GUP arguments.
--- mm/gup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/gup.c +1 -1
@@ -2977,7 +2977,7 @@ static int internal_get_user_pages_fast( start =untagged_addr (start) &PAGE_MASK ; len = nr_pages <<PAGE_SHIFT ;if (check_add_overflow (start, len, &end)) -return 0 ; +return -EOVERFLOW ;if (end >TASK_SIZE_MAX )return -EFAULT ;if (unlikely (!access_ok ((void __user *)start, len)))
Greg Kroah-Hartman
maintainerPATCH 144/165 ext2: Drop fragment support
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit 404615d7f1dcd4cca200e9a7a9df3a1dcae1dd62 upstream.
Ext2 has fields in superblock reserved for subblock allocation support. However that never landed. Drop the many years dead code.
--- fs/ext2/ext2.h | 12 ------------ fs/ext2/super.c | 23 ++++------------------- 2 files changed, 4 insertions(+), 31 deletions(-)
fs/ext2/ext2.h +0 -12
@@ -70,10 +70,7 @@ struct mb_cache;* second extended-fs super-block data in memory */ struct ext2_sb_info { -unsigned long s_frag_size;/* Size of a fragment in bytes */ -unsigned long s_frags_per_block;/* Number of fragments per block */ unsigned long s_inodes_per_block;/* Number of inodes per block */ -unsigned long s_frags_per_group;/* Number of fragments in a group */ unsigned long s_blocks_per_group;/* Number of blocks in a group */ unsigned long s_inodes_per_group;/* Number of inodes in a group */ unsigned long s_itb_per_group;/* Number of inode table blocks per group */
@@ -189,15 +186,6 @@ static inline struct ext2_sb_info *EXT2_#define EXT2_FIRST_INO (s) (EXT2_SB(s)->s_first_ino)/* -* Macro-instructions used to manage fragments -*/ -#define EXT2_MIN_FRAG_SIZE 1024 -#define EXT2_MAX_FRAG_SIZE 4096 -#define EXT2_MIN_FRAG_LOG_SIZE 10 -#define EXT2_FRAG_SIZE (s) (EXT2_SB(s)->s_frag_size) -#define EXT2_FRAGS_PER_BLOCK (s) (EXT2_SB(s)->s_frags_per_block) - -/* * Structure of a blocks group descriptor */ struct ext2_group_desc
fs/ext2/super.c +4 -19
@@ -668,10 +668,9 @@ static int ext2_setup_super (struct supe es->s_max_mnt_count =cpu_to_le16 (EXT2_DFL_MAX_MNT_COUNT );le16_add_cpu (&es->s_mnt_count,1 );if (test_opt (sb,DEBUG )) - ext2_msg(sb, KERN_INFO, "%s, %s, bs=%lu, fs=%lu, gc=%lu, " + ext2_msg(sb, KERN_INFO, "%s, %s, bs=%lu, gc=%lu, " "bpg=%lu, ipg=%lu, mo=%04lx]", EXT2FS_VERSION, EXT2FS_DATE, sb->s_blocksize, - sbi->s_frag_size, sbi->s_groups_count, EXT2_BLOCKS_PER_GROUP(sb), EXT2_INODES_PER_GROUP(sb),
@@ -1012,14 +1011,7 @@ static int ext2_fill_super(struct super_ } } - sbi->s_frag_size =EXT2_MIN_FRAG_SIZE << -le32_to_cpu (es->s_log_frag_size); -if (sbi->s_frag_size ==0 ) - goto cantfind_ext2; - sbi->s_frags_per_block = sb->s_blocksize / sbi->s_frag_size; - sbi->s_blocks_per_group =le32_to_cpu (es->s_blocks_per_group); - sbi->s_frags_per_group =le32_to_cpu (es->s_frags_per_group); sbi->s_inodes_per_group =le32_to_cpu (es->s_inodes_per_group); sbi->s_inodes_per_block = sb->s_blocksize /EXT2_INODE_SIZE (sb);
@@ -1045,11 +1037,10 @@ static int ext2_fill_super(struct super_ goto failed_mount; } -if (sb->s_blocksize != sbi->s_frag_size) { +if (es->s_log_frag_size != es->s_log_block_size) {ext2_msg (sb,KERN_ERR , -"error: fragsize %lu != blocksize %lu" -"(not supported yet)" , - sbi->s_frag_size, sb->s_blocksize); +"error: fragsize log %u != blocksize log %u" , +le32_to_cpu (es->s_log_frag_size), sb->s_blocksize_bits); goto failed_mount; }
@@ -1066,12 +1057,6 @@ static int ext2_fill_super(struct super_ sbi->s_blocks_per_group, sbi->s_inodes_per_group + 3); goto failed_mount; } -if (sbi->s_frags_per_group > sb->s_blocksize *8 ) { -ext2_msg (sb,KERN_ERR , -"error: #fragments per group too big: %lu" , - sbi->s_frags_per_group); - goto failed_mount; - }if (sbi->s_inodes_per_group < sbi->s_inodes_per_block || sbi->s_inodes_per_group > sb->s_blocksize *8 ) { ext2_msg(sb, KERN_ERR,
Greg Kroah-Hartman
maintainerPATCH 145/165 btrfs: remove BUG_ON()s in add_new_free_space()
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit d8ccbd21918fd7fa6ce3226cffc22c444228e8ad upstream.
At add_new_free_space() we have these BUG_ON()'s that are there to deal with any failure to add free space to the in memory free space cache. Such failures are mostly -ENOMEM that should be very rare. However there's no need to have these BUG_ON()'s, we can just return any error to the caller and all callers and their upper call chain are already dealing with errors.
So just make add_new_free_space() return any errors, while removing the BUG_ON()'s, and returning the total amount of added free space to an optional u64 pointer argument.
--- fs/btrfs/block-group.c | 51 ++++++++++++++++++++++++++++++--------------- fs/btrfs/block-group.h | 4 +-- fs/btrfs/free-space-tree.c | 24 +++++++++++++++------ 3 files changed, 53 insertions(+), 26 deletions(-)
fs/btrfs/block-group.c +34 -17
@@ -499,12 +499,16 @@ static void fragment_free_space(struct b* used yet since their free space will be released as soon as the transaction * commits. */ -u64 add_new_free_space (struct btrfs_block_group *block_group,u64 start,u64 end) +int add_new_free_space (struct btrfs_block_group *block_group,u64 start,u64 end, +u64 *total_added_ret) {struct btrfs_fs_info *info = block_group->fs_info; -u64 extent_start, extent_end, size, total_added =0 ; +u64 extent_start, extent_end, size;int ret; +if (total_added_ret) + *total_added_ret =0 ; +while (start < end) { ret = find_first_extent_bit(&info->excluded_extents, start, &extent_start, &extent_end,
@@ -517,10 +521,12 @@ u64 add_new_free_space(struct btrfs_bloc start = extent_end +1 ; }else if (extent_start > start && extent_start < end) { size = extent_start - start; - total_added += size; ret =btrfs_add_free_space_async_trimmed (block_group, start, size); -BUG_ON (ret);/* -ENOMEM or logic error */ +if (ret) +return ret; +if (total_added_ret) + *total_added_ret += size; start = extent_end +1 ; }else {break ;
@@ -529,13 +535,15 @@ u64 add_new_free_space(struct btrfs_blocif (start < end) { size = end - start; - total_added += size; ret =btrfs_add_free_space_async_trimmed (block_group, start, size); -BUG_ON (ret);/* -ENOMEM or logic error */ +if (ret) +return ret; +if (total_added_ret) + *total_added_ret += size; } -return total_added; +return 0 ; }/*
@@ -779,8 +787,13 @@ next:if (key.type ==BTRFS_EXTENT_ITEM_KEY || key.type ==BTRFS_METADATA_ITEM_KEY ) { - total_found +=add_new_free_space (block_group, last, - key.objectid); +u64 space_added; + + ret =add_new_free_space (block_group, last, key.objectid, + &space_added); +if (ret) + goto out; + total_found += space_added;if (key.type ==BTRFS_METADATA_ITEM_KEY ) last = key.objectid + fs_info->nodesize;
@@ -795,11 +808,10 @@ next: } path->slots[0 ]++; } - ret =0 ; - - total_found +=add_new_free_space (block_group, last, - block_group->start + block_group->length); + ret =add_new_free_space (block_group, last, + block_group->start + block_group->length, +NULL ); out:btrfs_free_path (path);return ret;
@@ -2290,9 +2302,11 @@ static int read_one_block_group(struct bbtrfs_free_excluded_extents (cache); }else if (cache->used ==0 ) { cache->cached =BTRFS_CACHE_FINISHED ; -add_new_free_space (cache, cache->start, - cache->start + cache->length); + ret =add_new_free_space (cache, cache->start, + cache->start + cache->length,NULL );btrfs_free_excluded_extents (cache); +if (ret) + goto error; } ret =btrfs_add_block_group_cache (info, cache);
@@ -2728,9 +2742,12 @@ struct btrfs_block_group *btrfs_make_bloreturn ERR_PTR (ret); } -add_new_free_space (cache, chunk_offset, chunk_offset + size); - + ret =add_new_free_space (cache, chunk_offset, chunk_offset + size,NULL );btrfs_free_excluded_extents (cache); +if (ret) { +btrfs_put_block_group (cache); +return ERR_PTR (ret); + }/* * Ensure the corresponding space_info object is created and
fs/btrfs/block-group.h +2 -2
@@ -277,8 +277,8 @@ int btrfs_cache_block_group(struct btrfsvoid btrfs_put_caching_control (struct btrfs_caching_control *ctl);struct btrfs_caching_control *btrfs_get_caching_control (struct btrfs_block_group *cache); -u64 add_new_free_space (struct btrfs_block_group *block_group, -u64 start,u64 end); +int add_new_free_space (struct btrfs_block_group *block_group, +u64 start,u64 end,u64 *total_added_ret);struct btrfs_trans_handle *btrfs_start_trans_remove_block_group (struct btrfs_fs_info *fs_info,const u64 chunk_offset);
fs/btrfs/free-space-tree.c +17 -7
@@ -1515,9 +1515,13 @@ static int load_free_space_bitmaps(strucif (prev_bit ==0 && bit ==1 ) { extent_start = offset; }else if (prev_bit ==1 && bit ==0 ) { - total_found +=add_new_free_space (block_group, - extent_start, - offset); +u64 space_added; + + ret =add_new_free_space (block_group, extent_start, + offset, &space_added); +if (ret) + goto out; + total_found += space_added;if (total_found >CACHING_CTL_WAKE_UP ) { total_found =0 ;wake_up (&caching_ctl->wait);
@@ -1529,8 +1533,9 @@ static int load_free_space_bitmaps(struc } }if (prev_bit ==1 ) { - total_found +=add_new_free_space (block_group, extent_start, - end); + ret =add_new_free_space (block_group, extent_start, end,NULL ); +if (ret) + goto out; extent_count++; }
@@ -1569,6 +1574,8 @@ static int load_free_space_extents(struc end = block_group->start + block_group->length;while (1 ) { +u64 space_added; + ret =btrfs_next_item (root, path);if (ret <0 ) goto out;
@@ -1583,8 +1590,11 @@ static int load_free_space_extents(strucASSERT (key.type ==BTRFS_FREE_SPACE_EXTENT_KEY );ASSERT (key.objectid < end && key.objectid + key.offset <= end); - total_found +=add_new_free_space (block_group, key.objectid, - key.objectid + key.offset); + ret =add_new_free_space (block_group, key.objectid, + key.objectid + key.offset, &space_added); +if (ret) + goto out; + total_found += space_added;if (total_found >CACHING_CTL_WAKE_UP ) { total_found =0 ;wake_up (&caching_ctl->wait);
Greg Kroah-Hartman
maintainerPATCH 146/165 f2fs: fix to do sanity check on direct node in truncate_dnode()
In reply to Greg Kroah-HartmanFrom: Chao Yu <[email protected]>
commit a6ec83786ab9f13f25fb18166dee908845713a95 upstream.
syzbot reports below bug:
BUG: KASAN: slab-use-after-free in f2fs_truncate_data_blocks_range+0x122a/0x14c0 fs/f2fs/file.c:574 Read of size 4 at addr ffff88802a25c000 by task syz-executor148/5000 CPU: 1 PID: 5000 Comm: syz-executor148 Not tainted 6.4.0-rc7-syzkaller-00041-ge660abd551f1 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xd9/0x150 lib/dump_stack.c:106 print_address_description.constprop.0+0x2c/0x3c0 mm/kasan/report.c:351 print_report mm/kasan/report.c:462 [inline] kasan_report+0x11c/0x130 mm/kasan/report.c:572 f2fs_truncate_data_blocks_range+0x122a/0x14c0 fs/f2fs/file.c:574 truncate_dnode+0x229/0x2e0 fs/f2fs/node.c:944 f2fs_truncate_inode_blocks+0x64b/0xde0 fs/f2fs/node.c:1154 f2fs_do_truncate_blocks+0x4ac/0xf30 fs/f2fs/file.c:721 f2fs_truncate_blocks+0x7b/0x300 fs/f2fs/file.c:749 f2fs_truncate.part.0+0x4a5/0x630 fs/f2fs/file.c:799 f2fs_truncate include/linux/fs.h:825 [inline] f2fs_setattr+0x1738/0x2090 fs/f2fs/file.c:1006 notify_change+0xb2c/0x1180 fs/attr.c:483 do_truncate+0x143/0x200 fs/open.c:66 handle_truncate fs/namei.c:3295 [inline] do_open fs/namei.c:3640 [inline] path_openat+0x2083/0x2750 fs/namei.c:3791 do_filp_open+0x1ba/0x410 fs/namei.c:3818 do_sys_openat2+0x16d/0x4c0 fs/open.c:1356 do_sys_open fs/open.c:1372 [inline] __do_sys_creat fs/open.c:1448 [inline] __se_sys_creat fs/open.c:1442 [inline] __x64_sys_creat+0xcd/0x120 fs/open.c:1442 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x39/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
The root cause is, inodeA references inodeB via inodeB's ino, once inodeA is truncated, it calls truncate_dnode() to truncate data blocks in inodeB's node page, it traverse mapping data from node->i.i_addr[0] to node->i.i_addr[ADDRS_PER_BLOCK() - 1], result in out-of-boundary access.
This patch fixes to add sanity check on dnode page in truncate_dnode(), so that, it can help to avoid triggering such issue, and once it encounters such issue, it will record newly introduced ERROR_INVALID_NODE_REFERENCE error into superblock, later fsck can detect such issue and try repairing.
Also, it removes f2fs_truncate_data_blocks() for cleanup due to the function has only one caller, and uses f2fs_truncate_data_blocks_range() instead.
--- fs/f2fs/f2fs.h | 1 - fs/f2fs/file.c | 5 ----- fs/f2fs/node.c | 14 ++++++++++++-- include/linux/f2fs_fs.h | 1 + 4 files changed, 13 insertions(+), 8 deletions(-)
fs/f2fs/f2fs.h +0 -1
@@ -3445,7 +3445,6 @@ static inline bool __is_valid_data_blkad* file.c */ int f2fs_sync_file (struct file *file,loff_t start,loff_t end,int datasync); -void f2fs_truncate_data_blocks (struct dnode_of_data *dn);int f2fs_do_truncate_blocks (struct inode *inode,u64 from,bool lock);int f2fs_truncate_blocks (struct inode *inode,u64 from,bool lock);int f2fs_truncate (struct inode *inode);
fs/f2fs/file.c +0 -5
@@ -627,11 +627,6 @@ void f2fs_truncate_data_blocks_range(str dn->ofs_in_node, nr_free); } -void f2fs_truncate_data_blocks (struct dnode_of_data *dn) -{ -f2fs_truncate_data_blocks_range (dn,ADDRS_PER_BLOCK (dn->inode)); -} -static int truncate_partial_data_page (struct inode *inode,u64 from,bool cache_only) {
fs/f2fs/node.c +12 -2
@@ -925,6 +925,7 @@ static int truncate_node(struct dnode_ofstatic int truncate_dnode (struct dnode_of_data *dn) { +struct f2fs_sb_info *sbi =F2FS_I_SB (dn->inode);struct page *page;int err;
@@ -932,16 +933,25 @@ static int truncate_dnode(struct dnode_oreturn 1 ;/* get direct node */ - page =f2fs_get_node_page (F2FS_I_SB (dn->inode), dn->nid); + page =f2fs_get_node_page (sbi, dn->nid);if (PTR_ERR (page) == -ENOENT )return 1 ;else if (IS_ERR (page))return PTR_ERR (page); +if (IS_INODE (page) ||ino_of_node (page) != dn->inode->i_ino) { +f2fs_err (sbi,"incorrect node reference, ino: %lu, nid: %u, ino_of_node: %u" , + dn->inode->i_ino, dn->nid,ino_of_node (page)); +set_sbi_flag (sbi,SBI_NEED_FSCK ); +f2fs_handle_error (sbi,ERROR_INVALID_NODE_REFERENCE ); +f2fs_put_page (page,1 ); +return -EFSCORRUPTED ; + } +/* Make dnode_of_data for parameter */ dn->node_page = page; dn->ofs_in_node =0 ; -f2fs_truncate_data_blocks (dn); +f2fs_truncate_data_blocks_range (dn,ADDRS_PER_BLOCK (dn->inode)); err =truncate_node (dn);if (err) {f2fs_put_page (page,1 );
include/linux/f2fs_fs.h +1 -0
@@ -103,6 +103,7 @@ enum f2fs_error {ERROR_INCONSISTENT_SIT ,ERROR_CORRUPTED_VERITY_XATTR ,ERROR_CORRUPTED_XATTR , +ERROR_INVALID_NODE_REFERENCE , ERROR_MAX, };
Greg Kroah-Hartman
maintainerPATCH 147/165 io_uring: annotate offset timeout races
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
commit 5498bf28d8f2bd63a46ad40f4427518615fb793f upstream.
It's racy to read ->cached_cq_tail without taking proper measures (usually grabbing ->completion_lock) as timeout requests with CQE offsets do, however they have never had a good semantics for from when they start counting. Annotate racy reads with data_race().
--- io_uring/timeout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
io_uring/timeout.c +1 -1
@@ -594,7 +594,7 @@ int io_timeout(struct io_kiocb *req, uns goto add; } - tail = ctx->cached_cq_tail -atomic_read (&ctx->cq_timeouts); + tail =data_race (ctx->cached_cq_tail) -atomic_read (&ctx->cq_timeouts); timeout->target_seq = tail + off;/* Update the last seq here in case io_flush_timeouts() hasn't.
Greg Kroah-Hartman
maintainerPATCH 148/165 mtd: rawnand: omap_elm: Fix incorrect type in assignment
In reply to Greg Kroah-HartmanFrom: Roger Quadros <[email protected]>
[ Upstream commit d8403b9eeee66d5dd81ecb9445800b108c267ce3 ]
Once the ECC word endianness is converted to BE32, we force cast it to u32 so we can use elm_write_reg() which in turn uses writel().
Fixes below sparse warnings:
drivers/mtd/nand/raw/omap_elm.c:180:37: sparse: expected unsigned int [usertype] val drivers/mtd/nand/raw/omap_elm.c:180:37: sparse: got restricted __be32 [usertype] drivers/mtd/nand/raw/omap_elm.c:185:37: sparse: expected unsigned int [usertype] val drivers/mtd/nand/raw/omap_elm.c:185:37: sparse: got restricted __be32 [usertype] drivers/mtd/nand/raw/omap_elm.c:190:37: sparse: expected unsigned int [usertype] val drivers/mtd/nand/raw/omap_elm.c:190:37: sparse: got restricted __be32 [usertype]
Quoted 1 line
Quoted 1 line
drivers/mtd/nand/raw/omap_elm.c:200:40: sparse: sparse: restricted__be32degrades to integer
drivers/mtd/nand/raw/omap_elm.c:206:39: sparse: sparse: restricted __be32 degrades to integer
drivers/mtd/nand/raw/omap_elm.c:210:37: sparse: expected unsigned int [assigned] [usertype] val drivers/mtd/nand/raw/omap_elm.c:210:37: sparse: got restricted __be32 [usertype] drivers/mtd/nand/raw/omap_elm.c:213:37: sparse: expected unsigned int [assigned] [usertype] val drivers/mtd/nand/raw/omap_elm.c:213:37: sparse: got restricted __be32 [usertype] drivers/mtd/nand/raw/omap_elm.c:216:37: sparse: expected unsigned int [assigned] [usertype] val drivers/mtd/nand/raw/omap_elm.c:216:37: sparse: got restricted __be32 [usertype] drivers/mtd/nand/raw/omap_elm.c:219:37: sparse: expected unsigned int [assigned] [usertype] val drivers/mtd/nand/raw/omap_elm.c:219:37: sparse: got restricted __be32 [usertype] drivers/mtd/nand/raw/omap_elm.c:222:37: sparse: expected unsigned int [assigned] [usertype] val drivers/mtd/nand/raw/omap_elm.c:222:37: sparse: got restricted __be32 [usertype] drivers/mtd/nand/raw/omap_elm.c:225:37: sparse: expected unsigned int [assigned] [usertype] val drivers/mtd/nand/raw/omap_elm.c:225:37: sparse: got restricted __be32 [usertype]
drivers/mtd/nand/raw/omap_elm.c:228:39: sparse: sparse: restricted __be32 degrades to integer
--- drivers/mtd/nand/raw/omap_elm.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/mtd/nand/raw/omap_elm.c +12 -12
@@ -177,17 +177,17 @@ static void elm_load_syndrome(struct elm_info *info,switch (info->bch_type) {case BCH8_ECC :/* syndrome fragment 0 = ecc[9-12B] */ - val =cpu_to_be32 (*(u32 *) &ecc[9 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[9 ]);elm_write_reg (info, offset, val);/* syndrome fragment 1 = ecc[5-8B] */ offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[5 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[5 ]);elm_write_reg (info, offset, val);/* syndrome fragment 2 = ecc[1-4B] */ offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[1 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[1 ]);elm_write_reg (info, offset, val);/* syndrome fragment 3 = ecc[0B] */
@@ -197,35 +197,35 @@ static void elm_load_syndrome(struct elm_info *info,break ;case BCH4_ECC :/* syndrome fragment 0 = ecc[20-52b] bits */ - val = (cpu_to_be32 (*(u32 *) &ecc[3 ]) >>4 ) | + val = ((__force u32 )cpu_to_be32 (*(u32 *)&ecc[3 ]) >>4 ) | ((ecc[2 ] &0xf ) <<28 );elm_write_reg (info, offset, val);/* syndrome fragment 1 = ecc[0-20b] bits */ offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[0 ]) >>12 ; + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[0 ]) >>12 ;elm_write_reg (info, offset, val);break ;case BCH16_ECC : - val =cpu_to_be32 (*(u32 *) &ecc[22 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[22 ]);elm_write_reg (info, offset, val); offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[18 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[18 ]);elm_write_reg (info, offset, val); offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[14 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[14 ]);elm_write_reg (info, offset, val); offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[10 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[10 ]);elm_write_reg (info, offset, val); offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[6 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[6 ]);elm_write_reg (info, offset, val); offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[2 ]); + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[2 ]);elm_write_reg (info, offset, val); offset +=4 ; - val =cpu_to_be32 (*(u32 *) &ecc[0 ]) >>16 ; + val = (__force u32 )cpu_to_be32 (*(u32 *)&ecc[0 ]) >>16 ;elm_write_reg (info, offset, val);break ;default :
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 149/165 mtd: rawnand: rockchip: fix oobfree offset and description
In reply to Greg Kroah-HartmanFrom: Johan Jonker <[email protected]>
[ Upstream commit d0ca3b92b7a6f42841ea9da8492aaf649db79780 ]
Rockchip boot blocks are written per 4 x 512 byte sectors per page. Each page with boot blocks must have a page address (PA) pointer in OOB to the next page.
The currently advertised free OOB area starts at offset 6, like if 4 PA bytes were located right after the BBM. This is wrong as the PA bytes are located right before the ECC bytes.
Fix the layout by allowing access to all bytes between the BBM and the PA bytes instead of reserving 4 bytes right after the BBM.
This change breaks existing jffs2 users.
--- drivers/mtd/nand/raw/rockchip-nand-controller.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/mtd/nand/raw/rockchip-nand-controller.c +4 -7
@@ -562,9 +562,10 @@ static int rk_nfc_write_page_raw(struct nand_chip *chip, const u8 *buf,* BBM OOB1 OOB2 OOB3 |......| PA0 PA1 PA2 PA3 * * The rk_nfc_ooblayout_free() function already has reserved -* these 4 bytes with: +* these 4 bytes together with 2 bytes for BBM +* by reducing it's length: * -* oob_region->offset = NFC_SYS_DATA_SIZE + 2; +* oob_region->length = rknand->metadata_size - NFC_SYS_DATA_SIZE - 2; */ if (!i) memcpy(rk_nfc_oob_ptr(chip, i),
@@ -933,12 +934,8 @@ static int rk_nfc_ooblayout_free(struct mtd_info *mtd, int section,if (section)return -ERANGE ; -/* -* The beginning of the OOB area stores the reserved data for the NFC, -* the size of the reserved data is NFC_SYS_DATA_SIZE bytes. -*/ oob_region->length = rknand->metadata_size -NFC_SYS_DATA_SIZE -2 ; - oob_region->offset =NFC_SYS_DATA_SIZE +2 ; + oob_region->offset =2 ;return 0 ; }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 150/165 mtd: rawnand: rockchip: Align hwecc vs. raw page helper layouts
In reply to Greg Kroah-HartmanFrom: Johan Jonker <[email protected]>
[ Upstream commit ea690ad78dd611e3906df5b948a516000b05c1cb ]
Currently, read/write_page_hwecc() and read/write_page_raw() are not
aligned: there is a mismatch in the OOB bytes which are not read/written at the same offset in both cases (raw vs. hwecc).
This is a real problem when relying on the presence of the Page Addresses (PA) when using the NAND chip as a boot device, as the BootROM expects additional data in the OOB area at specific locations.
Rockchip boot blocks are written per 4 x 512 byte sectors per page. Each page with boot blocks must have a page address (PA) pointer in OOB to the next page. Pages are written in a pattern depending on the NAND chip ID.
Generate boot block page address and pattern for hwecc in user space and copy PA data to/from the already reserved last 4 bytes before ECC in the chip->oob_poi data layout.
Align the different helpers. This change breaks existing jffs2 users.
--- .../mtd/nand/raw/rockchip-nand-controller.c | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-)
drivers/mtd/nand/raw/rockchip-nand-controller.c +21 -13
@@ -598,7 +598,7 @@ static int rk_nfc_write_page_hwecc(struct nand_chip *chip, const u8 *buf,int pages_per_blk = mtd->erasesize / mtd->writesize;int ret =0 , i, boot_rom_mode =0 ;dma_addr_t dma_data, dma_oob; -u32 reg; +u32 tmp;u8 *oob;nand_prog_page_begin_op (chip, page,0 ,NULL ,0 );
@@ -625,6 +625,13 @@ static int rk_nfc_write_page_hwecc(struct nand_chip *chip, const u8 *buf,* * 0xFF 0xFF 0xFF 0xFF | BBM OOB1 OOB2 OOB3 | ... * +* The code here just swaps the first 4 bytes with the last +* 4 bytes without losing any data. +* +* The chip->oob_poi data layout: +* +* BBM OOB1 OOB2 OOB3 |......| PA0 PA1 PA2 PA3 +* * Configure the ECC algorithm supported by the boot ROM. */ if ((page < (pages_per_blk * rknand->boot_blks)) &&
@@ -635,21 +642,17 @@ static int rk_nfc_write_page_hwecc(struct nand_chip *chip, const u8 *buf, }for (i =0 ; i < ecc->steps; i++) { -if (!i) { - reg =0xFFFFFFFF ; - }else { +if (!i) + oob = chip->oob_poi + (ecc->steps -1 ) *NFC_SYS_DATA_SIZE ; +else oob = chip->oob_poi + (i -1 ) *NFC_SYS_DATA_SIZE ; - reg = oob[0 ] | oob[1 ] <<8 | oob[2 ] <<16 | - oob[3 ] <<24 ; - } -if (!i && boot_rom_mode) - reg = (page & (pages_per_blk -1 )) *4 ; + tmp = oob[0 ] | oob[1 ] <<8 | oob[2 ] <<16 | oob[3 ] <<24 ;if (nfc->cfg->type ==NFC_V9 ) - nfc->oob_buf[i] = reg; + nfc->oob_buf[i] = tmp;else - nfc->oob_buf[i * (oob_step /4 )] = reg; + nfc->oob_buf[i * (oob_step /4 )] = tmp; } dma_data = dma_map_single(nfc->dev, (void *)nfc->page_buf,
@@ -812,12 +815,17 @@ static int rk_nfc_read_page_hwecc(struct nand_chip *chip, u8 *buf, int oob_on, goto timeout_err; } -for (i =1 ; i < ecc->steps; i++) { - oob = chip->oob_poi + (i -1 ) *NFC_SYS_DATA_SIZE ; +for (i =0 ; i < ecc->steps; i++) { +if (!i) + oob = chip->oob_poi + (ecc->steps -1 ) *NFC_SYS_DATA_SIZE ; +else + oob = chip->oob_poi + (i -1 ) *NFC_SYS_DATA_SIZE ; +if (nfc->cfg->type ==NFC_V9 ) tmp = nfc->oob_buf[i];else tmp = nfc->oob_buf[i * (oob_step /4 )]; + *oob++ = (u8 )tmp; *oob++ = (u8)(tmp >>8 ); *oob++ = (u8)(tmp >>16 );
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 151/165 clk: mediatek: mt8183: Add back SSPM related clocks
In reply to Greg Kroah-HartmanFrom: Chen-Yu Tsai <[email protected]>
[ Upstream commit 1eb8d61ac5c9c7ec56bb96d433532807509b9288 ]
This reverts commit 860690a93ef23b567f781c1b631623e27190f101.
On the MT8183, the SSPM related clocks were removed claiming a lack of usage. This however causes some issues when the driver was converted to the new simple-probe mechanism. This mechanism allocates enough space for all the clocks defined in the clock driver, not the highest index in the DT binding. This leads to out-of-bound writes if their are holes in the DT binding or the driver (due to deprecated or unimplemented clocks). These errors can go unnoticed and cause memory corruption, leading to crashes in unrelated areas, or nothing at all. KASAN will detect them.
Add the SSPM related clocks back to the MT8183 clock driver to fully implement the DT binding. The SSPM clocks are for the power management co-processor, and should never be turned off. They are marked as such.
--- drivers/clk/mediatek/clk-mt8183.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
drivers/clk/mediatek/clk-mt8183.c +27 -0
@@ -328,6 +328,14 @@ static const char * const atb_parents[] = {"syspll_d5" }; +static const char *const sspm_parents[] = { +"clk26m" , +"univpll_d2_d4" , +"syspll_d2_d2" , +"univpll_d2_d2" , +"syspll_d3" +}; +static const char *const dpi0_parents[] = {"clk26m" ,"tvdpll_d2" ,
@@ -506,6 +514,9 @@ static const struct mtk_mux top_muxes[] = {/* CLK_CFG_6 */ MUX_GATE_CLR_SET_UPD (CLK_TOP_MUX_ATB ,"atb_sel" , atb_parents,0xa0 ,0xa4 ,0xa8 ,0 ,2 ,7 ,0x004 ,24 ), +MUX_GATE_CLR_SET_UPD_FLAGS (CLK_TOP_MUX_SSPM ,"sspm_sel" , + sspm_parents,0xa0 ,0xa4 ,0xa8 ,8 ,3 ,15 ,0x004 ,25 , +CLK_IS_CRITICAL |CLK_SET_RATE_PARENT ),MUX_GATE_CLR_SET_UPD (CLK_TOP_MUX_DPI0 ,"dpi0_sel" , dpi0_parents,0xa0 ,0xa4 ,0xa8 ,16 ,4 ,23 ,0x004 ,26 ), MUX_GATE_CLR_SET_UPD(CLK_TOP_MUX_SCAM, "scam_sel",
@@ -671,10 +682,18 @@ static const struct mtk_gate_regs infra3_cg_regs = {GATE_MTK (_id, _name, _parent, &infra2_cg_regs, _shift, \ &mtk_clk_gate_ops_setclr) +#define GATE_INFRA2_FLAGS (_id, _name, _parent, _shift, _flag) \ + GATE_MTK_FLAGS(_id, _name, _parent, &infra2_cg_regs, \ + _shift, &mtk_clk_gate_ops_setclr, _flag) +#define GATE_INFRA3 (_id, _name, _parent, _shift) \ GATE_MTK(_id, _name, _parent, &infra3_cg_regs, _shift, \ &mtk_clk_gate_ops_setclr) +#define GATE_INFRA3_FLAGS (_id, _name, _parent, _shift, _flag) \ + GATE_MTK_FLAGS(_id, _name, _parent, &infra3_cg_regs, \ + _shift, &mtk_clk_gate_ops_setclr, _flag) +static const struct mtk_gate infra_clks[] = {/* INFRA0 */ GATE_INFRA0 (CLK_INFRA_PMIC_TMR ,"infra_pmic_tmr" ,"axi_sel" ,0 ),
@@ -746,7 +765,11 @@ static const struct mtk_gate infra_clks[] = {GATE_INFRA2 (CLK_INFRA_UNIPRO_TICK ,"infra_unipro_tick" ,"fufs_sel" ,12 ),GATE_INFRA2 (CLK_INFRA_UFS_MP_SAP_BCLK ,"infra_ufs_mp_sap_bck" ,"fufs_sel" ,13 ),GATE_INFRA2 (CLK_INFRA_MD32_BCLK ,"infra_md32_bclk" ,"axi_sel" ,14 ), +/* infra_sspm is main clock in co-processor, should not be closed in Linux. */ +GATE_INFRA2_FLAGS (CLK_INFRA_SSPM ,"infra_sspm" ,"sspm_sel" ,15 ,CLK_IS_CRITICAL ),GATE_INFRA2 (CLK_INFRA_UNIPRO_MBIST ,"infra_unipro_mbist" ,"axi_sel" ,16 ), +/* infra_sspm_bus_hclk is main clock in co-processor, should not be closed in Linux. */ +GATE_INFRA2_FLAGS (CLK_INFRA_SSPM_BUS_HCLK ,"infra_sspm_bus_hclk" ,"axi_sel" ,17 ,CLK_IS_CRITICAL ),GATE_INFRA2 (CLK_INFRA_I2C5 ,"infra_i2c5" ,"i2c_sel" ,18 ),GATE_INFRA2 (CLK_INFRA_I2C5_ARBITER ,"infra_i2c5_arbiter" ,"i2c_sel" ,19 ), GATE_INFRA2(CLK_INFRA_I2C5_IMM, "infra_i2c5_imm", "i2c_sel", 20),
@@ -764,6 +787,10 @@ static const struct mtk_gate infra_clks[] = {GATE_INFRA3 (CLK_INFRA_MSDC0_SELF ,"infra_msdc0_self" ,"msdc50_0_sel" ,0 ),GATE_INFRA3 (CLK_INFRA_MSDC1_SELF ,"infra_msdc1_self" ,"msdc50_0_sel" ,1 ),GATE_INFRA3 (CLK_INFRA_MSDC2_SELF ,"infra_msdc2_self" ,"msdc50_0_sel" ,2 ), +/* infra_sspm_26m_self is main clock in co-processor, should not be closed in Linux. */ +GATE_INFRA3_FLAGS (CLK_INFRA_SSPM_26M_SELF ,"infra_sspm_26m_self" ,"f_f26m_ck" ,3 ,CLK_IS_CRITICAL ), +/* infra_sspm_32k_self is main clock in co-processor, should not be closed in Linux. */ +GATE_INFRA3_FLAGS (CLK_INFRA_SSPM_32K_SELF ,"infra_sspm_32k_self" ,"f_f26m_ck" ,4 ,CLK_IS_CRITICAL ),GATE_INFRA3 (CLK_INFRA_UFS_AXI ,"infra_ufs_axi" ,"axi_sel" ,5 ),GATE_INFRA3 (CLK_INFRA_I2C6 ,"infra_i2c6" ,"i2c_sel" ,6 ), GATE_INFRA3(CLK_INFRA_AP_MSDC0, "infra_ap_msdc0", "msdc50_hclk_sel", 7),
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 152/165 mtd: spi-nor: avoid holes in struct spi_mem_op
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 71c8f9cf2623d0db79665f876b95afcdd8214aec ]
gcc gets confused when -ftrivial-auto-var-init=pattern is used on sparse bit fields such as 'struct spi_mem_op', which caused the previous false positive warning about an uninitialized variable:
drivers/mtd/spi-nor/spansion.c: error: 'op' is used uninitialized [-Werror=uninitialized]
In fact, the variable is fully initialized and gcc does not see it being used, so the warning is entirely bogus. The problem appears to be a misoptimization in the initialization of single bit fields when the rest of the bytes are not initialized.
A previous workaround added another initialization, which ended up shutting up the warning in spansion.c, though it apparently still happens in other files as reported by Peter Foley in the gcc bugzilla. The workaround of adding a fake initialization seems particularly bad because it would set values that can never be correct but prevent the compiler from warning about actually missing initializations.
Revert the broken workaround and instead pad the structure to only have bitfields that add up to full bytes, which should avoid this behavior in all drivers.
I also filed a new bug against gcc with what I found, so this can hopefully be addressed in future gcc releases. At the moment, only gcc-12 and gcc-13 are affected.
--- drivers/mtd/spi-nor/spansion.c | 4 ++-- include/linux/spi/spi-mem.h | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-)
drivers/mtd/spi-nor/spansion.c +2 -2
@@ -361,7 +361,7 @@ static int cypress_nor_determine_addr_mode_by_sr1(struct spi_nor *nor,*/ static int cypress_nor_set_addr_mode_nbytes (struct spi_nor *nor) { -struct spi_mem_op op = {}; +struct spi_mem_op op;u8 addr_mode;int ret;
@@ -492,7 +492,7 @@ s25fs256t_post_bfpt_fixup(struct spi_nor *nor,const struct sfdp_parameter_header *bfpt_header, const struct sfdp_bfpt *bfpt) { - struct spi_mem_op op = {}; + struct spi_mem_op op;int ret; ret =cypress_nor_set_addr_mode_nbytes (nor);
include/linux/spi/spi-mem.h +4 -0
@@ -101,6 +101,7 @@ struct spi_mem_op {u8 nbytes;u8 buswidth; u8 dtr : 1; + u8 __pad : 7;u16 opcode; } cmd;
@@ -108,6 +109,7 @@ struct spi_mem_op {u8 nbytes;u8 buswidth; u8 dtr : 1; + u8 __pad : 7;u64 val; } addr;
@@ -115,12 +117,14 @@ struct spi_mem_op {u8 nbytes;u8 buswidth; u8 dtr : 1; + u8 __pad : 7; } dummy;struct {u8 buswidth;u8 dtr :1 ;u8 ecc :1 ; +u8 __pad :6 ;enum spi_mem_data_dir dir;unsigned int nbytes;union {
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 153/165 mtd: rawnand: fsl_upm: Fix an off-by one test in fun_exec_op()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit c6abce60338aa2080973cd95be0aedad528bb41f ]
'op-cs' is copied in 'fun->mchip_number' which is used to access the 'mchip_offsets' and the 'rnb_gpio' arrays.
These arrays have NAND_MAX_CHIPS elements, so the index must be below this limit.
Fix the sanity check in order to avoid the NAND_MAX_CHIPS value. This would lead to out-of-bound accesses.
--- drivers/mtd/nand/raw/fsl_upm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/raw/fsl_upm.c +1 -1
@@ -135,7 +135,7 @@ static int fun_exec_op(struct nand_chip *chip, const struct nand_operation *op,unsigned int i;int ret; -if (op->cs >NAND_MAX_CHIPS ) +if (op->cs >=NAND_MAX_CHIPS )return -EINVAL ;if (check_only)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 154/165 powerpc/mm/altmap: Fix altmap boundary check
In reply to Greg Kroah-HartmanFrom: Aneesh Kumar K.V <[email protected]>
[ Upstream commit 6722b25712054c0f903b839b8f5088438dd04df3 ]
altmap->free includes the entire free space from which altmap blocks can be allocated. So when checking whether the kernel is doing altmap block free, compute the boundary correctly, otherwise memory hotunplug can fail.
--- arch/powerpc/mm/init_64.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/powerpc/mm/init_64.c +1 -2
@@ -314,8 +314,7 @@ void __ref vmemmap_free(unsigned long start, unsigned long end, start =ALIGN_DOWN (start, page_size);if (altmap) { alt_start = altmap->base_pfn; - alt_end = altmap->base_pfn + altmap->reserve + - altmap->free + altmap->alloc + altmap->align; + alt_end = altmap->base_pfn + altmap->reserve + altmap->free; }pr_debug ("vmemmap_free %lx...%lx\n" , start, end);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 155/165 drm/imx/ipuv3: Fix front porch adjustment upon hactive aligning
In reply to Greg Kroah-HartmanFrom: Alexander Stein <[email protected]>
[ Upstream commit ee31742bf17636da1304af77b2cb1c29b5dda642 ]
When hactive is not aligned to 8 pixels, it is aligned accordingly and hfront porch needs to be reduced the same amount. Unfortunately the front porch is set to the difference rather than reducing it. There are some Samsung TVs which can't cope with a front porch of instead of 70.
--- drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c +1 -1
@@ -310,7 +310,7 @@ static void ipu_crtc_mode_set_nofb(struct drm_crtc *crtc)dev_warn (ipu_crtc->dev,"8-pixel align hactive %d -> %d\n" , sig_cfg.mode.hactive, new_hactive); - sig_cfg.mode.hfront_porch = new_hactive - sig_cfg.mode.hactive; + sig_cfg.mode.hfront_porch -= new_hactive - sig_cfg.mode.hactive; sig_cfg.mode.hactive = new_hactive; }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 156/165 drm/amdgpu: Use apt name for FW reserved region
In reply to Greg Kroah-HartmanFrom: Lijo Lazar <[email protected]>
commit db3b5cb64a9ca301d14ed027e470834316720e42 upstream.
Use the generic term fw_reserved_memory for FW reserve region. This region may also hold discovery TMR in addition to other reserve regions. This region size could be larger than discovery tmr size, hence don't change the discovery tmr size based on this.
This change fixes reading IP discovery from debugfs.
It needed to be hand modified because GC 9.4.3 support isn't introduced in older kernels until 228ce176434b ("drm/amdgpu: Handle VRAM dependencies on GFXIP9.4.3")
--- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 35 +++++++++++++++++--------------- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 3 +- 2 files changed, 21 insertions(+), 17 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +19 -16
@@ -1623,14 +1623,15 @@ static int amdgpu_ttm_training_reserve_vreturn 0 ; } -static void amdgpu_ttm_training_data_block_init (struct amdgpu_device *adev) +static void amdgpu_ttm_training_data_block_init (struct amdgpu_device *adev, +uint32_t reserve_size) {struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;memset (ctx,0 ,sizeof (*ctx)); ctx->c2p_train_data_offset = -ALIGN ((adev->gmc.mc_vram_size - adev->mman.discovery_tmr_size -SZ_1M ),SZ_1M ); +ALIGN ((adev->gmc.mc_vram_size - reserve_size -SZ_1M ),SZ_1M ); ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size -GDDR6_MEM_TRAINING_OFFSET ); ctx->train_data_size =
@@ -1648,9 +1649,10 @@ static void amdgpu_ttm_training_data_blo*/ static int amdgpu_ttm_reserve_tmr (struct amdgpu_device *adev) { -int ret;struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;bool mem_train_support = false; +uint32_t reserve_size =0 ; +int ret;if (!amdgpu_sriov_vf (adev)) {if (amdgpu_atomfirmware_mem_training_supported (adev))
@@ -1666,14 +1668,15 @@ static int amdgpu_ttm_reserve_tmr(struct* Otherwise, fallback to legacy approach to check and reserve tmr block for ip * discovery data and G6 memory training data respectively */ - adev->mman.discovery_tmr_size = -amdgpu_atomfirmware_get_fw_reserved_fb_size (adev); -if (!adev->mman.discovery_tmr_size) - adev->mman.discovery_tmr_size =DISCOVERY_TMR_OFFSET ; +if (adev->bios) + reserve_size = +amdgpu_atomfirmware_get_fw_reserved_fb_size (adev); +if (!reserve_size) + reserve_size =DISCOVERY_TMR_OFFSET ;if (mem_train_support) {/* reserve vram for mem train according to TMR location */ -amdgpu_ttm_training_data_block_init (adev); +amdgpu_ttm_training_data_block_init (adev, reserve_size); ret = amdgpu_bo_create_kernel_at(adev, ctx->c2p_train_data_offset, ctx->train_data_size,
@@ -1687,14 +1690,13 @@ static int amdgpu_ttm_reserve_tmr(struct ctx->init =PSP_MEM_TRAIN_RESERVE_SUCCESS ; } - ret =amdgpu_bo_create_kernel_at (adev, - adev->gmc.real_vram_size - adev->mman.discovery_tmr_size, - adev->mman.discovery_tmr_size, - &adev->mman.discovery_memory, -NULL ); + ret =amdgpu_bo_create_kernel_at ( + adev, adev->gmc.real_vram_size - reserve_size, + reserve_size, &adev->mman.fw_reserved_memory,NULL );if (ret) {DRM_ERROR ("alloc tmr failed(%d)!\n" , ret); -amdgpu_bo_free_kernel (&adev->mman.discovery_memory,NULL ,NULL ); +amdgpu_bo_free_kernel (&adev->mman.fw_reserved_memory, +NULL ,NULL );return ret; }
@@ -1881,8 +1883,9 @@ void amdgpu_ttm_fini(struct amdgpu_devic/* return the stolen vga memory back to VRAM */ amdgpu_bo_free_kernel (&adev->mman.stolen_vga_memory,NULL ,NULL );amdgpu_bo_free_kernel (&adev->mman.stolen_extended_memory,NULL ,NULL ); -/* return the IP Discovery TMR memory back to VRAM */ -amdgpu_bo_free_kernel (&adev->mman.discovery_memory,NULL ,NULL ); +/* return the FW reserved memory back to VRAM */ +amdgpu_bo_free_kernel (&adev->mman.fw_reserved_memory,NULL , +NULL );if (adev->mman.stolen_reserved_size)amdgpu_bo_free_kernel (&adev->mman.stolen_reserved_memory,NULL ,NULL );
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +2 -1
@@ -78,7 +78,8 @@ struct amdgpu_mman {/* discovery */ uint8_t *discovery_bin;uint32_t discovery_tmr_size; -struct amdgpu_bo *discovery_memory; +/* fw reserved memory */ +struct amdgpu_bo *fw_reserved_memory;/* firmware VRAM reservation */ u64 fw_vram_usage_start_offset;
Greg Kroah-Hartman
maintainerPATCH 157/165 selftests/rseq: Play nice with binaries statically linked against glibc 2.35+
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
[ Upstream commit 3bcbc20942db5d738221cca31a928efc09827069 ]
To allow running rseq and KVM's rseq selftests as statically linked binaries, initialize the various "trampoline" pointers to point directly at the expect glibc symbols, and skip the dlysm() lookups if the rseq size is non-zero, i.e. the binary is statically linked *and* the libc registered its own rseq.
Define weak versions of the symbols so as not to break linking against libc versions that don't support rseq in any capacity.
The KVM selftests in particular are often statically linked so that they can be run on targets with very limited runtime environments, i.e. test machines.
Message-Id: <[email protected]>
--- tools/testing/selftests/rseq/rseq.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-)
tools/testing/selftests/rseq/rseq.c +22 -6
@@ -34,9 +34,17 @@#include "../kselftest.h" #include "rseq.h" -static const ptrdiff_t *libc_rseq_offset_p; -static const unsigned int *libc_rseq_size_p; -static const unsigned int *libc_rseq_flags_p; +/* +* Define weak versions to play nice with binaries that are statically linked +* against a libc that doesn't support registering its own rseq. +*/ +__weak ptrdiff_t __rseq_offset; +__weak unsigned int __rseq_size; +__weak unsigned int __rseq_flags; + +static const ptrdiff_t *libc_rseq_offset_p = &__rseq_offset; +static const unsigned int *libc_rseq_size_p = &__rseq_size; +static const unsigned int *libc_rseq_flags_p = &__rseq_flags;/* Offset from the thread pointer to the rseq area. */ ptrdiff_t rseq_offset;
@@ -155,9 +163,17 @@ unsigned int get_rseq_feature_size(void)static __attribute__((constructor))void rseq_init (void ) { - libc_rseq_offset_p =dlsym (RTLD_NEXT ,"__rseq_offset" ); - libc_rseq_size_p =dlsym (RTLD_NEXT ,"__rseq_size" ); - libc_rseq_flags_p =dlsym (RTLD_NEXT ,"__rseq_flags" ); +/* +* If the libc's registered rseq size isn't already valid, it may be +* because the binary is dynamically linked and not necessarily due to +* libc not having registered a restartable sequence. Try to find the +* symbols if that's the case. +*/ +if (!*libc_rseq_size_p) { + libc_rseq_offset_p =dlsym (RTLD_NEXT ,"__rseq_offset" ); + libc_rseq_size_p =dlsym (RTLD_NEXT ,"__rseq_size" ); + libc_rseq_flags_p =dlsym (RTLD_NEXT ,"__rseq_flags" ); + }if (libc_rseq_size_p && libc_rseq_offset_p && libc_rseq_flags_p && *libc_rseq_size_p !=0 ) {/* rseq registration owned by glibc */
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 158/165 ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node
In reply to Greg Kroah-HartmanFrom: Xu Yang <[email protected]>
[ Upstream commit ee70b908f77a9d8f689dea986f09e6d7dc481934 ]
Property name "phy-3p0-supply" is used instead of "phy-reg_3p0-supply".
--- arch/arm/boot/dts/imx6sll.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/imx6sll.dtsi +1 -1
@@ -552,7 +552,7 @@ usbphy2: usb-phy@20ca000 { reg = <0x020ca000 0x1000>; interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clks IMX6SLL_CLK_USBPHY2>; - phy-reg_3p0-supply = <®_3p0>; + phy-3p0-supply = <®_3p0>; fsl,anatop = <&anatop>; };
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 159/165 drm/i915: Add the gen12_needs_ccs_aux_inv helper
In reply to Greg Kroah-HartmanFrom: Andi Shyti <[email protected]>
[ Upstream commit b2f59e9026038a5bbcbc0019fa58f963138211ee ]
We always assumed that a device might either have AUX or FLAT CCS, but this is an approximation that is not always true, e.g. PVC represents an exception.
Set the basis for future finer selection by implementing a boolean gen12_needs_ccs_aux_inv() function that tells whether aux invalidation is needed or not.
Currently PVC is the only exception to the above mentioned rule.
Requires: 059ae7ae2a1c ("drm/i915/gt: Cleanup aux invalidation registers")
--- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/gt/gen8_engine_cs.c +15 -3
@@ -165,6 +165,18 @@ static u32 preparser_disable(bool state)return MI_ARB_CHECK |1 <<8 | state; } +static bool gen12_needs_ccs_aux_inv (struct intel_engine_cs *engine) +{ +if (IS_PONTEVECCHIO (engine->i915)) +return false; + +/* +* so far platforms supported by i915 having +* flat ccs do not require AUX invalidation +*/ +return !HAS_FLAT_CCS (engine->i915); +} +u32 *gen12_emit_aux_table_inv (struct intel_gt *gt,u32 *cs,const i915_reg_t inv_reg) {u32 gsi_offset = gt->uncore->gsi_offset;
@@ -236,7 +248,7 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)else if (engine->class ==COMPUTE_CLASS ) flags &= ~PIPE_CONTROL_3D_ENGINE_FLAGS ; -if (!HAS_FLAT_CCS (rq->engine->i915)) +if (gen12_needs_ccs_aux_inv (rq->engine)) count =8 +4 ;else count =8 ;
@@ -254,7 +266,7 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode) cs =gen8_emit_pipe_control (cs, flags,LRC_PPHWSP_SCRATCH_ADDR ); -if (!HAS_FLAT_CCS (rq->engine->i915)) { +if (gen12_needs_ccs_aux_inv (rq->engine)) {/* hsdes: 1809175790 */ cs =gen12_emit_aux_table_inv (rq->engine->gt, cs,GEN12_CCS_AUX_INV );
@@ -276,7 +288,7 @@ int gen12_emit_flush_xcs(struct i915_request *rq, u32 mode)if (mode &EMIT_INVALIDATE ) { cmd +=2 ; -if (!HAS_FLAT_CCS (rq->engine->i915) && +if (gen12_needs_ccs_aux_inv (rq->engine) && (rq->engine->class ==VIDEO_DECODE_CLASS || rq->engine->class ==VIDEO_ENHANCEMENT_CLASS )) { aux_inv = rq->engine->mask &
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 160/165 drm/i915/gt: Ensure memory quiesced before invalidation
In reply to Greg Kroah-HartmanFrom: Jonathan Cavitt <[email protected]>
[ Upstream commit 78a6ccd65fa3a7cc697810db079cc4b84dff03d5 ]
All memory traffic must be quiesced before requesting an aux invalidation on platforms that use Aux CCS.
Requires: a2a4aa0eef3b ("drm/i915: Add the gen12_needs_ccs_aux_inv helper")
--- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/gen8_engine_cs.c +5 -1
@@ -193,7 +193,11 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode) {struct intel_engine_cs *engine = rq->engine; -if (mode &EMIT_FLUSH ) { +/* +* On Aux CCS platforms the invalidation of the Aux +* table requires quiescing memory traffic beforehand +*/ +if (mode &EMIT_FLUSH ||gen12_needs_ccs_aux_inv (engine)) {u32 flags =0 ;u32 *cs;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 161/165 drm/i915/gt: Add workaround 14016712196
In reply to Greg Kroah-HartmanFrom: Tejas Upadhyay <[email protected]>
[ Upstream commit d922b80b1010cd6164fa7d3c197b4fbf94b47beb ]
For mtl, workaround suggests that, SW insert a dummy PIPE_CONTROL prior to PIPE_CONTROL which contains a post sync: Timestamp or Write Immediate.
Bspec: 72197
V5:
- Remove ret variable - Andi
V4:
- Update commit message, avoid returing cs - Andi/Matt
V3:
- Wrap dummy pipe control stuff in API - Andi
V2:
- Fix kernel test robot warnings
Stable-dep-of: 592b228f12e1 ("drm/i915/gt: Rename flags with bit_group_X according to the datasheet")
--- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
drivers/gpu/drm/i915/gt/gen8_engine_cs.c +38 -0
@@ -189,6 +189,27 @@ u32 *gen12_emit_aux_table_inv(struct intel_gt *gt, u32 *cs, const i915_reg_t invreturn cs; } +static int mtl_dummy_pipe_control (struct i915_request *rq) +{ +/* Wa_14016712196 */ +if (IS_MTL_GRAPHICS_STEP (rq->engine->i915,M ,STEP_A0 ,STEP_B0 ) || +IS_MTL_GRAPHICS_STEP (rq->engine->i915,P ,STEP_A0 ,STEP_B0 )) { +u32 *cs; + +/* dummy PIPE_CONTROL + depth flush */ + cs =intel_ring_begin (rq,6 ); +if (IS_ERR (cs)) +return PTR_ERR (cs); + cs =gen12_emit_pipe_control (cs, +0 , +PIPE_CONTROL_DEPTH_CACHE_FLUSH , +LRC_PPHWSP_SCRATCH_ADDR ); +intel_ring_advance (rq, cs); + } + +return 0 ; +} +int gen12_emit_flush_rcs (struct i915_request *rq,u32 mode) {struct intel_engine_cs *engine = rq->engine;
@@ -199,8 +220,13 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)*/ if (mode &EMIT_FLUSH ||gen12_needs_ccs_aux_inv (engine)) {u32 flags =0 ; +int err;u32 *cs; + err =mtl_dummy_pipe_control (rq); +if (err) +return err; + flags |=PIPE_CONTROL_TILE_CACHE_FLUSH ; flags |=PIPE_CONTROL_FLUSH_L3 ; flags |=PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH ;
@@ -233,6 +259,11 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)if (mode &EMIT_INVALIDATE ) {u32 flags =0 ;u32 *cs, count; +int err; + + err =mtl_dummy_pipe_control (rq); +if (err) +return err; flags |=PIPE_CONTROL_COMMAND_CACHE_INVALIDATE ; flags |=PIPE_CONTROL_TLB_INVALIDATE ;
@@ -749,6 +780,13 @@ u32 *gen12_emit_fini_breadcrumb_rcs(struct i915_request *rq, u32 *cs)PIPE_CONTROL_DC_FLUSH_ENABLE | PIPE_CONTROL_FLUSH_ENABLE); +/* Wa_14016712196 */ +if (IS_MTL_GRAPHICS_STEP (i915,M ,STEP_A0 ,STEP_B0 ) || +IS_MTL_GRAPHICS_STEP (i915,P ,STEP_A0 ,STEP_B0 )) +/* dummy PIPE_CONTROL + depth flush */ + cs =gen12_emit_pipe_control (cs,0 , +PIPE_CONTROL_DEPTH_CACHE_FLUSH ,0 ); +if (GRAPHICS_VER (i915) ==12 &&GRAPHICS_VER_FULL (i915) <IP_VER (12 ,50 ))/* Wa_1409600907 */ flags |=PIPE_CONTROL_DEPTH_STALL ;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 162/165 drm/i915/gt: Rename flags with bit_group_X according to the datasheet
In reply to Greg Kroah-HartmanFrom: Andi Shyti <[email protected]>
[ Upstream commit 592b228f12e15867a63e3a6eeeb54c5c12662a62 ]
In preparation of the next patch align with the datasheet (BSPEC 47112) with the naming of the pipe control set of flag values. The variable "flags" in gen12_emit_flush_rcs() is applied as a set of flags called Bit Group 1.
Define also the Bit Group 0 as bit_group_0 where currently only PIPE_CONTROL0_HDC_PIPELINE_FLUSH bit is set.
--- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 34 +++++++++++++----------- drivers/gpu/drm/i915/gt/gen8_engine_cs.h | 18 ++++++++----- 2 files changed, 29 insertions(+), 23 deletions(-)
drivers/gpu/drm/i915/gt/gen8_engine_cs.c +18 -16
@@ -219,7 +219,8 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)* table requires quiescing memory traffic beforehand */ if (mode &EMIT_FLUSH ||gen12_needs_ccs_aux_inv (engine)) { -u32 flags =0 ; +u32 bit_group_0 =0 ; +u32 bit_group_1 =0 ;int err;u32 *cs;
@@ -227,32 +228,33 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)if (err)return err; - flags |=PIPE_CONTROL_TILE_CACHE_FLUSH ; - flags |=PIPE_CONTROL_FLUSH_L3 ; - flags |=PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH ; - flags |=PIPE_CONTROL_DEPTH_CACHE_FLUSH ; + bit_group_0 |=PIPE_CONTROL0_HDC_PIPELINE_FLUSH ; + + bit_group_1 |=PIPE_CONTROL_TILE_CACHE_FLUSH ; + bit_group_1 |=PIPE_CONTROL_FLUSH_L3 ; + bit_group_1 |=PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH ; + bit_group_1 |=PIPE_CONTROL_DEPTH_CACHE_FLUSH ;/* Wa_1409600907:tgl,adl-p */ - flags |=PIPE_CONTROL_DEPTH_STALL ; - flags |=PIPE_CONTROL_DC_FLUSH_ENABLE ; - flags |=PIPE_CONTROL_FLUSH_ENABLE ; + bit_group_1 |=PIPE_CONTROL_DEPTH_STALL ; + bit_group_1 |=PIPE_CONTROL_DC_FLUSH_ENABLE ; + bit_group_1 |=PIPE_CONTROL_FLUSH_ENABLE ; - flags |=PIPE_CONTROL_STORE_DATA_INDEX ; - flags |=PIPE_CONTROL_QW_WRITE ; + bit_group_1 |=PIPE_CONTROL_STORE_DATA_INDEX ; + bit_group_1 |=PIPE_CONTROL_QW_WRITE ; - flags |=PIPE_CONTROL_CS_STALL ; + bit_group_1 |=PIPE_CONTROL_CS_STALL ;if (!HAS_3D_PIPELINE (engine->i915)) - flags &= ~PIPE_CONTROL_3D_ARCH_FLAGS ; + bit_group_1 &= ~PIPE_CONTROL_3D_ARCH_FLAGS ;else if (engine->class ==COMPUTE_CLASS ) - flags &= ~PIPE_CONTROL_3D_ENGINE_FLAGS ; + bit_group_1 &= ~PIPE_CONTROL_3D_ENGINE_FLAGS ; cs =intel_ring_begin (rq,6 );if (IS_ERR (cs))return PTR_ERR (cs); - cs =gen12_emit_pipe_control (cs, -PIPE_CONTROL0_HDC_PIPELINE_FLUSH , - flags,LRC_PPHWSP_SCRATCH_ADDR ); + cs =gen12_emit_pipe_control (cs, bit_group_0, bit_group_1, +LRC_PPHWSP_SCRATCH_ADDR );intel_ring_advance (rq, cs); }
drivers/gpu/drm/i915/gt/gen8_engine_cs.h +11 -7
@@ -49,25 +49,29 @@ u32 *gen12_emit_fini_breadcrumb_rcs(struct i915_request *rq, u32 *cs);u32 *gen12_emit_aux_table_inv (struct intel_gt *gt,u32 *cs,const i915_reg_t inv_reg);static inline u32 * -__gen8_emit_pipe_control (u32 *batch,u32 flags0,u32 flags1,u32 offset) +__gen8_emit_pipe_control (u32 *batch,u32 bit_group_0, +u32 bit_group_1,u32 offset) {memset (batch,0 ,6 *sizeof (u32)); - batch[0 ] =GFX_OP_PIPE_CONTROL (6 ) | flags0; - batch[1 ] = flags1; + batch[0 ] =GFX_OP_PIPE_CONTROL (6 ) | bit_group_0; + batch[1 ] = bit_group_1; batch[2 ] = offset;return batch +6 ; } -static inline u32 *gen8_emit_pipe_control (u32 *batch,u32 flags,u32 offset) +static inline u32 *gen8_emit_pipe_control (u32 *batch, +u32 bit_group_1,u32 offset) { -return __gen8_emit_pipe_control (batch,0 , flags, offset); +return __gen8_emit_pipe_control (batch,0 , bit_group_1, offset); } -static inline u32 *gen12_emit_pipe_control (u32 *batch,u32 flags0,u32 flags1,u32 offset) +static inline u32 *gen12_emit_pipe_control (u32 *batch,u32 bit_group_0, +u32 bit_group_1,u32 offset) { -return __gen8_emit_pipe_control (batch, flags0, flags1, offset); +return __gen8_emit_pipe_control (batch, bit_group_0, + bit_group_1, offset); } static inline u32 *
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 163/165 drm/i915/gt: Poll aux invalidation register bit on invalidation
In reply to Greg Kroah-HartmanFrom: Jonathan Cavitt <[email protected]>
[ Upstream commit 0fde2f23516a00fd90dfb980b66b4665fcbfa659 ]
For platforms that use Aux CCS, wait for aux invalidation to complete by checking the aux invalidation register bit is cleared.
--- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 17 ++++++++++++----- drivers/gpu/drm/i915/gt/intel_gpu_commands.h | 1 + 2 files changed, 13 insertions(+), 5 deletions(-)
drivers/gpu/drm/i915/gt/gen8_engine_cs.c +12 -5
@@ -184,7 +184,15 @@ u32 *gen12_emit_aux_table_inv(struct intel_gt *gt, u32 *cs, const i915_reg_t inv *cs++ =MI_LOAD_REGISTER_IMM (1 ) |MI_LRI_MMIO_REMAP_EN ; *cs++ =i915_mmio_reg_offset (inv_reg) + gsi_offset; *cs++ =AUX_INV ; - *cs++ =MI_NOOP ; + + *cs++ =MI_SEMAPHORE_WAIT_TOKEN | +MI_SEMAPHORE_REGISTER_POLL | +MI_SEMAPHORE_POLL | +MI_SEMAPHORE_SAD_EQ_SDD ; + *cs++ =0 ; + *cs++ =i915_mmio_reg_offset (inv_reg) + gsi_offset; + *cs++ =0 ; + *cs++ =0 ;return cs; }
@@ -285,10 +293,9 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)else if (engine->class ==COMPUTE_CLASS ) flags &= ~PIPE_CONTROL_3D_ENGINE_FLAGS ; + count =8 ;if (gen12_needs_ccs_aux_inv (rq->engine)) - count =8 +4 ; -else - count =8 ; + count +=8 ; cs =intel_ring_begin (rq, count);if (IS_ERR (cs))
@@ -331,7 +338,7 @@ int gen12_emit_flush_xcs(struct i915_request *rq, u32 mode) aux_inv = rq->engine->mask & ~GENMASK (_BCS (I915_MAX_BCS -1 ),BCS0 );if (aux_inv) - cmd +=4 ; + cmd +=8 ; } }
drivers/gpu/drm/i915/gt/intel_gpu_commands.h +1 -0
@@ -121,6 +121,7 @@#define MI_SEMAPHORE_TARGET (engine) ((engine)<<15)#define MI_SEMAPHORE_WAIT MI_INSTR(0x1c, 2)/* GEN8+ */ #define MI_SEMAPHORE_WAIT_TOKEN MI_INSTR(0x1c, 3)/* GEN12+ */ +#define MI_SEMAPHORE_REGISTER_POLL (1 << 16)#define MI_SEMAPHORE_POLL (1 << 15)#define MI_SEMAPHORE_SAD_GT_SDD (0 << 12)#define MI_SEMAPHORE_SAD_GTE_SDD (1 << 12)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 164/165 drm/i915/gt: Support aux invalidation on all engines
In reply to Greg Kroah-HartmanFrom: Andi Shyti <[email protected]>
[ Upstream commit 6a35f22d222528e1b157c6978c9424d2f8cbe0a1 ]
Perform some refactoring with the purpose of keeping in one single place all the operations around the aux table invalidation.
With this refactoring add more engines where the invalidation should be performed.
--- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 66 +++++++++++++----------- drivers/gpu/drm/i915/gt/gen8_engine_cs.h | 3 +- drivers/gpu/drm/i915/gt/intel_lrc.c | 17 +----- 3 files changed, 41 insertions(+), 45 deletions(-)
drivers/gpu/drm/i915/gt/gen8_engine_cs.c +37 -29
@@ -165,21 +165,47 @@ static u32 preparser_disable(bool state)return MI_ARB_CHECK |1 <<8 | state; } +static i915_reg_t gen12_get_aux_inv_reg (struct intel_engine_cs *engine) +{ +switch (engine->id) { +case RCS0 : +return GEN12_CCS_AUX_INV ; +case BCS0 : +return GEN12_BCS0_AUX_INV ; +case VCS0 : +return GEN12_VD0_AUX_INV ; +case VCS2 : +return GEN12_VD2_AUX_INV ; +case VECS0 : +return GEN12_VE0_AUX_INV ; +case CCS0 : +return GEN12_CCS0_AUX_INV ; +default : +return INVALID_MMIO_REG ; + } +} +static bool gen12_needs_ccs_aux_inv (struct intel_engine_cs *engine) { +i915_reg_t reg =gen12_get_aux_inv_reg (engine); +if (IS_PONTEVECCHIO (engine->i915))return false;/* -* so far platforms supported by i915 having -* flat ccs do not require AUX invalidation +* So far platforms supported by i915 having flat ccs do not require +* AUX invalidation. Check also whether the engine requires it. */ -return !HAS_FLAT_CCS (engine->i915); +return i915_mmio_reg_valid (reg) && !HAS_FLAT_CCS (engine->i915); } -u32 *gen12_emit_aux_table_inv (struct intel_gt *gt,u32 *cs,const i915_reg_t inv_reg) +u32 *gen12_emit_aux_table_inv (struct intel_engine_cs *engine,u32 *cs) { -u32 gsi_offset = gt->uncore->gsi_offset; +i915_reg_t inv_reg =gen12_get_aux_inv_reg (engine); +u32 gsi_offset = engine->gt->uncore->gsi_offset; + +if (!gen12_needs_ccs_aux_inv (engine)) +return cs; *cs++ =MI_LOAD_REGISTER_IMM (1 ) |MI_LRI_MMIO_REMAP_EN ; *cs++ =i915_mmio_reg_offset (inv_reg) + gsi_offset;
@@ -310,11 +336,7 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode) cs =gen8_emit_pipe_control (cs, flags,LRC_PPHWSP_SCRATCH_ADDR ); -if (gen12_needs_ccs_aux_inv (rq->engine)) { -/* hsdes: 1809175790 */ - cs =gen12_emit_aux_table_inv (rq->engine->gt, cs, -GEN12_CCS_AUX_INV ); - } + cs =gen12_emit_aux_table_inv (engine, cs); *cs++ =preparser_disable (false);intel_ring_advance (rq, cs);
@@ -325,21 +347,14 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)int gen12_emit_flush_xcs (struct i915_request *rq,u32 mode) { -intel_engine_mask_t aux_inv =0 ; -u32 cmd, *cs; +u32 cmd =4 ; +u32 *cs; - cmd =4 ;if (mode &EMIT_INVALIDATE ) { cmd +=2 ; -if (gen12_needs_ccs_aux_inv (rq->engine) && - (rq->engine->class ==VIDEO_DECODE_CLASS || - rq->engine->class ==VIDEO_ENHANCEMENT_CLASS )) { - aux_inv = rq->engine->mask & - ~GENMASK (_BCS (I915_MAX_BCS -1 ),BCS0 ); -if (aux_inv) - cmd +=8 ; - } +if (gen12_needs_ccs_aux_inv (rq->engine)) + cmd +=8 ; } cs =intel_ring_begin (rq, cmd);
@@ -370,14 +385,7 @@ int gen12_emit_flush_xcs(struct i915_request *rq, u32 mode) *cs++ =0 ;/* upper addr */ *cs++ =0 ;/* value */ -if (aux_inv) {/* hsdes: 1809175790 */ -if (rq->engine->class ==VIDEO_DECODE_CLASS ) - cs =gen12_emit_aux_table_inv (rq->engine->gt, - cs,GEN12_VD0_AUX_INV ); -else - cs =gen12_emit_aux_table_inv (rq->engine->gt, - cs,GEN12_VE0_AUX_INV ); - } + cs =gen12_emit_aux_table_inv (rq->engine, cs);if (mode &EMIT_INVALIDATE ) *cs++ =preparser_disable (false);
drivers/gpu/drm/i915/gt/gen8_engine_cs.h +2 -1
@@ -13,6 +13,7 @@#include "intel_gt_regs.h" #include "intel_gpu_commands.h" +struct intel_engine_cs ;struct intel_gt ;struct i915_request ;
@@ -46,7 +47,7 @@ u32 *gen8_emit_fini_breadcrumb_rcs(struct i915_request *rq, u32 *cs);u32 *gen11_emit_fini_breadcrumb_rcs (struct i915_request *rq,u32 *cs);u32 *gen12_emit_fini_breadcrumb_rcs (struct i915_request *rq,u32 *cs); -u32 *gen12_emit_aux_table_inv (struct intel_gt *gt,u32 *cs,const i915_reg_t inv_reg); +u32 *gen12_emit_aux_table_inv (struct intel_engine_cs *engine,u32 *cs);static inline u32 * __gen8_emit_pipe_control(u32 *batch, u32 bit_group_0,
drivers/gpu/drm/i915/gt/intel_lrc.c +2 -15
@@ -1364,10 +1364,7 @@ gen12_emit_indirect_ctx_rcs(const struct intel_context *ce, u32 *cs) IS_DG2_G11(ce->engine->i915)) cs =gen8_emit_pipe_control (cs,PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE ,0 ); -/* hsdes: 1809175790 */ -if (!HAS_FLAT_CCS (ce->engine->i915)) - cs =gen12_emit_aux_table_inv (ce->engine->gt, - cs,GEN12_CCS_AUX_INV ); + cs =gen12_emit_aux_table_inv (ce->engine, cs);/* Wa_16014892111 */ if (IS_DG2 (ce->engine->i915))
@@ -1390,17 +1387,7 @@ gen12_emit_indirect_ctx_xcs(const struct intel_context *ce, u32 *cs)PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE , 0); -/* hsdes: 1809175790 */ -if (!HAS_FLAT_CCS (ce->engine->i915)) { -if (ce->engine->class ==VIDEO_DECODE_CLASS ) - cs =gen12_emit_aux_table_inv (ce->engine->gt, - cs,GEN12_VD0_AUX_INV ); -else if (ce->engine->class ==VIDEO_ENHANCEMENT_CLASS ) - cs =gen12_emit_aux_table_inv (ce->engine->gt, - cs,GEN12_VE0_AUX_INV ); - } - -return cs; +return gen12_emit_aux_table_inv (ce->engine, cs); } static void
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 165/165 drm/i915/gt: Enable the CCS_FLUSH bit in the pipe control and in the CS
In reply to Greg Kroah-HartmanFrom: Andi Shyti <[email protected]>
[ Upstream commit 824df77ab2107d8d4740b834b276681a41ae1ac8 ]
Enable the CCS_FLUSH bit 13 in the control pipe for render and compute engines in platforms starting from Meteor Lake (BSPEC 43904 and 47112).
For the copy engine add MI_FLUSH_DW_CCS (bit 16) in the command streamer.
Requires: 8da173db894a ("drm/i915/gt: Rename flags with bit_group_X according to the datasheet")
--- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 11 +++++++++++ drivers/gpu/drm/i915/gt/intel_gpu_commands.h | 1 + 2 files changed, 12 insertions(+)
drivers/gpu/drm/i915/gt/gen8_engine_cs.c +11 -0
@@ -264,6 +264,13 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode) bit_group_0 |=PIPE_CONTROL0_HDC_PIPELINE_FLUSH ; +/* +* When required, in MTL and beyond platforms we +* need to set the CCS_FLUSH bit in the pipe control +*/ +if (GRAPHICS_VER_FULL (rq->i915) >=IP_VER (12 ,70 )) + bit_group_0 |=PIPE_CONTROL_CCS_FLUSH ; + bit_group_1 |=PIPE_CONTROL_TILE_CACHE_FLUSH ; bit_group_1 |=PIPE_CONTROL_FLUSH_L3 ; bit_group_1 |=PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH ;
@@ -378,6 +385,10 @@ int gen12_emit_flush_xcs(struct i915_request *rq, u32 mode) cmd |=MI_INVALIDATE_TLB ;if (rq->engine->class ==VIDEO_DECODE_CLASS ) cmd |=MI_INVALIDATE_BSD ; + +if (gen12_needs_ccs_aux_inv (rq->engine) && + rq->engine->class ==COPY_ENGINE_CLASS ) + cmd |=MI_FLUSH_DW_CCS ; } *cs++ = cmd;
drivers/gpu/drm/i915/gt/intel_gpu_commands.h +1 -0
@@ -300,6 +300,7 @@#define PIPE_CONTROL_QW_WRITE (1<<14)#define PIPE_CONTROL_POST_SYNC_OP_MASK (3<<14)#define PIPE_CONTROL_DEPTH_STALL (1<<13) +#define PIPE_CONTROL_CCS_FLUSH (1<<13)/* MTL+ */ #define PIPE_CONTROL_WRITE_FLUSH (1<<12)#define PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH (1<<12)/* gen6+ */ #define PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE (1<<11)/* MBZ on ILK */
Signature · 1 line
2.40.1
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines
Responses should be made by Fri, 11 Aug 2023 10:36:10 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.4.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.4.y
and the diffstat can be found below.
For RCU,
thanks,
- Joel
Quoted 786 lines
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:Greg Kroah-Hartman <[email protected]>
Linux 6.4.10-rc1Andi Shyti <[email protected]>
drm/i915/gt: Enable theCCS_FLUSHbit in the pipe control and in the CSAndi Shyti <[email protected]>
drm/i915/gt: Support aux invalidation on all enginesJonathan Cavitt <[email protected]>
drm/i915/gt: Poll aux invalidation register bit on invalidationAndi Shyti <[email protected]>
drm/i915/gt: Rename flags withbit_group_Xaccording to the datasheetTejas Upadhyay <[email protected]>
drm/i915/gt: Add workaround 14016712196Jonathan Cavitt <[email protected]>
drm/i915/gt: Ensure memory quiesced before invalidationAndi Shyti <[email protected]>
drm/i915: Add thegen12_needs_ccs_aux_invhelperXu Yang <[email protected]>
ARM: dts: nxp/imx6sll: fix wrong property name in usbphy nodeSean Christopherson <[email protected]>
selftests/rseq: Play nice with binaries statically linked against glibc 2.35+Lijo Lazar <[email protected]>
drm/amdgpu: Use apt name for FW reserved regionAlexander Stein <[email protected]>
drm/imx/ipuv3: Fix front porch adjustment upon hactive aligningAneesh Kumar K.V <[email protected]>
powerpc/mm/altmap: Fix altmap boundary checkChristophe JAILLET <[email protected]>
mtd: rawnand:fsl_upm: Fix an off-by one test infun_exec_op()Arnd Bergmann <[email protected]>
mtd: spi-nor: avoid holes in structspi_mem_opChen-Yu Tsai <[email protected]>
clk: mediatek: mt8183: Add back SSPM related clocksJohan Jonker <[email protected]>
mtd: rawnand: rockchip: Align hwecc vs. raw page helper layoutsJohan Jonker <[email protected]>
mtd: rawnand: rockchip: fix oobfree offset and descriptionRoger Quadros <[email protected]>
mtd: rawnand:omap_elm: Fix incorrect type in assignmentPavel Begunkov <[email protected]>
io_uring: annotate offset timeout racesChao Yu <[email protected]>
f2fs: fix to do sanity check on direct node intruncate_dnode()Filipe Manana <[email protected]>
btrfs: remove BUG_ON()'s inadd_new_free_space()Jan Kara <[email protected]>
ext2: Drop fragment supportJason Gunthorpe <[email protected]>
mm/gup: do not return 0 frompin_user_pages_fast()for bad argsJan Kara <[email protected]>
fs: Protect reconfiguration of sb read-write from racing writesAlan Stern <[email protected]>
net: usbnet: Fix WARNING in usbnet_start_xmit/usb_submit_urbTetsuo Handa <[email protected]>
debugobjects: Recheckdebug_objects_enabledbefore reportingSungwoo Kim <[email protected]>
Bluetooth: L2CAP: Fix use-after-free inl2cap_sock_ready_cbPrince Kumar Maurya <[email protected]>
fs/sysv: Null check to prevent null-ptr-deref bugTetsuo Handa <[email protected]>
kasan,kmsan: remove__GFP_KSWAPD_RECLAIMusage from kasan/kmsanTetsuo Handa <[email protected]>
fs/ntfs3: Use__GFP_NOWARNallocation atntfs_load_attr_list()Roman Gushchin <[email protected]>
mm: kmem: fix a NULL pointer dereference inobj_stock_flush_required()Linus Torvalds <[email protected]>
file: reinstatef_poslocking optimization for regular filesGeert Uytterhoeven <[email protected]>
clk: imx93: Propagate correct error inimx93_clocks_probe()Stephen Rothwell <[email protected]>
sunvnet: fix sparc64 build error after gso code splitMike Kravetz <[email protected]>
Revert "page cache: fix page_cache_next/prev_miss off by one"Andi Shyti <[email protected]>
drm/i915/gt: Cleanup aux invalidation registersJanusz Krzysztofik <[email protected]>
drm/i915: Fix premature release of request's reusable memoryGuchun Chen <[email protected]>
drm/ttm: check null pointer before accessing when swappingAleksa Sarai <[email protected]>
open: makeRESOLVE_CACHEDcorrectly test forO_TMPFILEMark Brown <[email protected]>
arm64/ptrace: Don't enable SVE when setting streaming SVEMark Brown <[email protected]>
arm64/ptrace: Flush FP state when setting ZT0Mark Brown <[email protected]>
arm64/fpsimd: Sync FPSIMD state with SVE for SME only systemsMark Brown <[email protected]>
arm64/fpsimd: Clear SME state in the target task when setting the VLMark Brown <[email protected]>
arm64/fpsimd: Sync and zero pad FPSIMD state for streaming SVEMike Rapoport (IBM) <[email protected]>
parisc/mm: preallocate fixmap page tables at initNaveen N Rao <[email protected]>
powerpc/ftrace: Create a dummy stackframe to fix stack unwindPaulo Alcantara <[email protected]>
smb: client: fix dfs link mount against w2k8Jiri Olsa <[email protected]>
bpf: Disable preemption inbpf_event_outputIlya Dryomov <[email protected]>
rbd: prevent busy loop when requesting exclusive lockMichael Kelley <[email protected]>
x86/hyperv: Disable IBT when hypercall page lacks ENDBR instructionPaul Fertser <[email protected]>
wifi: mt76: mt7615: do not advertise 5 GHz on first phy of MT7615D (DBDC)Laszlo Ersek <[email protected]>
net:tap_open(): setsk_uidfromcurrent_fsuid()Laszlo Ersek <[email protected]>
net:tun_chr_open(): setsk_uidfromcurrent_fsuid()Dinh Nguyen <[email protected]>
arm64: dts: stratix10: fix incorrect I2C property for SCL signalJiri Olsa <[email protected]>
bpf: Disable preemption inbpf_perf_event_outputSong Shuai <[email protected]>
riscv: Exportva_kernel_pa_offsetin vmcoreinfoArseniy Krasnov <[email protected]>
mtd: rawnand: meson: fix OOB available bytes for ECCOlivier Maignial <[email protected]>
mtd: spinand: winbond: Fixecc_get_statusOlivier Maignial <[email protected]>
mtd: spinand: toshiba: Fixecc_get_statusSungjong Seo <[email protected]>
exfat: releases_lockbefore callingdir_emit()Namjae Jeon <[email protected]>
exfat: check if filename entries exceeds max filename lengthgaoming <[email protected]>
exfat: use kvmalloc_array/kvfree instead of kmalloc_array/kfreeKrzysztof Kozlowski <[email protected]>
firmware:arm_scmi: Drop OF node reference in the transport channel setupXiubo Li <[email protected]>
ceph: defer stopping mdscdelayed_workRoss Maynard <[email protected]>
USB: zaurus: Add ID for A-300/B-500/C-700Ilya Dryomov <[email protected]>
libceph: fix potential hang inceph_osdc_notify()Song Shuai <[email protected]>
Documentation: kdump: Addva_kernel_pa_offsetfor RISCV64Michael Kelley <[email protected]>
scsi: storvsc: Limitmax_sectorsfor virtual Fibre Channel devicesSteffen Maier <[email protected]>
scsi: zfcp: Deferfc_rportblocking until after ADISC responseBoqun Feng <[email protected]>
rust: allocator: Prevent mis-aligned allocationStefano Garzarella <[email protected]>
test/vsock: removevsock_perfexecutable onmake cleanEric Dumazet <[email protected]>
tcp_metrics: fix data-race intcpm_suck_dst()vs fastopenEric Dumazet <[email protected]>
tcp_metrics: annotate data-races around tm->tcpm_netEric Dumazet <[email protected]>
tcp_metrics: annotate data-races around tm->tcpm_vals[]Eric Dumazet <[email protected]>
tcp_metrics: annotate data-races around tm->tcpm_lockEric Dumazet <[email protected]>
tcp_metrics: annotate data-races around tm->tcpm_stampEric Dumazet <[email protected]>
tcp_metrics: fixaddr_same()helperJonas Gorski <[email protected]>
prestera: fix fallback to previous version on same major versionLeon Romanovsky <[email protected]>
net/mlx5e: Set proper IPsec source port in L4 selectorJianbo Liu <[email protected]>
net/mlx5:fs_core: Skip the FTs in the sameFS_TYPE_PRIO_CHAINSfs_prioJianbo Liu <[email protected]>
net/mlx5:fs_core: Makefind_closest_ftmore genericBenjamin Poirier <[email protected]>
vxlan: Fix nexthop hash sizeYue Haibing <[email protected]>
ip6mr: Fixskb_under_panicinip6mr_cache_report()Alexandra Winter <[email protected]>
s390/qeth: Don't call dev_close/dev_open (DOWN/UP)Lin Ma <[email protected]>
net: dcb: choose correct policy to parseDCB_ATTR_BCNMichael Chan <[email protected]>
bnxt_en: Fixmax_mtusetting for multi-buf XDPSomnath Kotur <[email protected]>
bnxt_en: Fix page pool logic for page size >= 64KKuniyuki Iwashima <[email protected]>
selftest: net: Assert on a proper value inso_incoming_cpu.c.Mark Brown <[email protected]>
net: netsec: Ignore 'phy-mode' on SynQuacer in DT modeYuanjun Gong <[email protected]>
net: korina: handle clk prepare error inkorina_probe()Dan Carpenter <[email protected]>
net:ll_temac: fix error checking ofirq_of_parse_and_map()Tomas Glozar <[email protected]>
bpf: sockmap: Removepreempt_disableinsock_map_sk_acquirevalis <[email protected]>
net/sched:cls_route: No longer copytcf_resulton update to avoid use-after-freevalis <[email protected]>
net/sched:cls_fw: No longer copytcf_resulton update to avoid use-after-freevalis <[email protected]>
net/sched:cls_u32: No longer copytcf_resulton update to avoid use-after-freeHou Tao <[email protected]>
bpf, cpumap: Handle skb as well when clean upptr_ringHou Tao <[email protected]>
bpf, cpumap: Make sure kthread is running before map update returnsAndrii Nakryiko <[email protected]>
bpf: Centralize permissions checks for all BPF map typesAndrii Nakryiko <[email protected]>
bpf: Inline map creation logic inmap_create()functionAndrii Nakryiko <[email protected]>
bpf: Move unprivileged checks intomap_create()andbpf_prog_load()Michal Schmidt <[email protected]>
octeon_ep: initialize mbox mutexesJakub Kicinski <[email protected]>
bnxt: don't handle XDP in netpollRafal Rogalski <[email protected]>
ice: Fix RDMA VSI removal during queue rebuildDuoming Zhou <[email protected]>
net: usb: lan78xx: reorder cleanup operations to avoid UAF bugsKuniyuki Iwashima <[email protected]>
net/sched: taprio: LimitTCA_TAPRIO_ATTR_SCHED_CYCLE_TIMEtoINT_MAX.Eric Dumazet <[email protected]>
net: annotate data-races around sk->sk_priorityEric Dumazet <[email protected]>
net: add missing data-race annotation forsk_ll_usecEric Dumazet <[email protected]>
net: add missing data-race annotations around sk->sk_peek_offEric Dumazet <[email protected]>
net: annotate data-races around sk->sk_markEric Dumazet <[email protected]>
net: add missing READ_ONCE(sk->sk_rcvbuf) annotationEric Dumazet <[email protected]>
net: add missing READ_ONCE(sk->sk_sndbuf) annotationEric Dumazet <[email protected]>
net: add missing READ_ONCE(sk->sk_rcvlowat) annotationEric Dumazet <[email protected]>
net: annotate data-races around sk->sk_max_pacing_rateEric Dumazet <[email protected]>
net: annotate data-race around sk->sk_txrehashEric Dumazet <[email protected]>
net: annotate data-races around sk->sk_reserved_memRichard Gobert <[email protected]>
net: gro: fix misuse of CB in udp socket lookupEric Dumazet <[email protected]>
net: move gso declarations and functions to their own filesKonstantin Khorenko <[email protected]>
qed: Fix scheduling in a tasklet while getting statsThierry Reding <[email protected]>
net: stmmac: tegra: Properly allocate clock bulk dataChengfeng Ye <[email protected]>
mISDN: hfcpci: Fix potential deadlock on &hc->lockJamal Hadi Salim <[email protected]>
net: sched:cls_u32: Fix match key mis-addressingGeorg Müller <[email protected]>
perf testuprobe_from_different_cu: Skip if there is no gccYuanjun Gong <[email protected]>
net: dsa: fix value check inbcm_sf2_sw_probe()Lin Ma <[email protected]>
rtnetlink: letrtnl_bridge_setlinkchecksIFLA_BRIDGE_MODElengthLin Ma <[email protected]>
bpf: Add length check forSK_DIAG_BPF_STORAGE_REQ_MAP_FDparsingShay Drory <[email protected]>
net/mlx5: Unregister devlink params in case interface is downChris Mi <[email protected]>
net/mlx5:fs_chains: Fix ft prio ifignore_flow_levelis not supportedJianbo Liu <[email protected]>
net/mlx5e: kTLS, Fix protection domain in use syndrome when devlink reloadDragos Tatulea <[email protected]>
net/mlx5e: xsk: Fix crash on regular rq reactivationDragos Tatulea <[email protected]>
net/mlx5e: xsk: Fix invalid buffer access for legacy rqJianbo Liu <[email protected]>
net/mlx5e: Move representor neigh cleanup to profilecleanup_txAmir Tzin <[email protected]>
net/mlx5e: Fix crash moving to switchdev mode when ntuple offload is setChris Mi <[email protected]>
net/mlx5e: Don't hold encap tbl lock if there is no encap actionShay Drory <[email protected]>
net/mlx5: Honor user input for migratable port fn attrYuanjun Gong <[email protected]>
net/mlx5e: fix return value check inmlx5e_ipsec_remove_trailer()Zhengchao Shao <[email protected]>
net/mlx5: fix potential memory leak inmlx5e_init_rep_rxZhengchao Shao <[email protected]>
net/mlx5: DR, fix memory leak inmlx5dr_cmd_create_reformat_ctxZhengchao Shao <[email protected]>
net/mlx5e: fix double free inmacsec_fs_tx_create_crypto_table_groupsIlan Peer <[email protected]>
wifi: cfg80211: Fix return value in scan logicHaixin Yu <[email protected]>
perf pmu arm64: Fix reading the PMU cpu slots in sysfsGao Xiang <[email protected]>
erofs: fix wrong primary bvec selection on deduplicated extentsHeiko Carstens <[email protected]>
KVM: s390: fix sthyi error handlingSven Schnelle <[email protected]>
s390/vmem: split pages when debug pagealloc is enabled[email protected] <[email protected]>
word-at-a-time: use the same return type forhas_zeroregardless of endiannessDurai Manickam KR <[email protected]>
ARM: dts: at91: sam9x60: fix the SOC detectionClaudiu Beznea <[email protected]>
ARM: dts: at91: use generic name for shutdown controllerClaudiu Beznea <[email protected]>
ARM: dts: at91: use clock-controller name for sckc nodesClaudiu Beznea <[email protected]>
ARM: dts: at91: use clock-controller name for PMC nodesCristian Marussi <[email protected]>
firmware:arm_scmi: Fixchan_freecleanup on SMCLucas Stach <[email protected]>
soc: imx: imx8mp-blk-ctrl: register HSIO PLL clock asbus_power_devchildDmitry Baryshkov <[email protected]>
ARM: dts: nxp/imx: limit sk-imx53 supported frequenciesYury Norov <[email protected]>
lib/bitmap: workaroundconst_evaltest build failureSukrut Bellary <[email protected]>
firmware:arm_scmi: Fix signed error return values handlingPunit Agrawal <[email protected]>
firmware: smccc: Fix use of uninitialised results structureBenjamin Gaignard <[email protected]>
arm64: dts: freescale: Fix VPU G2 clockHugo Villeneuve <[email protected]>
arm64: dts: imx8mn-var-som: add missing pull-up for onboard PHY reset pinmuxYashwanth Varakala <[email protected]>
arm64: dts: phycore-imx8mm: Correction in gpio-line-namesYashwanth Varakala <[email protected]>
arm64: dts: phycore-imx8mm: Label typo-fix of VPUTim Harvey <[email protected]>
arm64: dts: imx8mm-venice-gw7904: disable disp_blk_ctrlTim Harvey <[email protected]>
arm64: dts: imx8mm-venice-gw7903: disable disp_blk_ctrlRobin Murphy <[email protected]>
iommu/arm-smmu-v3: Document nesting-related errataRobin Murphy <[email protected]>
iommu/arm-smmu-v3: Add explicit feature for nestingRobin Murphy <[email protected]>
iommu/arm-smmu-v3: Document MMU-700 erratum 2812531Robin Murphy <[email protected]>
iommu/arm-smmu-v3: Work around MMU-600 erratum 1076982Jann Horn <[email protected]>
mm: lock_vma_under_rcu() must check vma->anon_vma under vma lock-------------
Diffstat:
Documentation/admin-guide/kdump/vmcoreinfo.rst | 6 + Documentation/arm64/silicon-errata.rst | 4 + Makefile | 4 +- arch/arm/boot/dts/at91-qil_a9260.dts | 2 +- arch/arm/boot/dts/at91-sama5d27_som1_ek.dts | 2 +- arch/arm/boot/dts/at91-sama5d2_ptc_ek.dts | 2 +- arch/arm/boot/dts/at91-sama5d2_xplained.dts | 2 +- arch/arm/boot/dts/at91rm9200.dtsi | 2 +- arch/arm/boot/dts/at91sam9260.dtsi | 4 +- arch/arm/boot/dts/at91sam9260ek.dts | 2 +- arch/arm/boot/dts/at91sam9261.dtsi | 4 +- arch/arm/boot/dts/at91sam9263.dtsi | 4 +- arch/arm/boot/dts/at91sam9g20.dtsi | 2 +- arch/arm/boot/dts/at91sam9g20ek_common.dtsi | 2 +- arch/arm/boot/dts/at91sam9g25.dtsi | 2 +- arch/arm/boot/dts/at91sam9g35.dtsi | 2 +- arch/arm/boot/dts/at91sam9g45.dtsi | 6 +- arch/arm/boot/dts/at91sam9n12.dtsi | 4 +- arch/arm/boot/dts/at91sam9rl.dtsi | 6 +- arch/arm/boot/dts/at91sam9x25.dtsi | 2 +- arch/arm/boot/dts/at91sam9x35.dtsi | 2 +- arch/arm/boot/dts/at91sam9x5.dtsi | 6 +- arch/arm/boot/dts/imx53-sk-imx53.dts | 10 + arch/arm/boot/dts/imx6sll.dtsi | 2 +- arch/arm/boot/dts/sam9x60.dtsi | 32 +-- arch/arm/boot/dts/sama5d2.dtsi | 6 +- arch/arm/boot/dts/sama5d3.dtsi | 6 +- arch/arm/boot/dts/sama5d3_emac.dtsi | 2 +- arch/arm/boot/dts/sama5d4.dtsi | 6 +- arch/arm/boot/dts/sama7g5.dtsi | 4 +- arch/arm/boot/dts/usb_a9260.dts | 2 +- arch/arm/boot/dts/usb_a9263.dts | 2 +- .../boot/dts/altera/socfpga_stratix10_socdk.dts | 2 +- .../dts/altera/socfpga_stratix10_socdk_nand.dts | 2 +- .../dts/freescale/imx8mm-phyboard-polis-rdk.dts | 2 +- .../boot/dts/freescale/imx8mm-phycore-som.dtsi | 4 +- .../boot/dts/freescale/imx8mm-venice-gw7903.dts | 4 + .../boot/dts/freescale/imx8mm-venice-gw7904.dts | 4 + arch/arm64/boot/dts/freescale/imx8mn-var-som.dtsi | 2 +- arch/arm64/boot/dts/freescale/imx8mq.dtsi | 2 +- arch/arm64/kernel/fpsimd.c | 9 +- arch/arm64/kernel/ptrace.c | 10 +- arch/parisc/mm/fixmap.c | 3 - arch/parisc/mm/init.c | 34 +++ arch/powerpc/include/asm/word-at-a-time.h | 2 +- arch/powerpc/kernel/trace/ftrace_mprofile.S | 9 +- arch/powerpc/mm/init_64.c | 3 +- arch/riscv/kernel/crash_core.c | 2 + arch/s390/kernel/sthyi.c | 6 +- arch/s390/kvm/intercept.c | 9 +- arch/s390/mm/vmem.c | 2 + arch/x86/hyperv/hv_init.c | 21 ++ drivers/block/rbd.c | 28 ++- drivers/clk/imx/clk-imx93.c | 2 +- drivers/clk/mediatek/clk-mt8183.c | 27 ++ drivers/firmware/arm_scmi/mailbox.c | 4 +- drivers/firmware/arm_scmi/raw_mode.c | 5 +- drivers/firmware/arm_scmi/smc.c | 21 +- drivers/firmware/smccc/soc_id.c | 5 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 35 +-- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 3 +- drivers/gpu/drm/i915/gt/gen8_engine_cs.c | 178 ++++++++++---- drivers/gpu/drm/i915/gt/gen8_engine_cs.h | 21 +- drivers/gpu/drm/i915/gt/intel_gpu_commands.h | 2 + drivers/gpu/drm/i915/gt/intel_gt_regs.h | 16 +- drivers/gpu/drm/i915/gt/intel_lrc.c | 17 +- drivers/gpu/drm/i915/i915_active.c | 99 +++++--- drivers/gpu/drm/i915/i915_request.c | 11 + drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c | 2 +- drivers/gpu/drm/ttm/ttm_bo.c | 3 +- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 50 ++++ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 8 + drivers/isdn/hardware/mISDN/hfcpci.c | 10 +- drivers/mtd/nand/raw/fsl_upm.c | 2 +- drivers/mtd/nand/raw/meson_nand.c | 3 +- drivers/mtd/nand/raw/omap_elm.c | 24 +- drivers/mtd/nand/raw/rockchip-nand-controller.c | 45 ++-- drivers/mtd/nand/spi/toshiba.c | 4 +- drivers/mtd/nand/spi/winbond.c | 4 +- drivers/mtd/spi-nor/spansion.c | 4 +- drivers/net/dsa/bcm_sf2.c | 8 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 85 ++++--- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 14 +- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 2 +- drivers/net/ethernet/broadcom/tg3.c | 1 + drivers/net/ethernet/intel/ice/ice_main.c | 18 ++ drivers/net/ethernet/korina.c | 3 +- .../ethernet/marvell/octeon_ep/octep_ctrl_mbox.c | 3 + .../net/ethernet/marvell/prestera/prestera_pci.c | 3 +- .../ethernet/mellanox/mlx5/core/en/tc_tun_encap.c | 3 - .../net/ethernet/mellanox/mlx5/core/en/xsk/rx.c | 5 +- .../mellanox/mlx5/core/en_accel/ipsec_fs.c | 4 +- .../mellanox/mlx5/core/en_accel/ipsec_rxtx.c | 4 +- .../ethernet/mellanox/mlx5/core/en_accel/ktls.c | 8 - .../ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c | 29 ++- .../mellanox/mlx5/core/en_accel/macsec_fs.c | 1 + drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c | 10 + drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 29 ++- drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 20 +- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 21 +- .../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 3 +- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 105 ++++++-- .../ethernet/mellanox/mlx5/core/lib/fs_chains.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 + .../ethernet/mellanox/mlx5/core/steering/dr_cmd.c | 5 +- drivers/net/ethernet/myricom/myri10ge/myri10ge.c | 1 + drivers/net/ethernet/qlogic/qed/qed_dev_api.h | 16 ++ drivers/net/ethernet/qlogic/qed/qed_fcoe.c | 19 +- drivers/net/ethernet/qlogic/qed/qed_fcoe.h | 17 +- drivers/net/ethernet/qlogic/qed/qed_hw.c | 26 +- drivers/net/ethernet/qlogic/qed/qed_iscsi.c | 19 +- drivers/net/ethernet/qlogic/qed/qed_iscsi.h | 8 +- drivers/net/ethernet/qlogic/qed/qed_l2.c | 19 +- drivers/net/ethernet/qlogic/qed/qed_l2.h | 24 ++ drivers/net/ethernet/qlogic/qed/qed_main.c | 6 +- drivers/net/ethernet/sfc/siena/tx_common.c | 1 + drivers/net/ethernet/sfc/tx_common.c | 1 + drivers/net/ethernet/socionext/netsec.c | 11 + drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c | 3 +- drivers/net/ethernet/sun/sunvnet_common.c | 1 + drivers/net/ethernet/xilinx/ll_temac_main.c | 12 +- drivers/net/tap.c | 3 +- drivers/net/tun.c | 2 +- drivers/net/usb/cdc_ether.c | 21 ++ drivers/net/usb/lan78xx.c | 7 +- drivers/net/usb/r8152.c | 1 + drivers/net/usb/usbnet.c | 6 + drivers/net/usb/zaurus.c | 21 ++ drivers/net/wireguard/device.c | 1 + drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 1 + drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c | 6 +- drivers/s390/net/qeth_core.h | 1 - drivers/s390/net/qeth_core_main.c | 2 - drivers/s390/net/qeth_l2_main.c | 9 +- drivers/s390/net/qeth_l3_main.c | 8 +- drivers/s390/scsi/zfcp_fc.c | 6 +- drivers/scsi/storvsc_drv.c | 4 + drivers/soc/imx/imx8mp-blk-ctrl.c | 2 +- fs/btrfs/block-group.c | 51 ++-- fs/btrfs/block-group.h | 4 +- fs/btrfs/free-space-tree.c | 24 +- fs/ceph/mds_client.c | 4 +- fs/ceph/mds_client.h | 5 + fs/ceph/super.c | 10 + fs/erofs/zdata.c | 7 +- fs/exfat/balloc.c | 6 +- fs/exfat/dir.c | 36 +-- fs/ext2/ext2.h | 12 - fs/ext2/super.c | 23 +- fs/f2fs/f2fs.h | 1 - fs/f2fs/file.c | 5 - fs/f2fs/node.c | 14 +- fs/file.c | 18 +- fs/ntfs3/attrlist.c | 4 +- fs/open.c | 2 +- fs/smb/client/dfs.c | 6 +- fs/super.c | 11 +- fs/sysv/itree.c | 4 + include/asm-generic/word-at-a-time.h | 2 +- include/linux/f2fs_fs.h | 1 + include/linux/netdevice.h | 26 +- include/linux/skbuff.h | 71 ------ include/linux/spi/spi-mem.h | 4 + include/net/gro.h | 44 ++++ include/net/gso.h | 109 ++++++++ include/net/inet_sock.h | 7 +- include/net/ip.h | 2 +- include/net/route.h | 4 +- include/net/udp.h | 1 + include/net/vxlan.h | 4 +- io_uring/timeout.c | 2 +- kernel/bpf/bloom_filter.c | 3 - kernel/bpf/bpf_local_storage.c | 3 - kernel/bpf/bpf_struct_ops.c | 3 - kernel/bpf/cpumap.c | 39 +-- kernel/bpf/devmap.c | 3 - kernel/bpf/hashtab.c | 6 - kernel/bpf/lpm_trie.c | 3 - kernel/bpf/queue_stack_maps.c | 4 - kernel/bpf/reuseport_array.c | 3 - kernel/bpf/stackmap.c | 3 - kernel/bpf/syscall.c | 136 ++++++---- kernel/trace/bpf_trace.c | 17 +- lib/Makefile | 6 + lib/debugobjects.c | 9 + lib/test_bitmap.c | 8 +- mm/filemap.c | 26 +- mm/gup.c | 2 +- mm/kasan/generic.c | 4 +- mm/kasan/tags.c | 2 +- mm/kmsan/core.c | 6 +- mm/kmsan/instrumentation.c | 2 +- mm/memcontrol.c | 19 +- mm/memory.c | 28 ++- net/bluetooth/l2cap_sock.c | 2 + net/can/raw.c | 2 +- net/ceph/osd_client.c | 20 +- net/core/Makefile | 2 +- net/core/bpf_sk_storage.c | 5 +- net/core/dev.c | 70 +----- net/core/gro.c | 59 +---- net/core/gso.c | 273 +++++++++++++++++++++ net/core/rtnetlink.c | 8 +- net/core/skbuff.c | 142 +---------- net/core/sock.c | 45 ++-- net/core/sock_map.c | 6 - net/dcb/dcbnl.c | 2 +- net/dccp/ipv6.c | 4 +- net/ipv4/af_inet.c | 1 + net/ipv4/esp4_offload.c | 1 + net/ipv4/gre_offload.c | 1 + net/ipv4/inet_diag.c | 4 +- net/ipv4/ip_output.c | 9 +- net/ipv4/ip_sockglue.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/route.c | 4 +- net/ipv4/tcp_ipv4.c | 4 +- net/ipv4/tcp_metrics.c | 70 ++++-- net/ipv4/tcp_offload.c | 1 + net/ipv4/udp.c | 9 +- net/ipv4/udp_offload.c | 8 +- net/ipv6/esp6_offload.c | 1 + net/ipv6/ip6_offload.c | 1 + net/ipv6/ip6_output.c | 1 + net/ipv6/ip6mr.c | 2 +- net/ipv6/ping.c | 2 +- net/ipv6/raw.c | 6 +- net/ipv6/route.c | 7 +- net/ipv6/tcp_ipv6.c | 9 +- net/ipv6/udp.c | 12 +- net/ipv6/udp_offload.c | 8 +- net/l2tp/l2tp_ip6.c | 2 +- net/mac80211/tx.c | 1 + net/mpls/af_mpls.c | 1 + net/mpls/mpls_gso.c | 1 + net/mptcp/sockopt.c | 2 +- net/netfilter/nf_flow_table_ip.c | 1 + net/netfilter/nfnetlink_queue.c | 1 + net/netfilter/nft_socket.c | 2 +- net/netfilter/xt_socket.c | 4 +- net/nsh/nsh.c | 1 + net/openvswitch/actions.c | 1 + net/openvswitch/datapath.c | 1 + net/packet/af_packet.c | 12 +- net/sched/act_police.c | 1 + net/sched/cls_fw.c | 1 - net/sched/cls_route.c | 1 - net/sched/cls_u32.c | 57 ++++- net/sched/sch_cake.c | 1 + net/sched/sch_netem.c | 1 + net/sched/sch_taprio.c | 16 +- net/sched/sch_tbf.c | 1 + net/sctp/offload.c | 1 + net/smc/af_smc.c | 2 +- net/unix/af_unix.c | 2 +- net/wireless/scan.c | 2 +- net/xdp/xsk.c | 2 +- net/xdp/xskmap.c | 4 - net/xfrm/xfrm_device.c | 1 + net/xfrm/xfrm_interface_core.c | 1 + net/xfrm/xfrm_output.c | 1 + net/xfrm/xfrm_policy.c | 2 +- rust/bindings/bindings_helper.h | 1 + rust/kernel/allocator.rs | 74 ++++-- tools/perf/arch/arm64/util/pmu.c | 7 +- .../tests/shell/test_uprobe_from_different_cu.sh | 8 +- .../selftests/bpf/prog_tests/unpriv_bpf_disabled.c | 6 +- tools/testing/selftests/net/so_incoming_cpu.c | 2 +- tools/testing/selftests/rseq/rseq.c | 28 ++- .../tc-testing/tc-tests/qdiscs/taprio.json | 25 ++ tools/testing/vsock/Makefile | 2 +- 272 files changed, 2293 insertions(+), 1234 deletions(-)
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 11 Aug 2023 10:36:10 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.4.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.4.y
and the diffstat can be found below.thanks,
greg k-h
Tested rc1 against the Fedora build system (aarch64, ppc64le, s390x, x86_64), and boot tested x86_64. No regressions noted.
Hello,
Quoted 5 lines · On 2023-08-09T12:38:51+02:00 Greg Kroah-Hartman <[email protected]>…
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines
Responses should be made by Fri, 11 Aug 2023 10:36:10 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.4.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.4.y
and the diffstat can be found below.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/awslabs/damon-tests/tree/next/corr
[2] 80226b49c77f ("Linux 6.4.10-rc1")
Thanks,
SJ
[...]
---
ok 1 selftests: damon: debugfs_attrs.sh
ok 2 selftests: damon: debugfs_schemes.sh
ok 3 selftests: damon: debugfs_target_ids.sh
ok 4 selftests: damon: debugfs_empty_targets.sh
ok 5 selftests: damon: debugfs_huge_count_read_write.sh
ok 6 selftests: damon: debugfs_duplicate_context_creation.sh
ok 7 selftests: damon: debugfs_rm_non_contexts.sh
ok 8 selftests: damon: sysfs.sh
ok 9 selftests: damon: sysfs_update_removed_scheme_dir.sh
ok 10 selftests: damon: reclaim.sh
ok 11 selftests: damon: lru_sort.sh
ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_m68k.sh
ok 12 selftests: damon-tests: build_arm64.sh
ok 13 selftests: damon-tests: build_i386_idle_flag.sh
ok 14 selftests: damon-tests: build_i386_highpte.sh
ok 15 selftests: damon-tests: build_nomemcg.sh
PASS
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 11 Aug 2023 10:36:10 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.4.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.4.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 11 Aug 2023 10:36:10 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.4.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.4.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Successfully compiled and installed bindeb-pkgs on my computer (Acer Aspire E15, Intel Core i3 Haswell). No noticeable regressions.
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Thanks,
Conor.
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 11 Aug 2023 10:36:10 +0000. Anything received after that time might be too late.
Build results:
total: 157 pass: 157 fail: 0 Qemu test results: total: 522 pass: 522 fail: 0
Guenter
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
For Rust, build tested and booted to see the minimal and printing Rust samples output in the kernel log:
Cheers,
Miguel
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 11 Aug 2023 10:36:10 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.4.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.4.y
and the diffstat can be found below.thanks,
greg k-h
While building Linux stable rc 6.4 x86_64 with clang-17 failed due to following warnings / errors.
Regressions found on x86_64:
- build/clang-nightly-lkftconfig-kselftest
- build/clang-nightly-x86_64_defconfig
- build/clang-nightly-lkftconfig
- build/clang-lkftconfig
- build/clang-nightly-allmodconfig
Build errors:
-----
ld.lld: error: ./arch/x86/kernel/vmlinux.lds:193: at least one side of the expression must be absolute
make[2]: *** [scripts/Makefile.vmlinux:34: vmlinux] Error 1
upstream report:
-----
- https://lore.kernel.org/llvm/CA+G9fYsdUeNu-gwbs0+T6XHi4hYYk=Y9725-wFhZ7gJMspLDRA@mail.gmail.com/
Proposed fix patch:
-----
[PATCH] x86/srso: fix build breakage for LD=ld.lld
- https://lore.kernel.org/lkml/[email protected]/T/
--
Linaro LKFT
https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.4.10 release. There are 165 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 11 Aug 2023 10:36:10 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.4.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.4:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
130 tests: 130 pass, 0 failLinux version: 6.4.10-rc1-g80226b49c77f
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04