2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-25 15:07:05 +00:00

dpif-linux: Only ask datapath to echo back results when they will be used.

A fair number of datapath flow operations optionally report back results
to the requester based on whether NLM_F_ECHO is set in the request.  When
userspace isn't going to use those results anyway, it wastes memory to
store them and a system call to retrieve them.

This commit omits the NLM_F_ECHO bit in cases where the caller isn't going
to use the results.

(NLM_F_ECHO has no effect on operations whose entire purpose is to retrieve
data, e.g. "get" and "dump" operations, so we need not bother to set it
for those.)

This improves "ovs-benchmark rate" results in my testing by about 4%.
This commit is contained in:
Ben Pfaff
2011-09-27 16:07:23 -07:00
parent b6848f1333
commit 30b44744a1

View File

@@ -123,7 +123,7 @@ static int dpif_linux_flow_from_ofpbuf(struct dpif_linux_flow *,
const struct ofpbuf *);
static void dpif_linux_flow_to_ofpbuf(const struct dpif_linux_flow *,
struct ofpbuf *);
static int dpif_linux_flow_transact(const struct dpif_linux_flow *request,
static int dpif_linux_flow_transact(struct dpif_linux_flow *request,
struct dpif_linux_flow *reply,
struct ofpbuf **bufp);
static void dpif_linux_flow_get_stats(const struct dpif_linux_flow *,
@@ -1642,7 +1642,7 @@ dpif_linux_flow_to_ofpbuf(const struct dpif_linux_flow *flow,
struct ovs_header *ovs_header;
nl_msg_put_genlmsghdr(buf, 0, ovs_flow_family,
NLM_F_REQUEST | NLM_F_ECHO | flow->nlmsg_flags,
NLM_F_REQUEST | flow->nlmsg_flags,
flow->cmd, 1);
ovs_header = ofpbuf_put_uninit(buf, sizeof *ovs_header);
@@ -1681,7 +1681,7 @@ dpif_linux_flow_init(struct dpif_linux_flow *flow)
* stored in '*reply' and '*bufp'. The caller must free '*bufp' when the reply
* is no longer needed ('reply' will contain pointers into '*bufp'). */
static int
dpif_linux_flow_transact(const struct dpif_linux_flow *request,
dpif_linux_flow_transact(struct dpif_linux_flow *request,
struct dpif_linux_flow *reply, struct ofpbuf **bufp)
{
struct ofpbuf *request_buf;
@@ -1689,6 +1689,10 @@ dpif_linux_flow_transact(const struct dpif_linux_flow *request,
assert((reply != NULL) == (bufp != NULL));
if (reply) {
request->nlmsg_flags |= NLM_F_ECHO;
}
request_buf = ofpbuf_new(1024);
dpif_linux_flow_to_ofpbuf(request, request_buf);
error = nl_sock_transact(genl_sock, request_buf, bufp);