Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 03 Nov 2015 18:12:48 +0200
From:      "Andriy Voskoboinyk" <avos@freebsd.org>
To:        "Adrian Chadd" <adrian@freebsd.org>, "freebsd-wireless@freebsd.org" <freebsd-wireless@freebsd.org>, "Mark Felder" <feld@freebsd.org>
Subject:   Re: (untested) ath fix upon error
Message-ID:  <op.x7i8nmgh4dikkl@localhost>
In-Reply-To: <CAJ-Vmom3hOt63Tc1332hPFpqkEcbSvrCA=nRGgwMLLf02Pbr2Q@mail.gmail.com>
References:  <CAJ-Vmom3hOt63Tc1332hPFpqkEcbSvrCA=nRGgwMLLf02Pbr2Q@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Tue, 03 Nov 2015 17:31:18 +0200 =D0=B1=D1=83=D0=BB=D0=BE =D0=BD=D0=B0=D0=
=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=BE Adrian Chadd  =

<adrian@freebsd.org>:

> hiya,
>
> what do people think about this to fix ath(4) transmit errors:
>
> adrian@victoria:~/work/freebsd/head-embedded/src % svn diff sys/dev/at=
h
> Index: sys/dev/ath/if_ath.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- sys/dev/ath/if_ath.c        (revision 290048)
> +++ sys/dev/ath/if_ath.c        (working copy)
> @@ -3320,6 +3320,9 @@
>          *
>          * Note: if this fails, then the mbufs are freed but
>          * not the node reference.
> +        *
> +        * So, we now have to free the node reference ourselves here
> +        * and return OK up to the stack.
>          */
>         next =3D m->m_nextpkt;
>         if (ath_tx_start(sc, ni, bf, m)) {
> @@ -3336,7 +3339,14 @@
>                  */
>                 ath_txfrag_cleanup(sc, &frags, ni);
>                 ATH_TXBUF_UNLOCK(sc);
> -               retval =3D ENOBUFS;
> +
> +               /*
> +                * XXX: And free the node/return OK; ath_tx_start() ma=
y  =

> have
> +                *      modified the buffer.  We currently have no way=
 to
> +                *      signify that the mbuf was freed but there was =
an  =

> error.
> +                */
> +               ieee80211_node_free(ni);
> +               retval =3D 0;
>                 goto finish;
>         }
>
>
> .. the idea is that we can't return failure once we've called
> ath_tx_start(), as the mbuf needs to be consumed. So we return OK and
> just count an error.
>

Yes, I think this (temporary?) workaround should fix the issue.

>
>
> -adrian



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?op.x7i8nmgh4dikkl>