* [PATCH net 1/4] ice: Fix improper extts handling
2024-06-25 17:02 [PATCH net 0/4][pull request] Intel Wired LAN Driver Updates 2024-06-25 (ice) Tony Nguyen
@ 2024-06-25 17:02 ` Tony Nguyen
2024-06-26 13:36 ` Maciej Fijalkowski
2024-06-27 23:15 ` Jakub Kicinski
2024-06-25 17:02 ` [PATCH net 2/4] ice: Don't process extts if PTP is disabled Tony Nguyen
` (2 subsequent siblings)
3 siblings, 2 replies; 12+ messages in thread
From: Tony Nguyen @ 2024-06-25 17:02 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, netdev
Cc: Milena Olech, anthony.l.nguyen, richardcochran, Przemek Kitszel,
Jacob Keller, Karol Kolacinski, Simon Horman,
Pucha Himasekhar Reddy
From: Milena Olech <milena.olech@intel.com>
Extts events are disabled and enabled by the application ts2phc.
However, in case where the driver is removed when the application is
running, channel remains enabled. As a result, in the next run of the
app, two channels are enabled and the information "extts on unexpected
channel" is printed to the user.
To avoid that, extts events shall be disabled when PTP is released.
Fixes: 172db5f91d5f ("ice: add support for auxiliary input/output pins")
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Co-developed-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Milena Olech <milena.olech@intel.com>
Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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 | 106 ++++++++++++++++++-----
drivers/net/ethernet/intel/ice/ice_ptp.h | 8 ++
2 files changed, 92 insertions(+), 22 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index 0f17fc1181d2..d8ff9f26010c 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -1584,27 +1584,24 @@ void ice_ptp_extts_event(struct ice_pf *pf)
/**
* ice_ptp_cfg_extts - Configure EXTTS pin and channel
* @pf: Board private structure
- * @ena: true to enable; false to disable
* @chan: GPIO channel (0-3)
- * @gpio_pin: GPIO pin
- * @extts_flags: request flags from the ptp_extts_request.flags
+ * @config: desired EXTTS configuration.
+ * @store: If set to true, the values will be stored
+ *
+ * Configure an external timestamp event on the requested channel.
*/
-static int
-ice_ptp_cfg_extts(struct ice_pf *pf, bool ena, unsigned int chan, u32 gpio_pin,
- unsigned int extts_flags)
+static void ice_ptp_cfg_extts(struct ice_pf *pf, unsigned int chan,
+ struct ice_extts_channel *config, bool store)
{
u32 func, aux_reg, gpio_reg, irq_reg;
struct ice_hw *hw = &pf->hw;
u8 tmr_idx;
- if (chan > (unsigned int)pf->ptp.info.n_ext_ts)
- return -EINVAL;
-
tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;
irq_reg = rd32(hw, PFINT_OICR_ENA);
- if (ena) {
+ if (config->ena) {
/* Enable the interrupt */
irq_reg |= PFINT_OICR_TSYN_EVNT_M;
aux_reg = GLTSYN_AUX_IN_0_INT_ENA_M;
@@ -1613,9 +1610,9 @@ ice_ptp_cfg_extts(struct ice_pf *pf, bool ena, unsigned int chan, u32 gpio_pin,
#define GLTSYN_AUX_IN_0_EVNTLVL_FALLING_EDGE BIT(1)
/* set event level to requested edge */
- if (extts_flags & PTP_FALLING_EDGE)
+ if (config->flags & PTP_FALLING_EDGE)
aux_reg |= GLTSYN_AUX_IN_0_EVNTLVL_FALLING_EDGE;
- if (extts_flags & PTP_RISING_EDGE)
+ if (config->flags & PTP_RISING_EDGE)
aux_reg |= GLTSYN_AUX_IN_0_EVNTLVL_RISING_EDGE;
/* Write GPIO CTL reg.
@@ -1636,9 +1633,48 @@ ice_ptp_cfg_extts(struct ice_pf *pf, bool ena, unsigned int chan, u32 gpio_pin,
wr32(hw, PFINT_OICR_ENA, irq_reg);
wr32(hw, GLTSYN_AUX_IN(chan, tmr_idx), aux_reg);
- wr32(hw, GLGEN_GPIO_CTL(gpio_pin), gpio_reg);
+ wr32(hw, GLGEN_GPIO_CTL(config->gpio_pin), gpio_reg);
- return 0;
+ if (store)
+ memcpy(&pf->ptp.extts_channels[chan], config, sizeof(*config));
+}
+
+/**
+ * ice_ptp_disable_all_extts - Disable all EXTTS channels
+ * @pf: Board private structure
+ */
+static void ice_ptp_disable_all_extts(struct ice_pf *pf)
+{
+ struct ice_extts_channel extts_cfg = {};
+ int i;
+
+ for (i = 0; i < pf->ptp.info.n_ext_ts; i++) {
+ if (pf->ptp.extts_channels[i].ena) {
+ extts_cfg.gpio_pin = pf->ptp.extts_channels[i].gpio_pin;
+ extts_cfg.ena = false;
+ ice_ptp_cfg_extts(pf, i, &extts_cfg, false);
+ }
+ }
+
+ synchronize_irq(pf->oicr_irq.virq);
+}
+
+/**
+ * ice_ptp_enable_all_extts - Enable all EXTTS channels
+ * @pf: Board private structure
+ *
+ * Called during reset to restore user configuration.
+ */
+static void ice_ptp_enable_all_extts(struct ice_pf *pf)
+{
+ int i;
+
+ for (i = 0; i < pf->ptp.info.n_ext_ts; i++) {
+ if (pf->ptp.extts_channels[i].ena) {
+ ice_ptp_cfg_extts(pf, i, &pf->ptp.extts_channels[i],
+ false);
+ }
+ }
}
/**
@@ -1795,7 +1831,6 @@ ice_ptp_gpio_enable_e810(struct ptp_clock_info *info,
struct ptp_clock_request *rq, int on)
{
struct ice_pf *pf = ptp_info_to_pf(info);
- struct ice_perout_channel clk_cfg = {0};
bool sma_pres = false;
unsigned int chan;
u32 gpio_pin;
@@ -1806,6 +1841,9 @@ ice_ptp_gpio_enable_e810(struct ptp_clock_info *info,
switch (rq->type) {
case PTP_CLK_REQ_PEROUT:
+ {
+ struct ice_perout_channel clk_cfg = {};
+
chan = rq->perout.index;
if (sma_pres) {
if (chan == ice_pin_desc_e810t[SMA1].chan)
@@ -1833,7 +1871,11 @@ ice_ptp_gpio_enable_e810(struct ptp_clock_info *info,
err = ice_ptp_cfg_clkout(pf, chan, &clk_cfg, true);
break;
+ }
case PTP_CLK_REQ_EXTTS:
+ {
+ struct ice_extts_channel extts_cfg = {};
+
chan = rq->extts.index;
if (sma_pres) {
if (chan < ice_pin_desc_e810t[SMA2].chan)
@@ -1849,9 +1891,13 @@ ice_ptp_gpio_enable_e810(struct ptp_clock_info *info,
gpio_pin = chan;
}
- err = ice_ptp_cfg_extts(pf, !!on, chan, gpio_pin,
- rq->extts.flags);
- break;
+ extts_cfg.flags = rq->extts.flags;
+ extts_cfg.gpio_pin = gpio_pin;
+ extts_cfg.ena = !!on;
+
+ ice_ptp_cfg_extts(pf, chan, &extts_cfg, true);
+ return 0;
+ }
default:
return -EOPNOTSUPP;
}
@@ -1869,21 +1915,31 @@ static int ice_ptp_gpio_enable_e823(struct ptp_clock_info *info,
struct ptp_clock_request *rq, int on)
{
struct ice_pf *pf = ptp_info_to_pf(info);
- struct ice_perout_channel clk_cfg = {0};
int err;
switch (rq->type) {
case PTP_CLK_REQ_PPS:
+ {
+ struct ice_perout_channel clk_cfg = {};
+
clk_cfg.gpio_pin = PPS_PIN_INDEX;
clk_cfg.period = NSEC_PER_SEC;
clk_cfg.ena = !!on;
err = ice_ptp_cfg_clkout(pf, PPS_CLK_GEN_CHAN, &clk_cfg, true);
break;
+ }
case PTP_CLK_REQ_EXTTS:
- err = ice_ptp_cfg_extts(pf, !!on, rq->extts.index,
- TIME_SYNC_PIN_INDEX, rq->extts.flags);
- break;
+ {
+ struct ice_extts_channel extts_cfg = {};
+
+ extts_cfg.flags = rq->extts.flags;
+ extts_cfg.gpio_pin = TIME_SYNC_PIN_INDEX;
+ extts_cfg.ena = !!on;
+
+ ice_ptp_cfg_extts(pf, rq->extts.index, &extts_cfg, true);
+ return 0;
+ }
default:
return -EOPNOTSUPP;
}
@@ -2720,6 +2776,10 @@ static int ice_ptp_rebuild_owner(struct ice_pf *pf)
ice_ptp_restart_all_phy(pf);
}
+ /* Re-enable all periodic outputs and external timestamp events */
+ ice_ptp_enable_all_clkout(pf);
+ ice_ptp_enable_all_extts(pf);
+
return 0;
}
@@ -3275,6 +3335,8 @@ void ice_ptp_release(struct ice_pf *pf)
ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
+ ice_ptp_disable_all_extts(pf);
+
kthread_cancel_delayed_work_sync(&pf->ptp.work);
ice_ptp_port_phy_stop(&pf->ptp.port);
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
index 3af20025043a..f1171cdd93c8 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
@@ -33,6 +33,12 @@ struct ice_perout_channel {
u64 start_time;
};
+struct ice_extts_channel {
+ bool ena;
+ u32 gpio_pin;
+ u32 flags;
+};
+
/* The ice hardware captures Tx hardware timestamps in the PHY. The timestamp
* is stored in a buffer of registers. Depending on the specific hardware,
* this buffer might be shared across multiple PHY ports.
@@ -226,6 +232,7 @@ enum ice_ptp_state {
* @ext_ts_irq: the external timestamp IRQ in use
* @kworker: kwork thread for handling periodic work
* @perout_channels: periodic output data
+ * @extts_channels: channels for external timestamps
* @info: structure defining PTP hardware capabilities
* @clock: pointer to registered PTP clock device
* @tstamp_config: hardware timestamping configuration
@@ -249,6 +256,7 @@ struct ice_ptp {
u8 ext_ts_irq;
struct kthread_worker *kworker;
struct ice_perout_channel perout_channels[GLTSYN_TGT_H_IDX_MAX];
+ struct ice_extts_channel extts_channels[GLTSYN_TGT_H_IDX_MAX];
struct ptp_clock_info info;
struct ptp_clock *clock;
struct hwtstamp_config tstamp_config;
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH net 1/4] ice: Fix improper extts handling
2024-06-25 17:02 ` [PATCH net 1/4] ice: Fix improper extts handling Tony Nguyen
@ 2024-06-26 13:36 ` Maciej Fijalkowski
2024-06-27 23:16 ` Jakub Kicinski
2024-06-27 23:15 ` Jakub Kicinski
1 sibling, 1 reply; 12+ messages in thread
From: Maciej Fijalkowski @ 2024-06-26 13:36 UTC (permalink / raw)
To: Tony Nguyen
Cc: davem, kuba, pabeni, edumazet, netdev, Milena Olech,
richardcochran, Przemek Kitszel, Jacob Keller, Karol Kolacinski,
Simon Horman, Pucha Himasekhar Reddy
On Tue, Jun 25, 2024 at 10:02:44AM -0700, Tony Nguyen wrote:
> From: Milena Olech <milena.olech@intel.com>
>
> Extts events are disabled and enabled by the application ts2phc.
> However, in case where the driver is removed when the application is
> running, channel remains enabled. As a result, in the next run of the
> app, two channels are enabled and the information "extts on unexpected
> channel" is printed to the user.
>
> To avoid that, extts events shall be disabled when PTP is released.
>
> Fixes: 172db5f91d5f ("ice: add support for auxiliary input/output pins")
> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> Co-developed-by: Jacob Keller <jacob.e.keller@intel.com>
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> Signed-off-by: Milena Olech <milena.olech@intel.com>
> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
> Reviewed-by: Simon Horman <horms@kernel.org>
> Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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 | 106 ++++++++++++++++++-----
> drivers/net/ethernet/intel/ice/ice_ptp.h | 8 ++
> 2 files changed, 92 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index 0f17fc1181d2..d8ff9f26010c 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -1584,27 +1584,24 @@ void ice_ptp_extts_event(struct ice_pf *pf)
[...]
> +/**
> + * ice_ptp_disable_all_extts - Disable all EXTTS channels
> + * @pf: Board private structure
> + */
> +static void ice_ptp_disable_all_extts(struct ice_pf *pf)
> +{
> + struct ice_extts_channel extts_cfg = {};
> + int i;
> +
> + for (i = 0; i < pf->ptp.info.n_ext_ts; i++) {
> + if (pf->ptp.extts_channels[i].ena) {
> + extts_cfg.gpio_pin = pf->ptp.extts_channels[i].gpio_pin;
> + extts_cfg.ena = false;
> + ice_ptp_cfg_extts(pf, i, &extts_cfg, false);
> + }
> + }
> +
> + synchronize_irq(pf->oicr_irq.virq);
> +}
> +
> +/**
> + * ice_ptp_enable_all_extts - Enable all EXTTS channels
> + * @pf: Board private structure
> + *
> + * Called during reset to restore user configuration.
> + */
> +static void ice_ptp_enable_all_extts(struct ice_pf *pf)
> +{
> + int i;
> +
> + for (i = 0; i < pf->ptp.info.n_ext_ts; i++) {
> + if (pf->ptp.extts_channels[i].ena) {
> + ice_ptp_cfg_extts(pf, i, &pf->ptp.extts_channels[i],
> + false);
> + }
> + }
nit: you don't need braces for single line statements.
maybe you could rewrite it as below but i'm not sure if it's more
readable. up to you.
int i, cnt = pf->ptp.info.n_ext_ts;
for (i = 0; i < cnt && pf->ptp.extts_channels[i].ena; i++)
ice_ptp_cfg_extts(pf, i, &pf->ptp.extts_channels[i], false);
> }
>
[...]
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH net 1/4] ice: Fix improper extts handling
2024-06-26 13:36 ` Maciej Fijalkowski
@ 2024-06-27 23:16 ` Jakub Kicinski
0 siblings, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2024-06-27 23:16 UTC (permalink / raw)
To: Maciej Fijalkowski
Cc: Tony Nguyen, davem, pabeni, edumazet, netdev, Milena Olech,
richardcochran, Przemek Kitszel, Jacob Keller, Karol Kolacinski,
Simon Horman, Pucha Himasekhar Reddy
On Wed, 26 Jun 2024 15:36:00 +0200 Maciej Fijalkowski wrote:
> > +
> > + for (i = 0; i < pf->ptp.info.n_ext_ts; i++) {
> > + if (pf->ptp.extts_channels[i].ena) {
> > + ice_ptp_cfg_extts(pf, i, &pf->ptp.extts_channels[i],
> > + false);
> > + }
> > + }
>
> nit: you don't need braces for single line statements.
>
> maybe you could rewrite it as below but i'm not sure if it's more
> readable. up to you.
>
> int i, cnt = pf->ptp.info.n_ext_ts;
>
> for (i = 0; i < cnt && pf->ptp.extts_channels[i].ena; i++)
> ice_ptp_cfg_extts(pf, i, &pf->ptp.extts_channels[i], false);
not sure this is functionally equivalent, but agreed on the point about
the braces.
Also, FWIW, the commit message doesn't read super well..
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH net 1/4] ice: Fix improper extts handling
2024-06-25 17:02 ` [PATCH net 1/4] ice: Fix improper extts handling Tony Nguyen
2024-06-26 13:36 ` Maciej Fijalkowski
@ 2024-06-27 23:15 ` Jakub Kicinski
1 sibling, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2024-06-27 23:15 UTC (permalink / raw)
To: Tony Nguyen
Cc: davem, pabeni, edumazet, netdev, Milena Olech, richardcochran,
Przemek Kitszel, Jacob Keller, Karol Kolacinski, Simon Horman,
Pucha Himasekhar Reddy
On Tue, 25 Jun 2024 10:02:44 -0700 Tony Nguyen wrote:
> /* set event level to requested edge */
> - if (extts_flags & PTP_FALLING_EDGE)
> + if (config->flags & PTP_FALLING_EDGE)
> aux_reg |= GLTSYN_AUX_IN_0_EVNTLVL_FALLING_EDGE;
> - if (extts_flags & PTP_RISING_EDGE)
> + if (config->flags & PTP_RISING_EDGE)
nit: double space here
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH net 2/4] ice: Don't process extts if PTP is disabled
2024-06-25 17:02 [PATCH net 0/4][pull request] Intel Wired LAN Driver Updates 2024-06-25 (ice) Tony Nguyen
2024-06-25 17:02 ` [PATCH net 1/4] ice: Fix improper extts handling Tony Nguyen
@ 2024-06-25 17:02 ` Tony Nguyen
2024-06-25 17:57 ` Nelson, Shannon
2024-06-25 17:02 ` [PATCH net 3/4] ice: Reject pin requests with unsupported flags Tony Nguyen
2024-06-25 17:02 ` [PATCH net 4/4] ice: use proper macro for testing bit Tony Nguyen
3 siblings, 1 reply; 12+ messages in thread
From: Tony Nguyen @ 2024-06-25 17:02 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, netdev
Cc: Jacob Keller, anthony.l.nguyen, richardcochran, Przemek Kitszel,
Karol Kolacinski, Simon Horman, Pucha Himasekhar Reddy
From: Jacob Keller <jacob.e.keller@intel.com>
The ice_ptp_extts_event() function can race with ice_ptp_release() and
result in a NULL pointer dereference which leads to a kernel panic.
Panic occurs because the ice_ptp_extts_event() function calls
ptp_clock_event() with a NULL pointer. The ice driver has already
released the PTP clock by the time the interrupt for the next external
timestamp event occurs.
To fix this, modify the ice_ptp_extts_event() function to check the
PTP state and bail early if PTP is not ready.
Fixes: 172db5f91d5f ("ice: add support for auxiliary input/output pins")
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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 | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index d8ff9f26010c..0500ced1adf8 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -1559,6 +1559,10 @@ void ice_ptp_extts_event(struct ice_pf *pf)
u8 chan, tmr_idx;
u32 hi, lo;
+ /* Don't process timestamp events if PTP is not ready */
+ if (pf->ptp.state != ICE_PTP_READY)
+ return;
+
tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;
/* Event time is captured by one of the two matched registers
* GLTSYN_EVNT_L: 32 LSB of sampled time event
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH net 2/4] ice: Don't process extts if PTP is disabled
2024-06-25 17:02 ` [PATCH net 2/4] ice: Don't process extts if PTP is disabled Tony Nguyen
@ 2024-06-25 17:57 ` Nelson, Shannon
2024-06-27 10:42 ` Kolacinski, Karol
2024-07-08 21:24 ` Keller, Jacob E
0 siblings, 2 replies; 12+ messages in thread
From: Nelson, Shannon @ 2024-06-25 17:57 UTC (permalink / raw)
To: Tony Nguyen, davem, kuba, pabeni, edumazet, netdev
Cc: Jacob Keller, richardcochran, Przemek Kitszel, Karol Kolacinski,
Simon Horman, Pucha Himasekhar Reddy
On 6/25/2024 10:02 AM, Tony Nguyen wrote:
> From: Jacob Keller <jacob.e.keller@intel.com>
>
> The ice_ptp_extts_event() function can race with ice_ptp_release() and
> result in a NULL pointer dereference which leads to a kernel panic.
>
> Panic occurs because the ice_ptp_extts_event() function calls
> ptp_clock_event() with a NULL pointer. The ice driver has already
> released the PTP clock by the time the interrupt for the next external
> timestamp event occurs.
>
> To fix this, modify the ice_ptp_extts_event() function to check the
> PTP state and bail early if PTP is not ready.
>
> Fixes: 172db5f91d5f ("ice: add support for auxiliary input/output pins")
> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
> Reviewed-by: Simon Horman <horms@kernel.org>
> Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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 | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index d8ff9f26010c..0500ced1adf8 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -1559,6 +1559,10 @@ void ice_ptp_extts_event(struct ice_pf *pf)
> u8 chan, tmr_idx;
> u32 hi, lo;
>
> + /* Don't process timestamp events if PTP is not ready */
> + if (pf->ptp.state != ICE_PTP_READY)
> + return;
> +
If this is a potential race problem, is there some sort of locking that
assures this stays true while running through your for-loop below here?
sln
> tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;
> /* Event time is captured by one of the two matched registers
> * GLTSYN_EVNT_L: 32 LSB of sampled time event
> --
> 2.41.0
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH net 2/4] ice: Don't process extts if PTP is disabled
2024-06-25 17:57 ` Nelson, Shannon
@ 2024-06-27 10:42 ` Kolacinski, Karol
2024-07-08 21:25 ` Keller, Jacob E
2024-07-08 21:24 ` Keller, Jacob E
1 sibling, 1 reply; 12+ messages in thread
From: Kolacinski, Karol @ 2024-06-27 10:42 UTC (permalink / raw)
To: Nelson, Shannon, Nguyen, Anthony L, davem@davemloft.net,
kuba@kernel.org, pabeni@redhat.com, edumazet@google.com,
netdev@vger.kernel.org
Cc: Keller, Jacob E, richardcochran@gmail.com, Kitszel, Przemyslaw,
Simon Horman, Pucha, HimasekharX Reddy
On 6/25/2024 7:57 PM, Nelson Shannon wrote:
> > From: Jacob Keller <jacob.e.keller@intel.com>
> >
> > The ice_ptp_extts_event() function can race with ice_ptp_release() and
> > result in a NULL pointer dereference which leads to a kernel panic.
> >
> > Panic occurs because the ice_ptp_extts_event() function calls
> > ptp_clock_event() with a NULL pointer. The ice driver has already
> > released the PTP clock by the time the interrupt for the next external
> > timestamp event occurs.
> >
> > To fix this, modify the ice_ptp_extts_event() function to check the
> > PTP state and bail early if PTP is not ready.
> >
> > Fixes: 172db5f91d5f ("ice: add support for auxiliary input/output pins")
> > Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> > Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> > Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
> > Reviewed-by: Simon Horman <horms@kernel.org>
> > Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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 | 4 ++++
> > 1 file changed, 4 insertions(+)
> >
> > diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> > index d8ff9f26010c..0500ced1adf8 100644
> > --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> > +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> > @@ -1559,6 +1559,10 @@ void ice_ptp_extts_event(struct ice_pf *pf)
> > u8 chan, tmr_idx;
> > u32 hi, lo;
> >
> > + /* Don't process timestamp events if PTP is not ready */
> > + if (pf->ptp.state != ICE_PTP_READY)
> > + return;
> > +
>
> If this is a potential race problem, is there some sort of locking that
> assures this stays true while running through your for-loop below here?
>
> sln
Currently, we have no locking around PTP state.
The code above happens only in the top half of the interrupt and race
can happen when ice_ptp_release() is called and the driver starts to
release PTP structures, but hasn't stopped EXTTS yet.
Thanks,
Karol
^ permalink raw reply [flat|nested] 12+ messages in thread* RE: [PATCH net 2/4] ice: Don't process extts if PTP is disabled
2024-06-27 10:42 ` Kolacinski, Karol
@ 2024-07-08 21:25 ` Keller, Jacob E
0 siblings, 0 replies; 12+ messages in thread
From: Keller, Jacob E @ 2024-07-08 21:25 UTC (permalink / raw)
To: Kolacinski, Karol, Nelson, Shannon, Nguyen, Anthony L,
davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com,
edumazet@google.com, netdev@vger.kernel.org
Cc: richardcochran@gmail.com, Kitszel, Przemyslaw, Simon Horman,
Pucha, HimasekharX Reddy
> -----Original Message-----
> From: Kolacinski, Karol <karol.kolacinski@intel.com>
> Sent: Thursday, June 27, 2024 3:43 AM
> To: Nelson, Shannon <shannon.nelson@amd.com>; Nguyen, Anthony L
> <anthony.l.nguyen@intel.com>; davem@davemloft.net; kuba@kernel.org;
> pabeni@redhat.com; edumazet@google.com; netdev@vger.kernel.org
> Cc: Keller, Jacob E <jacob.e.keller@intel.com>; richardcochran@gmail.com; Kitszel,
> Przemyslaw <przemyslaw.kitszel@intel.com>; Simon Horman
> <horms@kernel.org>; Pucha, HimasekharX Reddy
> <himasekharx.reddy.pucha@intel.com>
> Subject: Re: [PATCH net 2/4] ice: Don't process extts if PTP is disabled
>
> On 6/25/2024 7:57 PM, Nelson Shannon wrote:
> > > From: Jacob Keller <jacob.e.keller@intel.com>
> > >
> > > The ice_ptp_extts_event() function can race with ice_ptp_release() and
> > > result in a NULL pointer dereference which leads to a kernel panic.
> > >
> > > Panic occurs because the ice_ptp_extts_event() function calls
> > > ptp_clock_event() with a NULL pointer. The ice driver has already
> > > released the PTP clock by the time the interrupt for the next external
> > > timestamp event occurs.
> > >
> > > To fix this, modify the ice_ptp_extts_event() function to check the
> > > PTP state and bail early if PTP is not ready.
> > >
> > > Fixes: 172db5f91d5f ("ice: add support for auxiliary input/output pins")
> > > Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> > > Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> > > Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
> > > Reviewed-by: Simon Horman <horms@kernel.org>
> > > Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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 | 4 ++++
> > > 1 file changed, 4 insertions(+)
> > >
> > > diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c
> b/drivers/net/ethernet/intel/ice/ice_ptp.c
> > > index d8ff9f26010c..0500ced1adf8 100644
> > > --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> > > +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> > > @@ -1559,6 +1559,10 @@ void ice_ptp_extts_event(struct ice_pf *pf)
> > > u8 chan, tmr_idx;
> > > u32 hi, lo;
> > >
> > > + /* Don't process timestamp events if PTP is not ready */
> > > + if (pf->ptp.state != ICE_PTP_READY)
> > > + return;
> > > +
> >
> > If this is a potential race problem, is there some sort of locking that
> > assures this stays true while running through your for-loop below here?
> >
> > sln
>
> Currently, we have no locking around PTP state.
> The code above happens only in the top half of the interrupt and race
> can happen when ice_ptp_release() is called and the driver starts to
> release PTP structures, but hasn't stopped EXTTS yet.
>
> Thanks,
> Karol
My understanding is this is serialized via synchronize_irq on the miscellaneous IRQ vector.
Thanks,
Jake
^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCH net 2/4] ice: Don't process extts if PTP is disabled
2024-06-25 17:57 ` Nelson, Shannon
2024-06-27 10:42 ` Kolacinski, Karol
@ 2024-07-08 21:24 ` Keller, Jacob E
1 sibling, 0 replies; 12+ messages in thread
From: Keller, Jacob E @ 2024-07-08 21:24 UTC (permalink / raw)
To: Nelson, Shannon, Nguyen, Anthony L, davem@davemloft.net,
kuba@kernel.org, pabeni@redhat.com, edumazet@google.com,
netdev@vger.kernel.org
Cc: richardcochran@gmail.com, Kitszel, Przemyslaw, Kolacinski, Karol,
Simon Horman, Pucha, HimasekharX Reddy
> -----Original Message-----
> From: Nelson, Shannon <shannon.nelson@amd.com>
> Sent: Tuesday, June 25, 2024 10:58 AM
> To: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; davem@davemloft.net;
> kuba@kernel.org; pabeni@redhat.com; edumazet@google.com;
> netdev@vger.kernel.org
> Cc: Keller, Jacob E <jacob.e.keller@intel.com>; richardcochran@gmail.com; Kitszel,
> Przemyslaw <przemyslaw.kitszel@intel.com>; Kolacinski, Karol
> <karol.kolacinski@intel.com>; Simon Horman <horms@kernel.org>; Pucha,
> HimasekharX Reddy <himasekharx.reddy.pucha@intel.com>
> Subject: Re: [PATCH net 2/4] ice: Don't process extts if PTP is disabled
>
> On 6/25/2024 10:02 AM, Tony Nguyen wrote:
> > From: Jacob Keller <jacob.e.keller@intel.com>
> >
> > The ice_ptp_extts_event() function can race with ice_ptp_release() and
> > result in a NULL pointer dereference which leads to a kernel panic.
> >
> > Panic occurs because the ice_ptp_extts_event() function calls
> > ptp_clock_event() with a NULL pointer. The ice driver has already
> > released the PTP clock by the time the interrupt for the next external
> > timestamp event occurs.
> >
> > To fix this, modify the ice_ptp_extts_event() function to check the
> > PTP state and bail early if PTP is not ready.
> >
> > Fixes: 172db5f91d5f ("ice: add support for auxiliary input/output pins")
> > Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> > Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> > Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
> > Reviewed-by: Simon Horman <horms@kernel.org>
> > Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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 | 4 ++++
> > 1 file changed, 4 insertions(+)
> >
> > diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c
> b/drivers/net/ethernet/intel/ice/ice_ptp.c
> > index d8ff9f26010c..0500ced1adf8 100644
> > --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> > +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> > @@ -1559,6 +1559,10 @@ void ice_ptp_extts_event(struct ice_pf *pf)
> > u8 chan, tmr_idx;
> > u32 hi, lo;
> >
> > + /* Don't process timestamp events if PTP is not ready */
> > + if (pf->ptp.state != ICE_PTP_READY)
> > + return;
> > +
>
> If this is a potential race problem, is there some sort of locking that
> assures this stays true while running through your for-loop below here?
>
> sln
>
This function is called by the IRQ when it gets an extts event. During shutdown, we set the state to say its shutdown and then call synchronize_irq on the miscellaneous vector which will wait until the misc IRQ handler completes. From that point the state will always be not ready and the function will have completed execution.
> > tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;
> > /* Event time is captured by one of the two matched registers
> > * GLTSYN_EVNT_L: 32 LSB of sampled time event
> > --
> > 2.41.0
> >
> >
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH net 3/4] ice: Reject pin requests with unsupported flags
2024-06-25 17:02 [PATCH net 0/4][pull request] Intel Wired LAN Driver Updates 2024-06-25 (ice) Tony Nguyen
2024-06-25 17:02 ` [PATCH net 1/4] ice: Fix improper extts handling Tony Nguyen
2024-06-25 17:02 ` [PATCH net 2/4] ice: Don't process extts if PTP is disabled Tony Nguyen
@ 2024-06-25 17:02 ` Tony Nguyen
2024-06-25 17:02 ` [PATCH net 4/4] ice: use proper macro for testing bit Tony Nguyen
3 siblings, 0 replies; 12+ messages in thread
From: Tony Nguyen @ 2024-06-25 17:02 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, netdev
Cc: Jacob Keller, anthony.l.nguyen, richardcochran, Przemek Kitszel,
Karol Kolacinski, Simon Horman, Pucha Himasekhar Reddy
From: Jacob Keller <jacob.e.keller@intel.com>
The driver receives requests for configuring pins via the .enable
callback of the PTP clock object. These requests come into the driver
with flags which modify the requested behavior from userspace. Current
implementation in ice does not reject flags that it doesn't support.
This causes the driver to incorrectly apply requests with such flags as
PTP_PEROUT_DUTY_CYCLE, or any future flags added by the kernel which it
is not yet aware of.
Fix this by properly validating flags in both ice_ptp_cfg_perout and
ice_ptp_cfg_extts. Ensure that we check by bit-wise negating supported
flags rather than just checking and rejecting known un-supported flags.
This is preferable, as it ensures better compatibility with future
kernels.
Fixes: 172db5f91d5f ("ice: add support for auxiliary input/output pins")
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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 | 38 ++++++++++++++----------
drivers/net/ethernet/intel/ice/ice_ptp.h | 1 +
2 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index 0500ced1adf8..163b312c7cbc 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -1593,14 +1593,23 @@ void ice_ptp_extts_event(struct ice_pf *pf)
* @store: If set to true, the values will be stored
*
* Configure an external timestamp event on the requested channel.
+ *
+ * Return: 0 on success, -EOPNOTUSPP on unsupported flags
*/
-static void ice_ptp_cfg_extts(struct ice_pf *pf, unsigned int chan,
- struct ice_extts_channel *config, bool store)
+static int ice_ptp_cfg_extts(struct ice_pf *pf, unsigned int chan,
+ struct ice_extts_channel *config, bool store)
{
u32 func, aux_reg, gpio_reg, irq_reg;
struct ice_hw *hw = &pf->hw;
u8 tmr_idx;
+ /* Reject requests with unsupported flags */
+ if (config->flags & ~(PTP_ENABLE_FEATURE |
+ PTP_RISING_EDGE |
+ PTP_FALLING_EDGE |
+ PTP_STRICT_FLAGS))
+ return -EOPNOTSUPP;
+
tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;
irq_reg = rd32(hw, PFINT_OICR_ENA);
@@ -1641,6 +1650,8 @@ static void ice_ptp_cfg_extts(struct ice_pf *pf, unsigned int chan,
if (store)
memcpy(&pf->ptp.extts_channels[chan], config, sizeof(*config));
+
+ return 0;
}
/**
@@ -1699,6 +1710,9 @@ static int ice_ptp_cfg_clkout(struct ice_pf *pf, unsigned int chan,
u32 func, val, gpio_pin;
u8 tmr_idx;
+ if (config && config->flags & ~PTP_PEROUT_PHASE)
+ return -EOPNOTSUPP;
+
tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;
/* 0. Reset mode & out_en in AUX_OUT */
@@ -1838,7 +1852,6 @@ ice_ptp_gpio_enable_e810(struct ptp_clock_info *info,
bool sma_pres = false;
unsigned int chan;
u32 gpio_pin;
- int err;
if (ice_is_feature_supported(pf, ICE_F_SMA_CTRL))
sma_pres = true;
@@ -1867,14 +1880,14 @@ ice_ptp_gpio_enable_e810(struct ptp_clock_info *info,
clk_cfg.gpio_pin = chan;
}
+ clk_cfg.flags = rq->perout.flags;
clk_cfg.period = ((rq->perout.period.sec * NSEC_PER_SEC) +
rq->perout.period.nsec);
clk_cfg.start_time = ((rq->perout.start.sec * NSEC_PER_SEC) +
rq->perout.start.nsec);
clk_cfg.ena = !!on;
- err = ice_ptp_cfg_clkout(pf, chan, &clk_cfg, true);
- break;
+ return ice_ptp_cfg_clkout(pf, chan, &clk_cfg, true);
}
case PTP_CLK_REQ_EXTTS:
{
@@ -1899,14 +1912,11 @@ ice_ptp_gpio_enable_e810(struct ptp_clock_info *info,
extts_cfg.gpio_pin = gpio_pin;
extts_cfg.ena = !!on;
- ice_ptp_cfg_extts(pf, chan, &extts_cfg, true);
- return 0;
+ return ice_ptp_cfg_extts(pf, chan, &extts_cfg, true);
}
default:
return -EOPNOTSUPP;
}
-
- return err;
}
/**
@@ -1919,19 +1929,18 @@ static int ice_ptp_gpio_enable_e823(struct ptp_clock_info *info,
struct ptp_clock_request *rq, int on)
{
struct ice_pf *pf = ptp_info_to_pf(info);
- int err;
switch (rq->type) {
case PTP_CLK_REQ_PPS:
{
struct ice_perout_channel clk_cfg = {};
+ clk_cfg.flags = rq->perout.flags;
clk_cfg.gpio_pin = PPS_PIN_INDEX;
clk_cfg.period = NSEC_PER_SEC;
clk_cfg.ena = !!on;
- err = ice_ptp_cfg_clkout(pf, PPS_CLK_GEN_CHAN, &clk_cfg, true);
- break;
+ return ice_ptp_cfg_clkout(pf, PPS_CLK_GEN_CHAN, &clk_cfg, true);
}
case PTP_CLK_REQ_EXTTS:
{
@@ -1941,14 +1950,11 @@ static int ice_ptp_gpio_enable_e823(struct ptp_clock_info *info,
extts_cfg.gpio_pin = TIME_SYNC_PIN_INDEX;
extts_cfg.ena = !!on;
- ice_ptp_cfg_extts(pf, rq->extts.index, &extts_cfg, true);
- return 0;
+ return ice_ptp_cfg_extts(pf, rq->extts.index, &extts_cfg, true);
}
default:
return -EOPNOTSUPP;
}
-
- return err;
}
/**
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
index f1171cdd93c8..e2af9749061c 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
@@ -29,6 +29,7 @@ enum ice_ptp_pin_e810t {
struct ice_perout_channel {
bool ena;
u32 gpio_pin;
+ u32 flags;
u64 period;
u64 start_time;
};
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH net 4/4] ice: use proper macro for testing bit
2024-06-25 17:02 [PATCH net 0/4][pull request] Intel Wired LAN Driver Updates 2024-06-25 (ice) Tony Nguyen
` (2 preceding siblings ...)
2024-06-25 17:02 ` [PATCH net 3/4] ice: Reject pin requests with unsupported flags Tony Nguyen
@ 2024-06-25 17:02 ` Tony Nguyen
3 siblings, 0 replies; 12+ messages in thread
From: Tony Nguyen @ 2024-06-25 17:02 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, netdev
Cc: Petr Oros, anthony.l.nguyen, Ivan Vecera, Alexander Lobakin,
Jiri Pirko, Pucha Himasekhar Reddy
From: Petr Oros <poros@redhat.com>
Do not use _test_bit() macro for testing bit. The proper macro for this
is one without underline.
_test_bit() is what test_bit() was prior to const-optimization. It
directly calls arch_test_bit(), i.e. the arch-specific implementation
(or the generic one). It's strictly _internal_ and shouldn't be used
anywhere outside the actual test_bit() macro.
test_bit() is a wrapper which checks whether the bitmap and the bit
number are compile-time constants and if so, it calls the optimized
function which evaluates this call to a compile-time constant as well.
If either of them is not a compile-time constant, it just calls _test_bit().
test_bit() is the actual function to use anywhere in the kernel.
IOW, calling _test_bit() avoids potential compile-time optimizations.
The sensors is not a compile-time constant, thus most probably there
are no object code changes before and after the patch.
But anyway, we shouldn't call internal wrappers instead of
the actual API.
Fixes: 4da71a77fc3b ("ice: read internal temperature sensor")
Acked-by: Ivan Vecera <ivecera@redhat.com>
Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Signed-off-by: Petr Oros <poros@redhat.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/ice/ice_hwmon.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_hwmon.c b/drivers/net/ethernet/intel/ice/ice_hwmon.c
index e4c2c1bff6c0..b7aa6812510a 100644
--- a/drivers/net/ethernet/intel/ice/ice_hwmon.c
+++ b/drivers/net/ethernet/intel/ice/ice_hwmon.c
@@ -96,7 +96,7 @@ static bool ice_is_internal_reading_supported(struct ice_pf *pf)
unsigned long sensors = pf->hw.dev_caps.supported_sensors;
- return _test_bit(ICE_SENSOR_SUPPORT_E810_INT_TEMP_BIT, &sensors);
+ return test_bit(ICE_SENSOR_SUPPORT_E810_INT_TEMP_BIT, &sensors);
};
void ice_hwmon_init(struct ice_pf *pf)
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread