Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Sep 2014 17:48:29 +0200
From:      Luigi Rizzo <rizzo@iet.unipi.it>
To:        "Eggert, Lars" <lars@netapp.com>
Cc:        "net@freebsd.org" <net@freebsd.org>
Subject:   Re: netmap extra rings and buffers
Message-ID:  <20140904154829.GA80780@onelab2.iet.unipi.it>
In-Reply-To: <B1098F39-36FD-440B-B325-91F0FE78C9E1@netapp.com>
References:  <B1098F39-36FD-440B-B325-91F0FE78C9E1@netapp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Sep 04, 2014 at 11:58:28AM +0000, Eggert, Lars wrote:
> Hi Luigi,
> 
> I'm allocating extra rings and/or extra buffers via the nr_arg1/nr_arg3 parameters for NIOCREGIF.
> 
> Once I've done that, how do I actually access those rings and buffers?
> 
> For extra rings, the documentation and example code don't really say anything.
> 
> For extra buffers, the documentation says "nifp->ni_bufs_head will be the index of the first buffer" but doesn't really explain how I can find the buffer given its index (since it's not in a ring, the NETMAP_BUF macro doesn't seem to apply?) The part about "buffers are linked to each other using the first uint32_t as the index" is also unclear to me.
> 
> Do you have some more text or example code that shows how to use extra rings and buffers?

the ifield to request extra rings is only important when you want
to make sure that the memory region for a VALE port has also
space to host some pipes. Otherwise, for physical ports (which at
the moment all share the same address space) there is not a real
need to specify it.

For the extra buffers, remember that NETMAP_BUF() can translate
buffer indexes for any netmap buffer, even those not in a ring.
All it does is grab the base address of the buffer pool from the
ring, and add the buffer index times the buffer size.

So you can navigate the pool of extra buffers as follows

    uint32_t x = nifp->ni_bufs_head;	// index of first buf

    void *p = NETMAP_BUF(any_ring, x);	// address of the first buffer

    x = *((uint32_t *)p);		// index of the next buffer

cheers
luigi



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