Hi Jarno, Thanks for figuring out this bug. I erroneously thought that since commit 623540e4617e (dpif-netdev: Streamline miss handling.) dpif_netdev_execute() could not be called anymore inside a dp_netdev_input() frame.
I added the exact match cache on the non pmd-thread path for two reasons: - Avoiding a branch on the fast path - Testing the exact match cache I thought about it a little and I do not think there¹s a way to avoid the branch now, so I¹m ok with the approach. I¹ve tested the DPDK throughput with the patch and it has not changed noticeably. One comment below: On 9/8/14, 10:07 AM, "Jarno Rajahalme" <jrajaha...@nicira.com> wrote: >dpif_netdev_execute may be called while doing upcall processing. >Since the context of the input port is not tracked upto this point, we >used the chared dp->emc_cache for packet execution. Execution needs >to be able to pass the cache to recirculation code. > >Typically the pmd threads use their own emc_cache, so there is little >value in using the shared emc_cache while processing recirculation >during packet execution. Also, whenever the shared emc_cache was >already used while doing the upcall, the emc_mutex is already held, >and would be locked recursively in dpif_netdev_execute(). Rather than >changing the mutex to a recursive type, it seems more proper to not >use any emc_cache in dpif_netdev_execute. > >Forthcoming new unit tests will fail with the current lock recursion. > >Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> >--- > lib/dpif-netdev.c | 42 ++++++++++++++++++------------------------ > 1 file changed, 18 insertions(+), 24 deletions(-) > >diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c >index 869fb55..846c329 100644 >--- a/lib/dpif-netdev.c >+++ b/lib/dpif-netdev.c (...) > > >@@ -2240,6 +2242,10 @@ emc_processing(struct dp_netdev *dp, struct >emc_cache *flow_cache, > size_t n_batches, i; > size_t notfound_cnt = 0; > >+ if (OVS_UNLIKELY(!flow_cache)) { >+ return cnt; >+ } >+ emc_processing() is also supposed to extract the miniflows of the packets. Returning at this point without extracting the miniflow causes undefined behavior. Daniele _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev