8eba5ebd18
alloc_q and rx_q fifos holds physical address of the mbufs, and not able
to free those mbufs explicitly.
But kernel thread reads from rx_q and puts used mbufs into free_q (with
their virtual addresses.) And kernel thread stopped when application
close the /dev/kni file on exit. So rx_q has time to be consumed by
kernel thread but leak is technically possible.
Another fifo, alloc_q has physical addresses too, but all those coming
from same mempool provided by application, when application quit, all
mempool already returned back, so this leak can be ignored.
Added check and wait logic for rx_q to be sure kernel consumed the fifo,
an error message printed after some ammount of wait, and an explicit
mempool free added for alloc_q.
Fixes: 8451269e6d
("kni: remove continuous memory restriction")
Cc: stable@dpdk.org
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
103 lines
3.1 KiB
C
103 lines
3.1 KiB
C
/*-
|
|
* BSD LICENSE
|
|
*
|
|
* Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* * Neither the name of Intel Corporation nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
* Initializes the kni fifo structure
|
|
*/
|
|
static void
|
|
kni_fifo_init(struct rte_kni_fifo *fifo, unsigned size)
|
|
{
|
|
/* Ensure size is power of 2 */
|
|
if (size & (size - 1))
|
|
rte_panic("KNI fifo size must be power of 2\n");
|
|
|
|
fifo->write = 0;
|
|
fifo->read = 0;
|
|
fifo->len = size;
|
|
fifo->elem_size = sizeof(void *);
|
|
}
|
|
|
|
/**
|
|
* Adds num elements into the fifo. Return the number actually written
|
|
*/
|
|
static inline unsigned
|
|
kni_fifo_put(struct rte_kni_fifo *fifo, void **data, unsigned num)
|
|
{
|
|
unsigned i = 0;
|
|
unsigned fifo_write = fifo->write;
|
|
unsigned fifo_read = fifo->read;
|
|
unsigned new_write = fifo_write;
|
|
|
|
for (i = 0; i < num; i++) {
|
|
new_write = (new_write + 1) & (fifo->len - 1);
|
|
|
|
if (new_write == fifo_read)
|
|
break;
|
|
fifo->buffer[fifo_write] = data[i];
|
|
fifo_write = new_write;
|
|
}
|
|
fifo->write = fifo_write;
|
|
return i;
|
|
}
|
|
|
|
/**
|
|
* Get up to num elements from the fifo. Return the number actully read
|
|
*/
|
|
static inline unsigned
|
|
kni_fifo_get(struct rte_kni_fifo *fifo, void **data, unsigned num)
|
|
{
|
|
unsigned i = 0;
|
|
unsigned new_read = fifo->read;
|
|
unsigned fifo_write = fifo->write;
|
|
for (i = 0; i < num; i++) {
|
|
if (new_read == fifo_write)
|
|
break;
|
|
|
|
data[i] = fifo->buffer[new_read];
|
|
new_read = (new_read + 1) & (fifo->len - 1);
|
|
}
|
|
fifo->read = new_read;
|
|
return i;
|
|
}
|
|
|
|
/**
|
|
* Get the num of elements in the fifo
|
|
*/
|
|
static inline uint32_t
|
|
kni_fifo_count(struct rte_kni_fifo *fifo)
|
|
{
|
|
return (fifo->len + fifo->write - fifo->read) & (fifo->len - 1);
|
|
}
|