Hi Alex, On Tue, 2014-02-18 at 10:26 -0800, Alex Wang wrote: > Thanks a lot Han for the close review ;D
My pleasure :) > > In this function, you separated vport transaction for creating > vports > and setting channel pids to kernel. But it could lead to > problem when > kernel started sending upcalls to user space when vports are > added but > channel pids not updated. I think it should still be kept as a > single > transaction to avoid race condition. > > > > > > 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. > > 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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev