Skip to content

Commit e835098

Browse files
kubalewskigregkh
authored andcommitted
ice: fix crash when writing timestamp on RX rings
[ Upstream commit 4503cc7 ] Do not allow to write timestamps on RX rings if PF is being configured. When PF is being configured RX rings can be freed or rebuilt. If at the same time timestamps are updated, the kernel will crash by dereferencing null RX ring pointer. PID: 1449 TASK: ff187d28ed658040 CPU: 34 COMMAND: "ice-ptp-0000:51" #0 [ff1966a94a713bb0] machine_kexec at ffffffff9d05a0be #1 [ff1966a94a713c08] __crash_kexec at ffffffff9d192e9d #2 [ff1966a94a713cd0] crash_kexec at ffffffff9d1941bd #3 [ff1966a94a713ce8] oops_end at ffffffff9d01bd54 #4 [ff1966a94a713d08] no_context at ffffffff9d06bda4 #5 [ff1966a94a713d60] __bad_area_nosemaphore at ffffffff9d06c10c #6 [ff1966a94a713da8] do_page_fault at ffffffff9d06cae4 #7 [ff1966a94a713de0] page_fault at ffffffff9da0107e [exception RIP: ice_ptp_update_cached_phctime+91] RIP: ffffffffc076db8b RSP: ff1966a94a713e98 RFLAGS: 00010246 RAX: 16e3db9c6b7ccae4 RBX: ff187d269dd3c180 RCX: ff187d269cd4d018 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 RBP: ff187d269cfcc644 R8: ff187d339b9641b0 R9: 0000000000000000 R10: 0000000000000002 R11: 0000000000000000 R12: ff187d269cfcc648 R13: ffffffff9f128784 R14: ffffffff9d101b70 R15: ff187d269cfcc640 ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 #8 [ff1966a94a713ea0] ice_ptp_periodic_work at ffffffffc076dbef [ice] #9 [ff1966a94a713ee0] kthread_worker_fn at ffffffff9d101c1b #10 [ff1966a94a713f10] kthread at ffffffff9d101b4d #11 [ff1966a94a713f50] ret_from_fork at ffffffff9da0023f Fixes: 77a7811 ("ice: enable receive hardware timestamping") Signed-off-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com> Reviewed-by: Michal Schmidt <mschmidt@redhat.com> Tested-by: Dave Cain <dcain@redhat.com> Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 3f09159 commit e835098

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

drivers/net/ethernet/intel/ice/ice_ptp.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -499,12 +499,19 @@ ice_ptp_read_src_clk_reg(struct ice_pf *pf, struct ptp_system_timestamp *sts)
499499
* This function must be called periodically to ensure that the cached value
500500
* is never more than 2 seconds old. It must also be called whenever the PHC
501501
* time has been changed.
502+
*
503+
* Return:
504+
* * 0 - OK, successfully updated
505+
* * -EAGAIN - PF was busy, need to reschedule the update
502506
*/
503-
static void ice_ptp_update_cached_phctime(struct ice_pf *pf)
507+
static int ice_ptp_update_cached_phctime(struct ice_pf *pf)
504508
{
505509
u64 systime;
506510
int i;
507511

512+
if (test_and_set_bit(ICE_CFG_BUSY, pf->state))
513+
return -EAGAIN;
514+
508515
/* Read the current PHC time */
509516
systime = ice_ptp_read_src_clk_reg(pf, NULL);
510517

@@ -527,6 +534,9 @@ static void ice_ptp_update_cached_phctime(struct ice_pf *pf)
527534
WRITE_ONCE(vsi->rx_rings[j]->cached_phctime, systime);
528535
}
529536
}
537+
clear_bit(ICE_CFG_BUSY, pf->state);
538+
539+
return 0;
530540
}
531541

532542
/**
@@ -2322,17 +2332,18 @@ static void ice_ptp_periodic_work(struct kthread_work *work)
23222332
{
23232333
struct ice_ptp *ptp = container_of(work, struct ice_ptp, work.work);
23242334
struct ice_pf *pf = container_of(ptp, struct ice_pf, ptp);
2335+
int err;
23252336

23262337
if (!test_bit(ICE_FLAG_PTP, pf->flags))
23272338
return;
23282339

2329-
ice_ptp_update_cached_phctime(pf);
2340+
err = ice_ptp_update_cached_phctime(pf);
23302341

23312342
ice_ptp_tx_tstamp_cleanup(&pf->hw, &pf->ptp.port.tx);
23322343

2333-
/* Run twice a second */
2344+
/* Run twice a second or reschedule if phc update failed */
23342345
kthread_queue_delayed_work(ptp->kworker, &ptp->work,
2335-
msecs_to_jiffies(500));
2346+
msecs_to_jiffies(err ? 10 : 500));
23362347
}
23372348

23382349
/**

0 commit comments

Comments
 (0)