I've ran into some unexpected issues while perf testing this, lets hold off on looking at this. I'll submit another patch when I've had all the kinks worked out.
Ryan On 6/3/14 2:21 PM, "Ryan Wilson 76511" <wr...@vmware.com> wrote: >Hey Pravin, > >Thanks for the catch here! Turns out the header is already tracked in DPDK >with rte_mbuf's buffer address - sizeof(ofpbuf). Thus, I submitted another >patch that, in free_dpdk_buf(), always gets this header and uses this to >free memory. > >http://patchwork.openvswitch.org/patch/4375/ > > >Let me know if this patch works. > >Cheers, > >Ryan > >On 6/3/14 10:50 AM, "Pravin Shelar" <pshe...@nicira.com> wrote: > >>On Tue, Jun 3, 2014 at 10:33 AM, Ryan Wilson <wr...@nicira.com> wrote: >>> When a bridge of datatype type netdev receives a packet, it copies the >>> packet from the NIC to a buffer in userspace. Currently, when making >>> an upcall, the packet is again copied to the upcall's buffer. However, >>> this extra copy is not necessary when the datapath exists in userspace >>> as the upcall can directly access the packet data. >>> >>> This patch eliminates this extra copy of the packet data in most cases. >>> In cases where the packet may still be used later by callers of >>> dp_netdev_execute_actions, making a copy of the packet data is still >>> necessary. >>> >>> Signed-off-by: Ryan Wilson <wr...@nicira.com> >>> --- >>> v2: Addressed Jarno's comment to use direct pointer assignment for >>> upcall->packet instead of ofpbuf_set(). >>> --- >>> lib/dpif-netdev.c | 15 +++++---------- >>> 1 file changed, 5 insertions(+), 10 deletions(-) >>> >>> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c >>> index 91c83d6..c89ae20 100644 >>> --- a/lib/dpif-netdev.c >>> +++ b/lib/dpif-netdev.c >>> @@ -2024,7 +2024,6 @@ dp_netdev_input(struct dp_netdev *dp, struct >>>ofpbuf *packet, >>> miniflow_hash_5tuple(&key.flow, 0) >>> % dp->n_handlers, >>> DPIF_UC_MISS, &key.flow, NULL); >>> - ofpbuf_delete(packet); >>> } >>> } >>> >>> @@ -2063,7 +2062,6 @@ dp_netdev_output_userspace(struct dp_netdev *dp, >>>struct ofpbuf *packet, >>> if (userdata) { >>> buf_size += NLA_ALIGN(userdata->nla_len); >>> } >>> - buf_size += ofpbuf_size(packet); >>> ofpbuf_init(buf, buf_size); >>> >>> /* Put ODP flow. */ >>> @@ -2078,15 +2076,14 @@ dp_netdev_output_userspace(struct dp_netdev >>>*dp, struct ofpbuf *packet, >>> >>>NLA_ALIGN(userdata->nla_len)); >>> } >>> >>> - ofpbuf_set_data(&upcall->packet, >>> - ofpbuf_put(buf, ofpbuf_data(packet), >>>ofpbuf_size(packet))); >>> - ofpbuf_set_size(&upcall->packet, ofpbuf_size(packet)); >>> + upcall->packet = *packet; >>> >> >>This would not work with DPDK. ofpbuf from dpdk is special case where >>ofpbuf and data are allocated from same memory object. Therefore >>moving ofpbuf->data is nontrivial. >> >>To make it work we need atleast following covered. >>1. Define flag for source of ofpbuf header. So that we can track >>header and data independently. >>2. Fix dpdk ofpbuf destructor to free correct dpdk memory object. >> >>Thanks, >>Pravin. > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev