Hey Han, Again, thanks for your comments, ;D
On Tue, Feb 18, 2014 at 10:46 PM, Zhou, Han <hzh...@ebay.com> wrote: > > I think it is okay that we miss the upcalls for a short period. > > > > > > The way current ovs calls 'port_add()' is that ODPP_NONE is given for > > '*port_nop'. > > And the datapath will densely allocate the port number and notify it > > back to > > userspace. So, there is no way to specify channel in the same > > transaction in this > > case. Also, I don't want to separate socket creation from > > add_vport_channel(). > > > > > > OK, I see. But then the kernel code need to changed, because: > ovs_dp_process_received_packet() calls ovs_vport_find_pid(). When > upcall_pids are not set to datapath, ovs_vport_find_pid() returns 0 as a > nl pid: > if (!pids) > return 0; > > and then it invokes ovs_dp_upcall() still. I think we need error > handling here to drop packets in such race condition. > > Inside the current "ovs_dp_upcall()" we have the following code: 277<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l277>int ovs_dp_upcall(struct datapath *dp, struct sk_buff *skb, 278<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l278> const struct dp_upcall_info *upcall_info) 279<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l279>{ 280<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l280> struct dp_stats_percpu *stats; 281<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l281> int err; 282<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l282> 283<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l283> if (upcall_info->portid == 0) { 284<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l284> err = -ENOTCONN; 285<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l285> goto err; 286<http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob;f=datapath/datapath.c;h=a7839a128cae7a6d481fc2b426282b85d4d70ff2;hb=09350a3de320e83517c943858acc397db784d583#l286> } So, we have done that already. > > > > The logic of calling dpif_recv_set() here is somehow > > misleading. I > > understand that it is only for refreshing dpif->n_handlers, > > rather than > > enable/disable receiving. But would it be better to introduce > > a new > > interface in dpif to clearly update dpif->n_handler, which can > > be > > invoked in udpif_set_threads(). > > > > > > > > > > > > I'm okay with either. will ask around then update with you. > > > > May I add that there is one more benefit if invoking a new interface in > udpif_set_threads(): we can handle the update more gracefully in > udpif_set_threads() to minimize traffic interruption: > 1. destroy old threads > 2. update datapath pids via the new interface > 3. create new threads > > Best regards, > Han > I'll explain this in discussion, thanks,
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev