[ovs-dev] [PATCH v2 1/2] dpif: Add max flows field to flow dump threads struct.
Ryan Wilson
wryan at nicira.com
Fri Jun 20 01:09:46 UTC 2014
This is needed to add flow dump batching to dpif-netdev, specifically
for malloc-ing 'max_flows' key and mask buffers.
Signed-off-by: Ryan Wilson <wryan at nicira.com>
---
v2: Addressed Joe's comments, split into 2 patches
---
lib/dpif-linux.c | 4 ++--
lib/dpif-netdev.c | 4 ++--
lib/dpif-provider.h | 7 +++++--
lib/dpif.c | 7 ++++---
lib/dpif.h | 2 +-
ofproto/ofproto-dpif-upcall.c | 3 ++-
ofproto/ofproto-dpif.c | 2 +-
utilities/ovs-dpctl.c | 2 +-
8 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index afe9340..e0e4293 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -1203,13 +1203,13 @@ dpif_linux_flow_dump_thread_cast(struct dpif_flow_dump_thread *thread)
}
static struct dpif_flow_dump_thread *
-dpif_linux_flow_dump_thread_create(struct dpif_flow_dump *dump_)
+dpif_linux_flow_dump_thread_create(struct dpif_flow_dump *dump_, int max_flows)
{
struct dpif_linux_flow_dump *dump = dpif_linux_flow_dump_cast(dump_);
struct dpif_linux_flow_dump_thread *thread;
thread = xmalloc(sizeof *thread);
- dpif_flow_dump_thread_init(&thread->up, &dump->up);
+ dpif_flow_dump_thread_init(&thread->up, &dump->up, max_flows);
thread->dump = dump;
ofpbuf_init(&thread->nl_flows, NL_DUMP_BUFSIZE);
thread->nl_actions = NULL;
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 6c281fe..805af9a 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1434,13 +1434,13 @@ dpif_netdev_flow_dump_thread_cast(struct dpif_flow_dump_thread *thread)
}
static struct dpif_flow_dump_thread *
-dpif_netdev_flow_dump_thread_create(struct dpif_flow_dump *dump_)
+dpif_netdev_flow_dump_thread_create(struct dpif_flow_dump *dump_, int max_flows)
{
struct dpif_netdev_flow_dump *dump = dpif_netdev_flow_dump_cast(dump_);
struct dpif_netdev_flow_dump_thread *thread;
thread = xmalloc(sizeof *thread);
- dpif_flow_dump_thread_init(&thread->up, &dump->up);
+ dpif_flow_dump_thread_init(&thread->up, &dump->up, max_flows);
thread->dump = dump;
return &thread->up;
}
diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h
index b762ac0..70d1ea2 100644
--- a/lib/dpif-provider.h
+++ b/lib/dpif-provider.h
@@ -63,13 +63,16 @@ dpif_flow_dump_init(struct dpif_flow_dump *dump, const struct dpif *dpif)
struct dpif_flow_dump_thread {
struct dpif *dpif;
+ int max_flows;
};
static inline void
dpif_flow_dump_thread_init(struct dpif_flow_dump_thread *thread,
- struct dpif_flow_dump *dump)
+ struct dpif_flow_dump *dump,
+ int max_flows)
{
thread->dpif = dump->dpif;
+ thread->max_flows = max_flows;
}
/* Datapath interface class structure, to be defined by each implementation of
@@ -312,7 +315,7 @@ struct dpif_class {
int (*flow_dump_destroy)(struct dpif_flow_dump *dump);
struct dpif_flow_dump_thread *(*flow_dump_thread_create)(
- struct dpif_flow_dump *dump);
+ struct dpif_flow_dump *dump, int max_flows);
void (*flow_dump_thread_destroy)(struct dpif_flow_dump_thread *thread);
int (*flow_dump_next)(struct dpif_flow_dump_thread *thread,
diff --git a/lib/dpif.c b/lib/dpif.c
index cace47b..3349933 100644
--- a/lib/dpif.c
+++ b/lib/dpif.c
@@ -1000,9 +1000,10 @@ dpif_flow_dump_destroy(struct dpif_flow_dump *dump)
/* Returns new thread-local state for use with dpif_flow_dump_next(). */
struct dpif_flow_dump_thread *
-dpif_flow_dump_thread_create(struct dpif_flow_dump *dump)
+dpif_flow_dump_thread_create(struct dpif_flow_dump *dump, int max_flows)
{
- return dump->dpif->dpif_class->flow_dump_thread_create(dump);
+ ovs_assert(max_flows > 0);
+ return dump->dpif->dpif_class->flow_dump_thread_create(dump, max_flows);
}
/* Releases 'thread'. */
@@ -1036,7 +1037,7 @@ dpif_flow_dump_next(struct dpif_flow_dump_thread *thread,
struct dpif *dpif = thread->dpif;
int n;
- ovs_assert(max_flows > 0);
+ ovs_assert(max_flows <= thread->max_flows);
n = dpif->dpif_class->flow_dump_next(thread, flows, max_flows);
if (n > 0) {
struct dpif_flow *f;
diff --git a/lib/dpif.h b/lib/dpif.h
index f080cde..5c060e4 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -558,7 +558,7 @@ struct dpif_flow_dump *dpif_flow_dump_create(const struct dpif *);
int dpif_flow_dump_destroy(struct dpif_flow_dump *);
struct dpif_flow_dump_thread *dpif_flow_dump_thread_create(
- struct dpif_flow_dump *);
+ struct dpif_flow_dump *, int max_flows);
void dpif_flow_dump_thread_destroy(struct dpif_flow_dump_thread *);
/* A datapath flow as dumped by dpif_flow_dump_next(). */
diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index b38f226..b12d43d 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -1332,7 +1332,8 @@ revalidate(struct revalidator *revalidator)
dump_seq = seq_read(udpif->dump_seq);
atomic_read(&udpif->flow_limit, &flow_limit);
- dump_thread = dpif_flow_dump_thread_create(udpif->dump);
+ dump_thread = dpif_flow_dump_thread_create(udpif->dump,
+ REVALIDATE_MAX_BATCH);
for (;;) {
struct dump_op ops[REVALIDATE_MAX_BATCH];
int n_ops = 0;
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 9e4a455..965342a 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -4486,7 +4486,7 @@ ofproto_unixctl_dpif_dump_flows(struct unixctl_conn *conn,
ds_init(&ds);
flow_dump = dpif_flow_dump_create(ofproto->backer->dpif);
- flow_dump_thread = dpif_flow_dump_thread_create(flow_dump);
+ flow_dump_thread = dpif_flow_dump_thread_create(flow_dump, 1);
while (dpif_flow_dump_next(flow_dump_thread, &f, 1)) {
if (!ofproto_dpif_contains_flow(ofproto, f.key, f.key_len)) {
continue;
diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c
index 62fc1dd..2f0cdb1 100644
--- a/utilities/ovs-dpctl.c
+++ b/utilities/ovs-dpctl.c
@@ -792,7 +792,7 @@ dpctl_dump_flows(int argc, char *argv[])
ds_init(&ds);
flow_dump = dpif_flow_dump_create(dpif);
- flow_dump_thread = dpif_flow_dump_thread_create(flow_dump);
+ flow_dump_thread = dpif_flow_dump_thread_create(flow_dump, 1);
while (dpif_flow_dump_next(flow_dump_thread, &f, 1)) {
if (filter) {
struct flow flow;
--
1.7.9.5
More information about the dev
mailing list