Embedded Intel® Core™ Processors
Communicate Intel® Core™ Hardware, Software, Firmware, Graphics Concerns

Data Plane Developer Kit

SMent1
Beginner
8,083 Views

The Data Plane SDK was announced last year (available 2Q2010) as Intel's solution for fast-path network processing. Previously, the only available solutions were proprietary via 3rd party vendors such as WindRiver. As far as I can tell, it is still not available. Does anyone have info regarding release dates for the SDK? We are interested in gaining knowledge on this subject for a future IPTV VOD-server project.

Thanks,

Steve

29 Replies
Natalie_Z_Intel
Employee
1,201 Views

Hi jiexie, the DPDK team asked me to make you aware of the developer mailing lists at http://www.dpdk.org/ www.dpdk.org where you will find a bigger DPDK open source community there. They have discussions related to KNI happening there right now. Can you check it out and let me know what you think? LynnZ

0 Kudos
Natalie_Z_Intel
Employee
1,201 Views

By the way, jiexie, you need to register on the developer mailing lists to see those discussions at http://www.dpdk.org/ www.dpdk.org.

0 Kudos
jxie9
Beginner
1,201 Views

OK,

I will visit http://www.dpdk.org/ www.dpdk.org. to check what can I get for my problem.

Thanks very much!

0 Kudos
CSing2
Beginner
1,201 Views
Hi LynnZ,

I am using DPDK 1.5.0 and trying to use KNI interface to measure throughput through it

----------------------------------------------------------------------------------------------------------

I have machine with 2 lcores and 2 physical interface, and in running kni sample application --config parameter we are supposed to give

 

1)port no, 2)lcore_rx,3)lcore_tx, right?

so can it be possible to give same lcore no. for both ports, like

kni -c 0x3 -n 4 -- -P -p 0x3 --config"(0,0,1),(1,0,1)"

 

As i have tried and after running this two interface vEth0 and vEth1 is created, but when i am giving ip with ifconfig to vEth1 then it is showing the below message ...

SIOCSIFFLAGS: Timer expired,

while i am able to bring up the the vEth0 interface successfully.

-----------------------------------------------------------------------------------------------------i am pasting some details which prints while running the application ...

 

 

Checking link status

 

.....done

 

Port 0 Link Up - speed 1000 Mbps - full-duplex

 

Port 1 Link Up - speed 1000 Mbps - full-duplex

 

APP: Lcore 1 is writing to port 0

 

APP: Lcore 0 is reading from port 0

and here in last two line Lcore 1 and Lcore 0 is writting and reading for port 0 and may be therefore i am able to bring up the vEth0. and there is no core for port 1 so it is failing.

---------------------------------------------------------------------------------------------------------

 

So my question is why can't we use same lcores for reading and writing for both ports, does DPDK restricts using same lcores for 2 ports (as it seems), and if so, then why??

Thanks in advance

 

Chandra

0 Kudos
Muthurajan_J_Intel
1,201 Views

Dear customer.

Thank you for using Intel DPDK.

You are correct - the way kni sample example application is designed - is the way what you have specified here "Locre 1 and Lcore 0 writing and reading for port 0". In agreement with what you have described, Chapter 8.1 overview of http://www.intel.com/content/dam/www/public/us/en/documents/guides/intel-dpdk-sample-applications-user-guide.pdf http://www.intel.com/content/dam/www/public/us/en/documents/guides/intel-dpdk-sample-applications-user-guide.pdf indicates that "For a physical NIC port, one thread reads from the port and writes to the kni and another thread reads from KNI devices and writes the data unmodified to the port".

We had TUN / TAP implementation for communication between user space app to kernel space. The need was better performance. Hence we have KNI. So, performance point of view, we have one core dedicated per port.

Implementation [below] follow the design intent with kni_port_params having the mapping for 1 port ID.

kni_ingress(struct kni_port_params *p) 

