All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ahmed S. Darwish" <darwish.07@gmail.com>
To: Andri Yngvason <andri.yngvason@marel.com>
Cc: Marc Kleine-Budde <mkl@pengutronix.de>,
	Linux-CAN <linux-can@vger.kernel.org>
Subject: Re: [PATCH v4 2/4] can: kvaser_usb: Update error counters before exiting on OOM
Date: Sun, 18 Jan 2015 15:33:47 -0500	[thread overview]
Message-ID: <20150118203347.GB15143@linux> (raw)
In-Reply-To: <20150116155040.20513.13990@shannon>

On Fri, Jan 16, 2015 at 03:50:40PM +0000, Andri Yngvason wrote:
> See comments below.
> 
> Quoting Ahmed S. Darwish (2015-01-12 20:36:50)
> ...
> > 
> > [ Patch is build-tested, but not _fully_ run-time tested.
> > 
> >   It's based on linux-can/testing commit d642b49f6d84b94bd
> >   "can: kvaser_usb: Don't dereference skb after a netif_rx" ]
> > 
> > Subject: [PATCH] can: kvaser_usb: Update net interface state
> >  before exiting on OOM
> > 
> > From: Ahmed S. Darwish <ahmed.darwish@valeo.com>
> > 
> > Let the network interface can bus state and error counters be
> > more accurate in case of Out of Memory conditions.
> > 
> > Suggested-by: Marc Kleine-Budde <mkl@pengutronix.de>
> > Signed-off-by: Ahmed S. Darwish <ahmed.darwish@valeo.com>
> > ---
> >  drivers/net/can/usb/kvaser_usb.c | 182 +++++++++++++++++++++++----------------
> >  1 file changed, 106 insertions(+), 76 deletions(-)
> > 
> > diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c
> > index c32cd61..2d0ef76 100644
> > --- a/drivers/net/can/usb/kvaser_usb.c
> > +++ b/drivers/net/can/usb/kvaser_usb.c
> > @@ -273,6 +273,10 @@ struct kvaser_msg {
> >         } u;
> >  } __packed;
> >  
> > +struct kvaser_usb_error_summary {
> > +       u8 channel, status, txerr, rxerr, error_factor;
> > +};
> > +
> >  struct kvaser_usb_tx_urb_context {
> >         struct kvaser_usb_net_priv *priv;
> >         u32 echo_index;
> > @@ -615,6 +619,57 @@ static void kvaser_usb_unlink_tx_urbs(struct kvaser_usb_net_priv *priv)
> >                 priv->tx_contexts[i].echo_index = MAX_TX_URBS;
> >  }
> >  
> 
> This function is doing some things that are now be handled by
> can_change_state(). You can make your state handling code a lot shorter by
> using it.
> 
> > +static void kvaser_usb_rx_error_update_state(struct kvaser_usb_net_priv *priv,
> > +                                            const struct kvaser_usb_error_summary *es)
> > +{
> > +       struct net_device_stats *stats;
> > +       unsigned int new_state;
> > +
> > +       stats = &priv->netdev->stats;
> > +       new_state = priv->can.state;
> > +
> > +       netdev_dbg(priv->netdev, "Error status: 0x%02x\n", es->status);
> > +
> > +       if (es->status & M16C_STATE_BUS_OFF) {
> can_change_state() updates the state stats.
> > +               priv->can.can_stats.bus_off++;
> > +               new_state = CAN_STATE_BUS_OFF;
> > +       } else if (es->status & M16C_STATE_BUS_PASSIVE) {
> > +               if (priv->can.state != CAN_STATE_ERROR_PASSIVE) {
> See last comment.
> > +                       priv->can.can_stats.error_passive++;
> > +               }
> > +               new_state = CAN_STATE_ERROR_PASSIVE;
> > +       }
> > +
> > +       if (es->status == M16C_STATE_BUS_ERROR) {
> > +               if ((priv->can.state < CAN_STATE_ERROR_WARNING) &&
> > +                   ((es->txerr >= 96) || (es->rxerr >= 96))) {
> Same as above.
> > +                       priv->can.can_stats.error_warning++;
> > +                       new_state = CAN_STATE_ERROR_WARNING;
> > +               } else if (priv->can.state > CAN_STATE_ERROR_ACTIVE) {
> > +                       new_state = CAN_STATE_ERROR_ACTIVE;
> > +               }
> > +       }
> > +
> > +       if (!es->status) {
> > +               new_state = CAN_STATE_ERROR_ACTIVE;
> > +       }
> > +
> > +       if (priv->can.restart_ms &&
> > +           (priv->can.state >= CAN_STATE_BUS_OFF) &&
> > +           (new_state < CAN_STATE_BUS_OFF)) {
> This is NOT in can_change_state(). Keep it.
> > +               priv->can.can_stats.restarts++;
> > +       }
> > +
> > +       if (es->error_factor) {
> > +               priv->can.can_stats.bus_error++;
> > +               stats->rx_errors++;
> > +       }
> > +
> > +       priv->bec.txerr = es->txerr;
> > +       priv->bec.rxerr = es->rxerr;
> can_change_state() does this too.
> > +       priv->can.state = new_state;
> > +}
> > +
> >  static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
> >                                 const struct kvaser_msg *msg)
> ...
> > -       if (status & M16C_STATE_BUS_RESET) {
> > +       if (es.status & M16C_STATE_BUS_RESET) {
> >                 kvaser_usb_unlink_tx_urbs(priv);
> >                 return;
> >         }
> >  
> OK, maybe we need to move "priv->can.state = new_state" out of
> can_change_state(). See explanation below.
> > +       old_state = priv->can.state;
> > +       kvaser_usb_rx_error_update_state(priv, &es);
> > +       new_state = priv->can.state;
> > +
> >         skb = alloc_can_err_skb(priv->netdev, &cf);
> >         if (!skb) {
> >                 stats->rx_dropped++;
> >                 return;
> >         }
> >  
> You should be able to replace this:
> > -       new_state = priv->can.state;
> > -
> > -       netdev_dbg(priv->netdev, "Error status: 0x%02x\n", status);
> > -
> > -       if (status & M16C_STATE_BUS_OFF) {
> > -               cf->can_id |= CAN_ERR_BUSOFF;
> > -
> > -               priv->can.can_stats.bus_off++;
> > +       if (es.status & M16C_STATE_BUS_OFF) {
> >                 if (!priv->can.restart_ms)
> >                         kvaser_usb_simple_msg_async(priv, CMD_STOP_CHIP);
> > -
> >                 netif_carrier_off(priv->netdev);
> >  
> > -               new_state = CAN_STATE_BUS_OFF;
> > -       } else if (status & M16C_STATE_BUS_PASSIVE) {
> > -               if (priv->can.state != CAN_STATE_ERROR_PASSIVE) {
> > +               cf->can_id |= CAN_ERR_BUSOFF;
> > +       } else if (es.status & M16C_STATE_BUS_PASSIVE) {
> > +               if (old_state != CAN_STATE_ERROR_PASSIVE) {
> >                         cf->can_id |= CAN_ERR_CRTL;
> >  
> > -                       if (txerr || rxerr)
> > -                               cf->data[1] = (txerr > rxerr)
> > +                       if (es.txerr || es.rxerr)
> > +                               cf->data[1] = (es.txerr > es.rxerr)
> >                                                 ? CAN_ERR_CRTL_TX_PASSIVE
> >                                                 : CAN_ERR_CRTL_RX_PASSIVE;
> >                         else
> >                                 cf->data[1] = CAN_ERR_CRTL_TX_PASSIVE |
> >                                               CAN_ERR_CRTL_RX_PASSIVE;
> > -
> > -                       priv->can.can_stats.error_passive++;
> >                 }
> > -
> > -               new_state = CAN_STATE_ERROR_PASSIVE;
> >         }
> >  
> > -       if (status == M16C_STATE_BUS_ERROR) {
> > -               if ((priv->can.state < CAN_STATE_ERROR_WARNING) &&
> > -                   ((txerr >= 96) || (rxerr >= 96))) {
> > +       if (es.status == M16C_STATE_BUS_ERROR) {
> > +               if ((old_state < CAN_STATE_ERROR_WARNING) &&
> > +                   ((es.txerr >= 96) || (es.rxerr >= 96))) {
> >                         cf->can_id |= CAN_ERR_CRTL;
> > -                       cf->data[1] = (txerr > rxerr)
> > +                       cf->data[1] = (es.txerr > es.rxerr)
> >                                         ? CAN_ERR_CRTL_TX_WARNING
> >                                         : CAN_ERR_CRTL_RX_WARNING;
> > -
> > -                       priv->can.can_stats.error_warning++;
> > -                       new_state = CAN_STATE_ERROR_WARNING;
> > -               } else if (priv->can.state > CAN_STATE_ERROR_ACTIVE) {
> > +               } else if (old_state > CAN_STATE_ERROR_ACTIVE) {
> >                         cf->can_id |= CAN_ERR_PROT;
> >                         cf->data[2] = CAN_ERR_PROT_ACTIVE;
> > -
> > -                       new_state = CAN_STATE_ERROR_ACTIVE;
> >                 }
> With something like:
> 	if(new_state != old_state)
> 	{
> 		tx_state = get_tx_state(...);
> 		rx_state = get_rx_state(...);
> 		can_change_state(priv, cf, tx_state, rx_state);
> 		if(new_state == CAN_STATE_BUS_OFF)
> 			bus_off(...);
> 	}
> >         }
> >  
> > -       if (!status) {
> > +       if (!es.status) {
> >                 cf->can_id |= CAN_ERR_PROT;
> >                 cf->data[2] = CAN_ERR_PROT_ACTIVE;
> > -
> > -               new_state = CAN_STATE_ERROR_ACTIVE;
> >         }
> >  
> ...
> 
> I suggest that you create functions named kvaser_get_tx_state and
> kvaser_get_rx_state (or one function that returns to argument if that suits you
> better) based on kvaser_usb_rx_error_update_state.
> 
> Because you want to assign the netlink state before you do the skb alloc, you
> need to make a copy of the netlink state before you change it and reassign the
> old state to the netlink structure after the alloc succeeds. This is because
> can_change_state() relies on priv->can.state for the "current state". This is a
> hack. Perhaps we need to split up can_change_state().
> 

Thanks a lot Andri for your detailed review! I've included changes, similar
in spirit to the above, in the next patch series.

Regards,
Darwish

> See:
> http://article.gmane.org/gmane.linux.can/7164
> http://article.gmane.org/gmane.linux.can/7162
> http://article.gmane.org/gmane.linux.can/7163
> http://article.gmane.org/gmane.linux.can/7167
> 
> Best regards,
> Andri Yngvason

  reply	other threads:[~2015-01-18 20:33 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-23 15:46 [PATCH] can: kvaser_usb: Don't free packets when tight on URBs Ahmed S. Darwish
2014-12-23 15:53 ` [PATCH] can: kvaser_usb: Add support for the Usbcan-II family Ahmed S. Darwish
2014-12-24 12:36   ` Olivier Sobrie
2014-12-24 15:04     ` Ahmed S. Darwish
2014-12-28 21:51       ` Olivier Sobrie
2014-12-30 15:33         ` Ahmed S. Darwish
2014-12-31 12:13           ` Olivier Sobrie
2014-12-24 12:31 ` [PATCH] can: kvaser_usb: Don't free packets when tight on URBs Olivier Sobrie
2014-12-24 15:52   ` Ahmed S. Darwish
2014-12-24 23:56 ` [PATCH v2 1/4] " Ahmed S. Darwish
2014-12-24 23:59   ` [PATCH v2 2/4] can: kvaser_usb: Reset all URB tx contexts upon channel close Ahmed S. Darwish
2014-12-25  0:02     ` [PATCH v2 3/4] can: kvaser_usb: Don't send a RESET_CHIP for non-existing channels Ahmed S. Darwish
2014-12-25  0:04       ` [PATCH v2 4/4] can: kvaser_usb: Add support for the Usbcan-II family Ahmed S. Darwish
2014-12-28 21:54       ` [PATCH v2 3/4] can: kvaser_usb: Don't send a RESET_CHIP for non-existing channels Olivier Sobrie
2014-12-25  2:50   ` [PATCH v2 1/4] can: kvaser_usb: Don't free packets when tight on URBs Greg KH
2014-12-25  9:38     ` Ahmed S. Darwish
2014-12-28 21:52   ` Olivier Sobrie
2015-01-01 21:59 ` [PATCH] " Stephen Hemminger
2015-01-03 14:34   ` Ahmed S. Darwish
2015-01-05 17:49 ` [PATCH v3 1/4] " Ahmed S. Darwish
2015-01-05 17:52   ` [PATCH v3 2/4] can: kvaser_usb: Reset all URB tx contexts upon channel close Ahmed S. Darwish
2015-01-05 17:57     ` [PATCH v3 3/4] can: kvaser_usb: Don't send a RESET_CHIP for non-existing channels Ahmed S. Darwish
2015-01-05 18:31       ` [PATCH v3 4/4] can: kvaser_usb: Add support for the Usbcan-II family Ahmed S. Darwish
2015-01-08 11:53         ` Marc Kleine-Budde
2015-01-08 15:19           ` Ahmed S. Darwish
2015-01-12 11:51             ` Marc Kleine-Budde
2015-01-12 12:26               ` Ahmed S. Darwish
2015-01-12 12:34                 ` Marc Kleine-Budde
2015-01-09  3:06           ` Ahmed S. Darwish
2015-01-09 14:05             ` Marc Kleine-Budde
2015-01-09 16:23               ` Oliver Hartkopp
2015-01-08  9:59   ` [PATCH v3 1/4] can: kvaser_usb: Don't free packets when tight on URBs Marc Kleine-Budde
2015-01-11 20:05 ` [PATCH v4 00/04] can: Introduce support for Kvaser USBCAN-II devices Ahmed S. Darwish
2015-01-11 20:11   ` [PATCH v4 01/04] can: kvaser_usb: Don't dereference skb after a netif_rx() devices Ahmed S. Darwish
2015-01-11 20:15     ` [PATCH v4 2/4] can: kvaser_usb: Update error counters before exiting on OOM Ahmed S. Darwish
2015-01-11 20:36       ` [PATCH v4 3/4] can: kvaser_usb: Add support for the Usbcan-II family Ahmed S. Darwish
2015-01-11 20:45         ` [PATCH v4 4/4] can: kvaser_usb: Retry first bulk transfer on -ETIMEDOUT Ahmed S. Darwish
2015-01-11 20:51           ` Marc Kleine-Budde
2015-01-12 10:14             ` Ahmed S. Darwish
2015-01-12 10:25               ` Marc Kleine-Budde
2015-01-12 13:33               ` Olivier Sobrie
2015-01-12 13:50                 ` Ahmed S. Darwish
2015-01-12 11:20         ` [PATCH v4 3/4] can: kvaser_usb: Add support for the Usbcan-II family Ahmed S. Darwish
2015-01-12 11:43         ` Marc Kleine-Budde
2015-01-12 12:07           ` Ahmed S. Darwish
2015-01-12 12:36             ` Ahmed S. Darwish
2015-01-12 13:53         ` Olivier Sobrie
2015-01-18 20:12           ` Ahmed S. Darwish
2015-01-18 20:13             ` Marc Kleine-Budde
2015-01-12 11:09       ` [PATCH v4 2/4] can: kvaser_usb: Update error counters before exiting on OOM Marc Kleine-Budde
2015-01-12 20:36         ` Ahmed S. Darwish
2015-01-16 14:39           ` Marc Kleine-Budde
2015-01-16 15:50           ` Andri Yngvason
2015-01-18 20:33             ` Ahmed S. Darwish [this message]
2015-01-11 20:49     ` [PATCH v4 01/04] can: kvaser_usb: Don't dereference skb after a netif_rx() Ahmed S. Darwish
2015-01-12 11:05       ` Marc Kleine-Budde
2015-01-20 21:44 ` [PATCH v5 1/5] can: kvaser_usb: Update net interface state before exiting on OOM Ahmed S. Darwish
2015-01-20 21:45   ` [PATCH v5 2/5] can: kvaser_usb: Consolidate and unify state change handling Ahmed S. Darwish
2015-01-20 21:47     ` [PATCH v5 3/5] can: kvaser_usb: Fix state handling upon BUS_ERROR events Ahmed S. Darwish
2015-01-20 21:48       ` [PATCH v5 4/5] can: kvaser_usb: Retry the first bulk transfer on -ETIMEDOUT Ahmed S. Darwish
2015-01-20 21:50         ` [PATCH v5 5/5] can: kvaser_usb: Add support for the USBcan-II family Ahmed S. Darwish
2015-01-21 12:24         ` [PATCH v5 4/5] can: kvaser_usb: Retry the first bulk transfer on -ETIMEDOUT Sergei Shtylyov
2015-01-25 11:59           ` Ahmed S. Darwish
2015-01-21 10:33     ` [PATCH v5 2/5] can: kvaser_usb: Consolidate and unify state change handling Andri Yngvason
2015-01-21 10:44       ` Marc Kleine-Budde
2015-01-21 11:00         ` Andri Yngvason
2015-01-21 11:53       ` Wolfgang Grandegger
2015-01-21 14:43         ` Ahmed S. Darwish
2015-01-21 15:00           ` Andri Yngvason
2015-01-21 15:36             ` Ahmed S. Darwish
2015-01-21 16:13               ` Wolfgang Grandegger
2015-01-23  6:07                 ` Ahmed S. Darwish
2015-01-23 10:32                   ` Andri Yngvason
2015-01-25  2:43                     ` Ahmed S. Darwish
2015-01-26 10:21                       ` Andri Yngvason
2015-01-21 16:37               ` Andri Yngvason
2015-01-21 16:20     ` Andri Yngvason
2015-01-21 22:59       ` Marc Kleine-Budde
2015-01-22 10:14         ` Andri Yngvason
2015-01-25  2:49           ` Ahmed S. Darwish
2015-01-25  3:21       ` Ahmed S. Darwish
2015-01-26  5:17 ` [PATCH v6 0/7] can: kvaser_usb: Leaf bugfixes and USBCan-II support Ahmed S. Darwish
2015-01-26  5:20   ` [PATCH v6 1/7] can: kvaser_usb: Do not sleep in atomic context Ahmed S. Darwish
2015-01-26  5:22     ` [PATCH v6 2/7] can: kvaser_usb: Send correct context to URB completion Ahmed S. Darwish
2015-01-26  5:24       ` [PATCH v6 3/7] can: kvaser_usb: Retry the first bulk transfer on -ETIMEDOUT Ahmed S. Darwish
2015-01-26  5:25         ` [PATCH v6 4/7] can: kvaser_usb: Fix state handling upon BUS_ERROR events Ahmed S. Darwish
2015-01-26  5:27           ` [PATCH v6 5/7] can: kvaser_usb: Update interface state before exiting on OOM Ahmed S. Darwish
2015-01-26  5:29             ` [PATCH v6 6/7] can: kvaser_usb: Consolidate and unify state change handling Ahmed S. Darwish
2015-01-26  5:33               ` [PATCH v6 7/7] can: kvaser_usb: Add support for the USBcan-II family Ahmed S. Darwish
2015-01-26 10:34                 ` Andri Yngvason
2015-01-26 10:26               ` [PATCH v6 6/7] can: kvaser_usb: Consolidate and unify state change handling Andri Yngvason
2015-01-26 10:28             ` [PATCH v6 5/7] can: kvaser_usb: Update interface state before exiting on OOM Andri Yngvason
2015-01-26 10:50               ` Marc Kleine-Budde
2015-01-26 10:52                 ` Andri Yngvason
2015-01-26 10:53                   ` Marc Kleine-Budde
2015-01-26  9:55   ` [PATCH v6 0/7] can: kvaser_usb: Leaf bugfixes and USBCan-II support Marc Kleine-Budde
2015-01-26 10:07   ` Marc Kleine-Budde
2015-01-26 10:56     ` Marc Kleine-Budde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150118203347.GB15143@linux \
    --to=darwish.07@gmail.com \
    --cc=andri.yngvason@marel.com \
    --cc=linux-can@vger.kernel.org \
    --cc=mkl@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.