diff --git a/lib/dpdkdevice.cc b/lib/dpdkdevice.cc index 773db76a8548a4619cbfbb277b4735715b70a6d2..b2411e191133e88148edfee5feb92d4efba83bf0 100644 --- a/lib/dpdkdevice.cc +++ b/lib/dpdkdevice.cc @@ -69,7 +69,7 @@ extern "C" { #define DEV_TX_OFFLOAD_TCP_TSO RTE_ETH_TX_OFFLOAD_TCP_TSO #define DEV_TX_OFFLOAD_MULTI_SEGS RTE_ETH_TX_OFFLOAD_MULTI_SEGS #ifndef RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE -# define RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE +# define RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE DEV_TX_OFFLOAD_MBUF_FAST_FREE #endif //#define DEF_DEV_RXDESC DEF_RTE_ETH_RXDESC @@ -703,7 +703,8 @@ int DPDKDevice::initialize_device(ErrorHandler *errh) sprintf(vendor_and_dev, "%x:%x", info.vendor_id, info.device_id); // Retrieve more information about the vendor of this NIC - String dev_pci = shell_command_output_string("lspci -d " + String(vendor_and_dev), "", errh); + + String dev_pci = shell_command_output_string("lspci -d " + String(vendor_and_dev) + " 2>/dev/null", "", errh); String long_vendor_name = parse_pci_info(dev_pci, "Ethernet controller"); if (!long_vendor_name.empty()) { info.vendor_name = keep_token_left(long_vendor_name, ' '); diff --git a/lib/packet.cc b/lib/packet.cc index 6e9987a3ccb5102d8dbbaa84a3f4e67577efea7e..9fad169fcec0e68becebfbc557a8cb2c37a3345c 100644 --- a/lib/packet.cc +++ b/lib/packet.cc @@ -1065,6 +1065,8 @@ Packet::clone(bool fast) # endif Packet* p = reinterpret_cast<Packet *>( rte_pktmbuf_clone(mb(), DPDKDevice::get_mpool(rte_socket_id()))); + if (likely(!p)) + return 0; p->copy_annotations(this,true); p->copy_headers(this); return p; @@ -1406,7 +1408,6 @@ Packet::expensive_push(uint32_t nbytes) __skb_push(q->skb(), nbytes); #elif CLICK_PACKET_USE_DPDK rte_pktmbuf_prepend(q->mb(), nbytes); - click_chatter("New head : %d",q->headroom()); #else /* User-space and BSD kernel module */ q->_data -= nbytes; # ifdef CLICK_BSDMODULE @@ -1423,9 +1424,6 @@ Packet::expensive_push(uint32_t nbytes) WritablePacket * Packet::expensive_put(uint32_t nbytes) { -#if CLICK_PACKET_USE_DPDK - assert(false); -#endif static int chatter = 0; if (tailroom() < nbytes && chatter < 5) { click_chatter("expensive Packet::put; have %d wanted %d", diff --git a/lib/userutils.cc b/lib/userutils.cc index 3d67b9aad69e11d7e7d158666322520b1a127f21..858977f82fd8921cf78eaa650404343e945f2991 100644 --- a/lib/userutils.cc +++ b/lib/userutils.cc @@ -260,51 +260,51 @@ shell_command_output_string(String cmdline, const String &input, ErrorHandler *e StringAccum sa; if (!(f = tmpfile())) { - errh->error("%<%s%>: tmpfile: %s", cmdline.c_str(), strerror(errno)); - goto out; + errh->error("%<%s%>: tmpfile: %s", cmdline.c_str(), strerror(errno)); + goto out; } ignore_result(fwrite(input.data(), 1, input.length(), f)); fflush(f); rewind(f); if (pipe(pfd) == -1) { - errh->error("%<%s%>: pipe: %s", cmdline.c_str(), strerror(errno)); - fclose(f); - goto out; + errh->error("%<%s%>: pipe: %s", cmdline.c_str(), strerror(errno)); + fclose(f); + goto out; } child = fork(); if (child == -1) - errh->error("%<%s%>: fork: %s", cmdline.c_str(), strerror(errno)); + errh->error("%<%s%>: fork: %s", cmdline.c_str(), strerror(errno)); else if (child == 0) { - close(0); - close(1); - close(pfd[0]); - dup2(fileno(f), 0); - dup2(pfd[1], 1); - close(fileno(f)); - close(pfd[1]); - - execl("/bin/sh", "sh", "-c", cmdline.c_str(), (char *) 0); - exit(127); + close(0); + close(1); + close(pfd[0]); + dup2(fileno(f), 0); + dup2(pfd[1], 1); + close(fileno(f)); + close(pfd[1]); + + execl("/bin/sh", "sh", "-c", cmdline.c_str(), (char *) 0); + exit(127); } close(pfd[1]); fclose(f); while (1) { - char *s = sa.reserve(4096); - if (!s) { - errh->error("%<%s%>: out of memory", cmdline.c_str()); - sa.clear(); - break; - } - ssize_t r = read(pfd[0], s, 4096); - if (r == 0 || (r == -1 && errno != EAGAIN && errno != EINTR)) { - if (r == -1) - errh->error("%<%s%>: %s", cmdline.c_str(), strerror(errno)); - break; - } else if (r != -1) - sa.adjust_length(r); + char *s = sa.reserve(4096); + if (!s) { + errh->error("%<%s%>: out of memory", cmdline.c_str()); + sa.clear(); + break; + } + ssize_t r = read(pfd[0], s, 4096); + if (r == 0 || (r == -1 && errno != EAGAIN && errno != EINTR)) { + if (r == -1) + errh->error("%<%s%>: %s", cmdline.c_str(), strerror(errno)); + break; + } else if (r != -1) + sa.adjust_length(r); } close(pfd[0]); diff --git a/test/flow/flowipnat-01.clicktest b/test/flow/flowipnat-01.clicktest index 2f4af392f18acb8faa3e7fff7707ca2571e17d13..d2f1bfea23001ecabc27709c885a15621f9acaa1 100644 --- a/test/flow/flowipnat-01.clicktest +++ b/test/flow/flowipnat-01.clicktest @@ -12,6 +12,9 @@ test ! $NODPDKTEST $VALGRIND click --dpdk --no-huge --no-pci -m 128MB -- CONFIG %file CONFIG + +DPDKInfo(4095) + FromIPSummaryDump(IN1, STOP true, CHECKSUM true) -> CheckIPHeader(VERBOSE true) -> CheckTCPHeader(VERBOSE true) diff --git a/test/threads/affinity-01.clicktest b/test/threads/affinity-01.clicktest index ee6165377ee03e6a786c6a23c05781a0ced2830a..64be90a458087c0a1419d1df1cb2c75586164924 100644 --- a/test/threads/affinity-01.clicktest +++ b/test/threads/affinity-01.clicktest @@ -11,31 +11,47 @@ taskset -c 1 sleep 0.2 >/dev/null 2>/dev/null & pid=$! sleep 0.1 [ $(taskset -p $pid | rev | cut -d' ' -f1) -eq 2 ] +command -v bc %script +start=`date +%s.%N` +click -e 'Script(wait 200ms, stop)' >/dev/null 2>/dev/null +end=`date +%s.%N` +st=$(echo "$end - $start" | bc) + #Affinity to core 0 click --affinity=0 -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null & pid=$! -sleep 0.2 +sleep $st taskset -p $pid | rev | cut -d' ' -f1 +wait #Affinity to core 1 click --affinity=1 -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null & pid=$! -sleep 0.2 +sleep $st taskset -p $pid | rev | cut -d' ' -f1 +wait -#No affinity -click --no-affinity -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null & -pid=$! -sleep 0.2 -[ "$(taskset -p $pid | rev | cut -d' ' -f1)" = "$(taskset -p 1 | rev | cut -d' ' -f1)" ] && echo "match" +if ! click-buildtool provides dpdk-packet ; then + #No affinity + click --no-affinity -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null & + pid=$! + sleep $st + [ "$(taskset -p $pid | rev | cut -d' ' -f1)" = "$(taskset -p 1 | rev | cut -d' ' -f1)" ] && echo "match" + wait -#Default is no affinity -click -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null & -pid=$! -sleep 0.2 -[ "$(taskset -p $pid | rev | cut -d' ' -f1)" = "$(taskset -p 1 | rev | cut -d' ' -f1)" ] && echo "match" + #Default is no affinity + click -e 'Script(wait 400ms,stop)' >/dev/null 2>/dev/null & + pid=$! + sleep $st + [ "$(taskset -p $pid | rev | cut -d' ' -f1)" = "$(taskset -p 1 | rev | cut -d' ' -f1)" ] && echo "match" + wait +else + #dpdk-packet will force DPDK initialization that always has affinity + echo "match" + echo "match" +fi %expect stdout 1 diff --git a/test/userlevel/dpdk.clicktest b/test/userlevel/dpdk.clicktest index d76a689840bc6f3a0078b1541ccd91cb8bd5830f..c9abc700a3b4f74a4caaf20a1ad96094535ab80d 100644 --- a/test/userlevel/dpdk.clicktest +++ b/test/userlevel/dpdk.clicktest @@ -7,7 +7,7 @@ test ! $TRAVIS test ! $NODPDKTEST %script -click --dpdk --no-huge -m 128MB -c 0x3 -n 1 --log-level=1 --vdev=eth_ring0 -- CONFIG +click --dpdk --no-pci --no-huge -m 128MB -c 0x3 -n 1 --log-level=1 --vdev=eth_ring0 -- CONFIG %file CONFIG DPDKInfo(2047) diff --git a/test/userlevel/timewarp-01.clicktest b/test/userlevel/timewarp-01.clicktest index 97d1bb8e1f91aae861d4115af849667945827eb4..a34359682b4a34d6becd9356cfd0573a53b4b1e1 100644 --- a/test/userlevel/timewarp-01.clicktest +++ b/test/userlevel/timewarp-01.clicktest @@ -2,6 +2,9 @@ Test timewarp functionality. +%require +click-provides !dpdk-packet #Dpdk-packet will force DPDK eal initialization, which slows down the initialization and breaks the test + %script now () { diff --git a/userlevel/click.cc b/userlevel/click.cc index 53be2a5a95ac66d7be97dbb685922a37baebd6d8..dd2bf181e36cf1771bc261aead9a4a3b0c25f997 100644 --- a/userlevel/click.cc +++ b/userlevel/click.cc @@ -430,7 +430,9 @@ main(int argc, char **argv) args.dpdk_arg.push_back((char*)(new String("--no-huge"))->c_str()); args.dpdk_arg.push_back((char*)(new String("-l"))->c_str()); char* s = (char*)malloc(14); - snprintf(s,14,"0-%d",click_nthreads - 1); + if (args.click_affinity_offset < 0) + args.click_affinity_offset = 0; + snprintf(s,14,"%d-%d", args.click_affinity_offset, args.click_affinity_offset + click_nthreads - 1); args.dpdk_arg.push_back(s); args.dpdk_arg.push_back((char*)(new String("-m"))->c_str());