{

 

uint8_t i, port_id;

 

unsigned nb_rx, num;

 

uint32_t nb_kni;

 

struct rte_mbuf *pkts_burst[PKT_BURST_SZ];

 

 

if (p == NULL)

 

return;

 

 

nb_kni = p->nb_kni;

 

port_id = p->port_id;

 

for (i = 0; i < nb_kni; i++) {

 

/* Burst rx from eth */

Thank you,

0 Kudos
CSing2
Beginner
1,201 Views

Hi Kumar,

1.) What i can see into code is that, for one KNI interface creation we require two dedicated lcores (i.e one for reading and one for writting , that is two lcores for one KNI interface), so if i have to create two interface then i need four dedicated lcores(according to present design of KNI application)???

2.) If it is so, then could you please write me why the designers had thought of using two dedicated lcores for one KNI interface, do the thread safety in mempool libraries and RX/TX in the PMD were their concern while design.

3.) i really need some pointers from you, what area (in KNI application) i have to target if i need to create two KNI interface from two lcores (b'coz i have only two cores in my system).

Thanks in advance,

Chandra

0 Kudos
Muthurajan_J_Intel
1,201 Views

Dear Chandra,

Acknowledging your mail.

Will get back to you

Thank you

0 Kudos
Muthurajan_J_Intel
1,201 Views

Hi,

the reason(s) why kni sample app uses a separate lcore for each port:

a) performance.

b) design simplicity.

There is nothing that prevents same logical core to handle both RX and TX for multiple ports.

It has best performance if a lcore in user space move packet descriptors from DPDK to KNI queue and another lcore in kernel space then COPY packet data to skb and then push skb to kernel stack.

It should have no thread safe issue no matter it is multiple lcores poll same queue or a lcore polls multiple queues. For the former case, lockless queue design leverage atomic instruction "cmpxchg"(BTW, but we did see performance drops significantly for this case); for the second case, no shared data among queues.

For the customer case of using same logical core to handle both RX and TX for multiple ports, basically the aggregated performance remains same while per port performance will be half of the one port case giving they have 2 ports to support

0 Kudos
Muthurajan_J_Intel
1,201 Views

Assuming you are using DPDK 1.5, and pls take a look at new command-line below on how to support multi-threaded KNI. Basically, it is ok to have single kernel thread(pin to a lcore) to handle multiple queues of multiple ports. But KNI application needs some changes as it assumes no overlapping of Rx/Tx lcore on multiple ports. The biggest change should be in main_loop() function as below, highlighted code snippet that need to change in YELLOW. ARE YOU ABLE to see the color in the advanced editor mode - "Use Advanced Editor"

static int

main_loop(__rte_unused void *arg)

{

uint8_t i, nb_ports = rte_eth_dev_count();

int32_t f_stop;

const unsigned lcore_id = rte_lcore_id();

enum lcore_rxtx {

LCORE_NONE,

LCORE_RX,

LCORE_TX,

LCORE_MAX

};

enum lcore_rxtx flag = LCORE_NONE;

nb_ports = (uint8_t)(nb_ports < RTE_MAX_ETHPORTS ?

nb_ports : RTE_MAX_ETHPORTS);

for (i = 0; i < nb_ports; i++) {

if (!kni_port_params_array[i])

continue;

if (kni_port_params_array[i]->lcore_rx == (uint8_t)lcore_id) {

flag = LCORE_RX;

break;

} else if (kni_port_params_array[i]->lcore_tx ==

(uint8_t)lcore_id) {

flag = LCORE_TX;

break;

}

}

/* code above get the port index and Rx/Tx direction, should get port mask if overlapping is allowed */

if (flag == LCORE_RX) {

RTE_LOG(INFO, APP, "Lcore %u is reading from port %d\n",

kni_port_params_array[i]->lcore_rx,

kni_port_params_array[i]->port_id);

while (1) {

f_stop = rte_atomic32_read(&kni_stop);

if (f_stop)

break;

kni_ingress(kni_port_params_array[i]);

/* code highlighted need to receive traffic from all ports specified in the port mask */

/* Note: suggest to have a lcore in charge of Rx for all ports. Having a lcore Rx port0 and Tx port1 would cause a lot more code change */

}

} else if (flag == LC...

0 Kudos
Reply