Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Jul 2012 19:11:24 -0700
From:      Adrian Chadd <adrian@freebsd.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org,  svn-src-head@freebsd.org
Cc:        freebsd-wireless@freebsd.org
Subject:   Re: svn commit: r238824 - head/sys/dev/ath
Message-ID:  <CAJ-Vmok_8sFtvjxP8wUyOHGs_rjost7f=LytjTqDOCbeJ_4kqA@mail.gmail.com>
In-Reply-To: <201207270548.q6R5mgiS070136@svn.freebsd.org>
References:  <201207270548.q6R5mgiS070136@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

This broke -HEAD. Let me go and figure out what I need to do to fix
the descriptor offset math.

It only showed up under heavy iperf testing. Ping wasn't enough to
trigger the crash. :(



Adrian


On 26 July 2012 22:48, Adrian Chadd <adrian@freebsd.org> wrote:
> Author: adrian
> Date: Fri Jul 27 05:48:42 2012
> New Revision: 238824
> URL: http://svn.freebsd.org/changeset/base/238824
>
> Log:
>   Migrate the descriptor allocation function to not care about the number
>   of buffers, only the number of descriptors.
>
>   This involves:
>
>   * Change the allocation function to not use nbuf at all;
>   * When calling it, pass in "nbuf * ndesc" to correctly update how many
>     descriptors are being allocated.
>
>   Whilst here, fix the descriptor allocation code to correctly allocate
>   a larger buffer size if the Merlin 4KB WAR is required.  It overallocates
>   descriptors when allocating a block that doesn't ever have a 4KB boundary
>   being crossed, but that can be fixed at a later stage.
>
> Modified:
>   head/sys/dev/ath/if_ath.c
>   head/sys/dev/ath/if_ath_misc.h
>
> Modified: head/sys/dev/ath/if_ath.c
> ==============================================================================
> --- head/sys/dev/ath/if_ath.c   Fri Jul 27 05:37:01 2012        (r238823)
> +++ head/sys/dev/ath/if_ath.c   Fri Jul 27 05:48:42 2012        (r238824)
> @@ -2773,7 +2773,7 @@ ath_load_cb(void *arg, bus_dma_segment_t
>  int
>  ath_descdma_alloc_desc(struct ath_softc *sc,
>         struct ath_descdma *dd, ath_bufhead *head,
> -       const char *name, int ds_size, int nbuf, int ndesc)
> +       const char *name, int ds_size, int ndesc)
>  {
>  #define        DS2PHYS(_dd, _ds) \
>         ((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc))
> @@ -2785,11 +2785,11 @@ ath_descdma_alloc_desc(struct ath_softc
>         dd->dd_descsize = ds_size;
>
>         DPRINTF(sc, ATH_DEBUG_RESET,
> -           "%s: %s DMA: %u buffers %u desc/buf, %d bytes per descriptor\n",
> -           __func__, name, nbuf, ndesc, dd->dd_descsize);
> +           "%s: %s DMA: %u desc, %d bytes per descriptor\n",
> +           __func__, name, ndesc, dd->dd_descsize);
>
>         dd->dd_name = name;
> -       dd->dd_desc_len = dd->dd_descsize * nbuf * ndesc;
> +       dd->dd_desc_len = dd->dd_descsize * ndesc;
>
>         /*
>          * Merlin work-around:
> @@ -2797,8 +2797,8 @@ ath_descdma_alloc_desc(struct ath_softc
>          * Assume one skipped descriptor per 4KB page.
>          */
>         if (! ath_hal_split4ktrans(sc->sc_ah)) {
> -               int numdescpage = 4096 / (dd->dd_descsize * ndesc);
> -               dd->dd_desc_len = (nbuf / numdescpage + 1) * 4096;
> +               int numpages = dd->dd_desc_len / 4096;
> +               dd->dd_desc_len += ds_size * numpages;
>         }
>
>         /*
> @@ -2834,7 +2834,7 @@ ath_descdma_alloc_desc(struct ath_softc
>                                  &dd->dd_dmamap);
>         if (error != 0) {
>                 if_printf(ifp, "unable to alloc memory for %u %s descriptors, "
> -                       "error %u\n", nbuf * ndesc, dd->dd_name, error);
> +                       "error %u\n", ndesc, dd->dd_name, error);
>                 goto fail1;
>         }
>
> @@ -2883,7 +2883,7 @@ ath_descdma_setup(struct ath_softc *sc,
>
>         /* Allocate descriptors */
>         error = ath_descdma_alloc_desc(sc, dd, head, name, ds_size,
> -           nbuf, ndesc);
> +           nbuf * ndesc);
>
>         /* Assume any errors during allocation were dealt with */
>         if (error != 0) {
>
> Modified: head/sys/dev/ath/if_ath_misc.h
> ==============================================================================
> --- head/sys/dev/ath/if_ath_misc.h      Fri Jul 27 05:37:01 2012        (r238823)
> +++ head/sys/dev/ath/if_ath_misc.h      Fri Jul 27 05:48:42 2012        (r238824)
> @@ -86,7 +86,7 @@ extern void ath_setslottime(struct ath_s
>
>  extern int ath_descdma_alloc_desc(struct ath_softc *sc,
>             struct ath_descdma *dd, ath_bufhead *head, const char *name,
> -           int ds_size, int nbuf, int ndesc);
> +           int ds_size, int ndesc);
>  extern int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
>             ath_bufhead *head, const char *name, int ds_size, int nbuf,
>             int ndesc);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-Vmok_8sFtvjxP8wUyOHGs_rjost7f=LytjTqDOCbeJ_4kqA>