]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ice: fix PTP cleanup on driver removal in error path
authorGrzegorz Nitka <grzegorz.nitka@intel.com>
Mon, 20 Oct 2025 10:02:16 +0000 (12:02 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 18 Nov 2025 22:30:11 +0000 (14:30 -0800)
Improve the cleanup on releasing PTP resources in error path.
The error case might happen either at the driver probe and PTP
feature initialization or on PTP restart (errors in reset handling, NVM
update etc). In both cases, calls to PF PTP cleanup (ice_ptp_cleanup_pf
function) and 'ps_lock' mutex deinitialization were missed.
Additionally, ptp clock was not unregistered in the latter case.

Keep PTP state as 'uninitialized' on init to distinguish between error
scenarios and to avoid resource release duplication at driver removal.

The consequence of missing ice_ptp_cleanup_pf call is the following call
trace dumped when ice_adapter object is freed (port list is not empty,
as it is required at this stage):

[  T93022] ------------[ cut here ]------------
[  T93022] WARNING: CPU: 10 PID: 93022 at
ice/ice_adapter.c:67 ice_adapter_put+0xef/0x100 [ice]
...
[  T93022] RIP: 0010:ice_adapter_put+0xef/0x100 [ice]
...
[  T93022] Call Trace:
[  T93022]  <TASK>
[  T93022]  ? ice_adapter_put+0xef/0x100 [ice
33d2647ad4f6d866d41eefff1806df37c68aef0c]
[  T93022]  ? __warn.cold+0xb0/0x10e
[  T93022]  ? ice_adapter_put+0xef/0x100 [ice
33d2647ad4f6d866d41eefff1806df37c68aef0c]
[  T93022]  ? report_bug+0xd8/0x150
[  T93022]  ? handle_bug+0xe9/0x110
[  T93022]  ? exc_invalid_op+0x17/0x70
[  T93022]  ? asm_exc_invalid_op+0x1a/0x20
[  T93022]  ? ice_adapter_put+0xef/0x100 [ice
33d2647ad4f6d866d41eefff1806df37c68aef0c]
[  T93022]  pci_device_remove+0x42/0xb0
[  T93022]  device_release_driver_internal+0x19f/0x200
[  T93022]  driver_detach+0x48/0x90
[  T93022]  bus_remove_driver+0x70/0xf0
[  T93022]  pci_unregister_driver+0x42/0xb0
[  T93022]  ice_module_exit+0x10/0xdb0 [ice
33d2647ad4f6d866d41eefff1806df37c68aef0c]
...
[  T93022] ---[ end trace 0000000000000000 ]---
[  T93022] ice: module unloaded

Fixes: e800654e85b5 ("ice: Use ice_adapter for PTP shared data instead of auxdev")
Signed-off-by: Grzegorz Nitka <grzegorz.nitka@intel.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de>
Tested-by: Rinitha S <sx.rinitha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_ptp.c

index fb0f6365a6d6f17c32dad0ee27111f068887ba24..8ec0f7d0fcebddedbb5094daa3a52ff6dfe819c5 100644 (file)
@@ -3246,7 +3246,7 @@ void ice_ptp_init(struct ice_pf *pf)
 
        err = ice_ptp_init_port(pf, &ptp->port);
        if (err)
-               goto err_exit;
+               goto err_clean_pf;
 
        /* Start the PHY timestamping block */
        ice_ptp_reset_phy_timestamping(pf);
@@ -3263,13 +3263,19 @@ void ice_ptp_init(struct ice_pf *pf)
        dev_info(ice_pf_to_dev(pf), "PTP init successful\n");
        return;
 
+err_clean_pf:
+       mutex_destroy(&ptp->port.ps_lock);
+       ice_ptp_cleanup_pf(pf);
 err_exit:
        /* If we registered a PTP clock, release it */
        if (pf->ptp.clock) {
                ptp_clock_unregister(ptp->clock);
                pf->ptp.clock = NULL;
        }
-       ptp->state = ICE_PTP_ERROR;
+       /* Keep ICE_PTP_UNINIT state to avoid ambiguity at driver unload
+        * and to avoid duplicated resources release.
+        */
+       ptp->state = ICE_PTP_UNINIT;
        dev_err(ice_pf_to_dev(pf), "PTP failed %d\n", err);
 }
 
@@ -3282,9 +3288,19 @@ err_exit:
  */
 void ice_ptp_release(struct ice_pf *pf)
 {
-       if (pf->ptp.state != ICE_PTP_READY)
+       if (pf->ptp.state == ICE_PTP_UNINIT)
                return;
 
+       if (pf->ptp.state != ICE_PTP_READY) {
+               mutex_destroy(&pf->ptp.port.ps_lock);
+               ice_ptp_cleanup_pf(pf);
+               if (pf->ptp.clock) {
+                       ptp_clock_unregister(pf->ptp.clock);
+                       pf->ptp.clock = NULL;
+               }
+               return;
+       }
+
        pf->ptp.state = ICE_PTP_UNINIT;
 
        /* Disable timestamping for both Tx and Rx */