Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Dec 2011 21:14:50 +0100
From:      Marius Strobl <marius@alchemy.franken.de>
To:        Luigi Rizzo <rizzo@iet.unipi.it>
Cc:        svn-src-head@freebsd.org, Luigi Rizzo <luigi@freebsd.org>, src-committers@freebsd.org, svn-src-all@freebsd.org
Subject:   Re: svn commit: r228281 - in head/sys/dev: e1000 re
Message-ID:  <20111205201450.GR60194@alchemy.franken.de>
In-Reply-To: <20111205193150.GB49118@onelab2.iet.unipi.it>
References:  <201112051533.pB5FXEuh043063@svn.freebsd.org> <20111205183854.GC54475@alchemy.franken.de> <20111205193150.GB49118@onelab2.iet.unipi.it>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Dec 05, 2011 at 08:31:50PM +0100, Luigi Rizzo wrote:
> On Mon, Dec 05, 2011 at 07:38:54PM +0100, Marius Strobl wrote:
> > On Mon, Dec 05, 2011 at 03:33:14PM +0000, Luigi Rizzo wrote:
> ...
> > > +#ifdef DEV_NETMAP
> > > +		if (slot) {
> > > +			int si = i + na->tx_rings[txr->me].nkr_hwofs;
> > > +			void *addr;
> > > +
> > > +			if (si >= na->num_tx_desc)
> > > +				si -= na->num_tx_desc;
> > > +			addr = NMB(slot + si);
> > > +			txr->tx_base[i].buffer_addr =
> > > +			    htole64(vtophys(addr));
> > > +			/* reload the map for netmap mode */
> > > +			netmap_load_map(txr->txtag,
> > > +			    txbuf->map, addr, na->buff_size);
> > > +		}
> > > +#endif /* DEV_NETMAP */
> > 
> > Can these vtophys(9) usages be fixed to use bus_dma(9) instead so netmap
> > works with bounce buffers, IOMMUs etc?
> 
> maybe. Can you suggest how to change it ?
> 
> Consider that (not here but in other places) vtophys() is called
> in a time-critical loop so performance matters a lot. As long as i
> can compute the physical address in advance and cache it in my own
> array, i suppose that should be fine (in which case the calls to
> vtophys(addr) would become NMPB(slot + si) where the NMPB() macro
> would hide translations and checks.
> 

Basically, you'd call bus_dmamap_load(9) on the netmap buffers using
the tags and maps the driver also uses in the !netmap case to load
mbufs. If you're generally pre-allocating the netmap buffers (sorry,
I don't have time to check the netmap code) it should also be fine
to cache the resulting physical addresses obtained via the bus_dma
callback. You'd still need to call bus_dmamap_sync(9) whenever you
actually assign a buffer to the hardware and when taking off of it
so the bounce buffers are copied over, streaming buffers are synced
etc.

Marius




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