On Tue, Oct 07, 2014 at 12:23:37AM +1300, Joe Stringer wrote: > This patch modifies the dpif interface to allow flows to be manipulated > using a 128-bit identifier. This allows revalidator threads to perform > datapath operations faster, as they do not need to serialise the entire > flow key for operations like flow_get and flow_delete. In conjunction > with a future patch to simplify the dump interface, this provides a > significant performance benefit for revalidation. > > When handlers assemble flow_put operations, they specify a unique > identifier (UID) for each flow as it is passed down to the datapath to > be stored with the flow. The UID is currently provided to handlers > by the dpif during upcall processing. > > When revalidators assemble flow_get or flow_del operations, they specify > the UID for the flow along with the key, and a boolean for whether to > send the request using only a UID or to send the request using the UID > and flow key. The former is preferred for newer datapaths that support > UID, while the latter is used for backwards compatibility. > > Signed-off-by: Joe Stringer <joestrin...@nicira.com>
For whatever reason, the new struct odputil_uidbuf stuck out at me, so I spent a few minutes trying to figure out why it was needed. One use, as the new 'uid' member in struct ukey_op, doesn't appear to be used for anything. When the delete the member, the build still succeeds. The other use for this structure is in dpif-netlink.c. I find myself wondering whether it is valuable there either. It seems that in struct dpif_netlink_flow the main purpose of uid_buf is to make it possible to handle uids of types or sizes other than ovs_u128, but I am not sure that that is essential, especially since the dpif interface itself only supports ovs_u128. I think it might be more convenient to replace const struct nlattr *uid; /* OVS_FLOW_ATTR_UID. */ size_t uid_len; ... struct odputil_uidbuf uid_buf; /* Buffer to hold 'uid'. */ by something like: ovs_u128 uid; /* OVS_FLOW_ATTR_UID. */ bool uid_present; /* Is there a UID? */ The one case that this wouldn't handle neatly, I think, is the case where the kernel passes to userspace a UID of the wrong size, but I think for that we could just mark the uid as not present (and possibly log something). Actually odp_uid_from_nlattrs() looks pretty close to that anyhow. Acked-by: Ben Pfaff <b...@nicira.com> _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev