--- a/net/can/j1939/transport.c 2022-06-15 18:48:27.235848700 +0800 +++ b/net/can/j1939/transport.c 2022-06-15 18:54:11.242804700 +0800 @@ -1101,7 +1101,7 @@ j1939_session_deactivate_activate_next(s j1939_sk_queue_activate_next(session); } -static void __j1939_session_cancel(struct j1939_session *session, +static int __j1939_session_cancel(struct j1939_session *session, enum j1939_xtp_abort err) { struct j1939_priv *priv = session->priv; @@ -1118,24 +1118,29 @@ static void __j1939_session_cancel(struc err, session->skcb.addr.pgn); } - if (session->sk) + if (session->sk) { j1939_sk_send_loop_abort(session->sk, session->err); - else - j1939_sk_errqueue(session, J1939_ERRQUEUE_RX_ABORT); + return 0; + } else + return 1; } static void j1939_session_cancel(struct j1939_session *session, enum j1939_xtp_abort err) { + int errq = 0; j1939_session_list_lock(session->priv); if (session->state >= J1939_SESSION_ACTIVE && session->state < J1939_SESSION_WAITING_ABORT) { j1939_tp_set_rxtimeout(session, J1939_XTP_ABORT_TIMEOUT_MS); - __j1939_session_cancel(session, err); + errq = __j1939_session_cancel(session, err); } j1939_session_list_unlock(session->priv); + + if (errq) + j1939_sk_errqueue(session, J1939_ERRQUEUE_RX_ABORT); } static enum hrtimer_restart j1939_tp_txtimer(struct hrtimer *hrtimer) @@ -1237,6 +1242,7 @@ static enum hrtimer_restart j1939_tp_rxt session->err = -ETIME; j1939_session_deactivate(session); } else { + int errq = 0; j1939_session_list_lock(session->priv); if (session->state >= J1939_SESSION_ACTIVE && session->state < J1939_SESSION_ACTIVE_MAX) { @@ -1246,9 +1252,12 @@ static enum hrtimer_restart j1939_tp_rxt hrtimer_start(&session->rxtimer, ms_to_ktime(J1939_XTP_ABORT_TIMEOUT_MS), HRTIMER_MODE_REL_SOFT); - __j1939_session_cancel(session, J1939_XTP_ABORT_TIMEOUT); + errq = __j1939_session_cancel(session, J1939_XTP_ABORT_TIMEOUT); } j1939_session_list_unlock(session->priv); + + if (errq) + j1939_sk_errqueue(session, J1939_ERRQUEUE_RX_ABORT); } j1939_session_put(session);