aregm / nff-go

NFF-Go -Network Function Framework for GO (former YANFF)
BSD 3-Clause "New" or "Revised" License
1.38k stars 154 forks source link

kni allocation error on ubuntu 18.04 #641

Closed zartbot closed 5 years ago

zartbot commented 5 years ago

dpdk C based works well

kevin@kevin-ws:~/dpdk/examples/kni$ sudo ./build/kni -l 4-7 -n 4 -- -P -p 0x3 -m --config="(0,4,6,8),(1,5,7,9)"
EAL: Detected 16 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: 112 hugepages of size 1073741824 reserved, but no mounted hugetlbfs found for that size
EAL: Probing VFIO support...
EAL: PCI device 0000:00:19.0 on NUMA socket 0
EAL:   probe driver: 8086:15a0 net_e1000_em
EAL: PCI device 0000:02:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:02:00.1 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:02:00.2 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:02:00.3 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:03:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:03:00.1 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:03:00.2 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:03:00.3 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:05:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1533 net_e1000_igb
APP: Initialising port 0 ...
APP: Initialising port 1 ...

Checking link status
..........................................................................................done
Port0 Link Up - speed 1000Mbps - full-duplex
Port 1 Link Down
APP: ========================
APP: KNI Running
APP: kill -SIGUSR1 5162
APP:     Show KNI Statistics.
APP: kill -SIGUSR2 5162
APP:     Zero KNI Statistics.
APP: ========================
APP: Lcore 5 is reading from port 1
APP: Configure network interface of 1 up
APP: Lcore 7 is writing to port 1
APP: Lcore 6 is writing to port 0
APP: Lcore 4 is reading from port 0
APP: Configure network interface of 0 up

^C
SIGRTMIN/SIGINT received. KNI processing stopping.

nff-go based kni has allocation issue

kevin@kevin-ws:/opt/golang/gopath/src/github.com/intel-go/nff-go/examples$ sudo ./kni
------------***-------- Initializing DPDK --------***------------
EAL: Detected 16 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: 112 hugepages of size 1073741824 reserved, but no mounted hugetlbfs found for that size
EAL: Probing VFIO support...
EAL: PCI device 0000:00:19.0 on NUMA socket 0
EAL:   probe driver: 8086:15a0 net_e1000_em
EAL: PCI device 0000:02:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:02:00.1 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:02:00.2 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:02:00.3 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:03:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:03:00.1 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:03:00.2 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:03:00.3 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:05:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1533 net_e1000_igb
------------***------ Initializing scheduler -----***------------
DEBUG: Scheduler can use cores: [0 1 2 3 4 5 6 7]
KNI: pci: 02:00:00   8086:1521
ERROR: failed with message and code: Error with KNI allocation
 (29)
zartbot commented 5 years ago

it seems dpdk package issue , after upgrade to latest dpdk under nff-go/dpdk/dpdk , it works well.

zartbot commented 5 years ago

after upgrade to latest dpdk, seem some var defined has been changed.

ether_addr ipadd may need to add "rte" prefix


diff --git a/internal/low/low.go b/internal/low/low.go
index 9ef3103..f5f1386 100644
--- a/internal/low/low.go
+++ b/internal/low/low.go
@@ -84,7 +84,7 @@ func CheckRSSPacketCount(p *Port, queue int16) int64 {
 // GetPortMACAddress gets MAC address of given port.
 func GetPortMACAddress(port uint16) [types.EtherAddrLen]uint8 {
        var mac [types.EtherAddrLen]uint8
-       var cmac C.struct_ether_addr
+       var cmac C.struct_rte_ether_addr

        C.rte_eth_macaddr_get(C.uint16_t(port), &cmac)
        for i := range mac {
diff --git a/internal/low/low.h b/internal/low/low.h
index af656d0..ac27113 100644
--- a/internal/low/low.h
+++ b/internal/low/low.h
@@ -214,7 +214,7 @@ int create_kni(uint16_t port, uint32_t core, char *name, struct rte_mempool *mbu
                conf_default.id = pci_dev->id;
        }
        conf_default.force_bind = 1; // Flag to bind kernel thread
-       rte_eth_macaddr_get(port, (struct ether_addr *)&conf_default.mac_addr);
+       rte_eth_macaddr_get(port, (struct rte_ether_addr *)&conf_default.mac_addr);
        rte_eth_dev_get_mtu(port, &conf_default.mtu);

        struct rte_kni_ops ops;
@@ -280,7 +280,7 @@ int port_init(uint16_t port, bool willReceive, struct rte_mempool **mbuf_pools,
                return -1;

        struct rte_eth_conf port_conf_default = {
-               .rxmode = { .max_rx_pkt_len = ETHER_MAX_LEN,
+               .rxmode = { .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
                                        .mq_mode = ETH_MQ_RX_RSS    },
                .txmode = { .mq_mode = ETH_MQ_TX_NONE, },
                .rx_adv_conf.rss_conf.rss_key = NULL,
@@ -424,12 +424,12 @@ struct rte_ip_frag_tbl* create_reassemble_table() {

 __attribute__((always_inline))
 static inline struct rte_mbuf* reassemble(struct rte_ip_frag_tbl* tbl, struct rte_mbuf *buf, struct rte_ip_frag_death_row* death_row, uint64_t cur_tsc) {
-       struct ether_hdr *eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);
+       struct rte_ether_hdr *eth_hdr = rte_pktmbuf_mtod(buf, struct rte_ether_hdr *);

        // TODO packet_type is not mandatory required for drivers.
        // Some drivers won't set it. However this is DPDK implementation.
        if (RTE_ETH_IS_IPV4_HDR(buf->packet_type)) { // if packet is IPv4
-               struct ipv4_hdr *ip_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
+               struct rte_ipv4_hdr *ip_hdr = (struct rte_ipv4_hdr *)(eth_hdr + 1);

                if (rte_ipv4_frag_pkt_is_fragmented(ip_hdr)) { // try to reassemble
                        buf->l2_len = sizeof(*eth_hdr); // prepare mbuf: setup l2_len/l3_len.
@@ -440,7 +440,7 @@ static inline struct rte_mbuf* reassemble(struct rte_ip_frag_tbl* tbl, struct rt
                }
        }
        if (RTE_ETH_IS_IPV6_HDR(buf->packet_type)) { // if packet is IPv6
-               struct ipv6_hdr *ip_hdr = (struct ipv6_hdr *)(eth_hdr + 1);
+               struct rte_ipv6_hdr *ip_hdr = (struct rte_ipv6_hdr *)(eth_hdr + 1);
                struct ipv6_extension_fragment *frag_hdr = rte_ipv6_frag_get_ipv6_fragment_header(ip_hdr);

                if (frag_hdr != NULL) {
``
zartbot commented 5 years ago

and the pktgen need to upgrade to 3.7.2

gshimansky commented 5 years ago

Which revision are you using? I upgraded DPDK to 19.08 in develop branch and changed type names in revision 115114dd6c01b2dc712033bc37e5c67682ffe49f.

zartbot commented 5 years ago

I use origin/master v0.8.1-2-g4367f4d, I realize that i take some mistake to load dpdk 19.08 module with codes on this branch , will try 19.08 dev branch later