> On Jun 3, 2014, at 6:22 PM, Ryan Wilson 76511 <wr...@vmware.com> wrote:
> 
> Sure, I combined them and sent out a new patch fixing all the bugs I
> encountered in the DPDK perf test.
> 
> http://patchwork.openvswitch.org/patch/4388/
> 
> 
> One issue is that since ofproto-dpif-upcall calls ofpbuf_uninit(), I had
> to free the DPDK buffer in that function as opposed to ofpbuf_delete().

ofpbuf_delete() is supposed to delete the ofpbuf itself, while ofpbuf_ininit() 
deletes any associated storage for an ofpbuf whose own memory is managed 
elsewhere (stack, some struct, etc).

Upcall handling will call uninit on a copy of the dpdk ofpbuf, not on the dpdk 
allocated buf itself, so the ofpbuf pointer given as a parameter to uninit 
remains valid even after the call.

> I'm not sure I entirely like that since we're freeing the header too,
> which goes directly against the philosophy of ofpbuf_uninit().
> 

As said above, you should be fine in this regard.

> One idea I had was to only allow ofpbuf_uninit to be called with
> OFPBUF_DPDK only if struct ofpbuf *b != ofpbuf_header(b) (meaning b is a
> copy of the header and thus we can free the original header). I figured
> I'd let you check out the patch and see if you had any other ideas.
> 

An assert to this effect would help detect/avoid bugs.

> Cheers,
> 
> Ryan
> 
>> On 6/3/14 5:22 PM, "Pravin Shelar" <pshe...@nicira.com> wrote:
>> 
>> Can you combine it with second patch, otherwise it introduces a bug.
>> 
>> On Tue, Jun 3, 2014 at 4:22 PM, Ryan Wilson 76511 <wr...@vmware.com>
>> wrote:
>>> 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.
>>>> 
>>>> https://urldefense.proofpoint.com/v1/url?u=http://patchwork.openvswitch.
>>>> org/patch/4375/&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=TfBS78Vw3dzttvXidh
>>>> bffg%3D%3D%0A&m=gZZtvgxp3GIUGlkz85Olmu3cqs62R0tf%2F4IxSAQLQ9Y%3D%0A&s=20
>>>> 9e52cdfc433e5fa4deb7ef48a561f78207981f0dabf4dd5ecb3257bde613e2
>>>> 
>>>> 
>>>> 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
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to