[ovs-dev] [PATCHv4 6/7] dpif: New function flow_dump_next_may_destroy_keys().
Joe Stringer
joestringer at nicira.com
Thu Feb 27 22:13:10 UTC 2014
This new function allows callers to determine whether previously
returned keys will be modified or reallocated on the next call to
dpif_flow_dump_next(). This will be used in a future commit to allow
batched flow deletion by revalidator threads.
Signed-off-by: Joe Stringer <joestringer at nicira.com>
---
v3: Readded patch, renamed function and made it more specific to flow keys.
v2: Removed patch.
---
lib/dpif-linux.c | 9 +++++++++
lib/dpif-netdev.c | 1 +
lib/dpif-provider.h | 13 +++++++++++++
lib/dpif.c | 21 +++++++++++++++++++++
lib/dpif.h | 2 ++
5 files changed, 46 insertions(+)
diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index 3ee9bbd..1dd0794 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -1104,6 +1104,14 @@ dpif_linux_flow_dump_next(const struct dpif *dpif_, void *iter_, void *state_,
return error;
}
+static bool
+dpif_linux_flow_dump_next_may_destroy_keys(void *state_)
+{
+ struct dpif_linux_flow_state *state = state_;
+
+ return state->buffer.size ? false : true;
+}
+
static int
dpif_linux_flow_dump_done(const struct dpif *dpif OVS_UNUSED, void *iter_)
{
@@ -1669,6 +1677,7 @@ const struct dpif_class dpif_linux_class = {
dpif_linux_flow_dump_state_init,
dpif_linux_flow_dump_start,
dpif_linux_flow_dump_next,
+ dpif_linux_flow_dump_next_may_destroy_keys,
dpif_linux_flow_dump_done,
dpif_linux_flow_dump_state_uninit,
dpif_linux_execute,
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index de08c42..d17fa05 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1892,6 +1892,7 @@ const struct dpif_class dpif_netdev_class = {
dpif_netdev_flow_dump_state_init,
dpif_netdev_flow_dump_start,
dpif_netdev_flow_dump_next,
+ NULL,
dpif_netdev_flow_dump_done,
dpif_netdev_flow_dump_state_uninit,
dpif_netdev_execute,
diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h
index c85de5f..dd4f74e 100644
--- a/lib/dpif-provider.h
+++ b/lib/dpif-provider.h
@@ -312,6 +312,19 @@ struct dpif_class {
const struct nlattr **actions, size_t *actions_len,
const struct dpif_flow_stats **stats);
+ /* Determines whether the next call to 'flow_dump_next' with 'state' will
+ * modify or free the keys that it previously returned. 'state' must have
+ * been initialized by a call to 'flow_dump_state_init' for 'dpif'.
+ *
+ * 'dpif' guarantees that data returned by flow_dump_next() will remain
+ * accessible and unchanging until the next call. This function provides a
+ * way for callers to determine whether that guarantee extends beyond the
+ * next call.
+ *
+ * Returns true if the next call to flow_dump_next() is expected to be
+ * destructive to previously returned keys for 'state', false otherwise. */
+ bool (*flow_dump_next_may_destroy_keys)(void *state);
+
/* Releases resources from 'dpif' for 'iter', which was initialized by a
* successful call to the 'flow_dump_start' function for 'dpif'. Callers
* must ensure that this function is called once within a given iteration,
diff --git a/lib/dpif.c b/lib/dpif.c
index 117d720..8cb2145 100644
--- a/lib/dpif.c
+++ b/lib/dpif.c
@@ -1056,6 +1056,27 @@ dpif_flow_dump_next(struct dpif_flow_dump *dump, void *state,
return !error;
}
+/* Determines whether the next call to 'dpif_flow_dump_next' for 'dump' and
+ * 'state' will modify or free the keys that it previously returned. 'state'
+ * must have been initialized by a call to 'dpif_flow_dump_state_init' for
+ * 'dump'.
+ *
+ * 'dpif' guarantees that data returned by flow_dump_next() will remain
+ * accessible and unchanging until the next call. This function provides a way
+ * for callers to determine whether that guarantee extends beyond the next
+ * call.
+ *
+ * Returns true if the next call to flow_dump_next() is expected to be
+ * destructive to previously returned keys for 'state', false otherwise. */
+bool
+dpif_flow_dump_next_may_destroy_keys(struct dpif_flow_dump *dump, void *state)
+{
+ const struct dpif *dpif = dump->dpif;
+ return (dpif->dpif_class->flow_dump_next_may_destroy_keys
+ ? dpif->dpif_class->flow_dump_next_may_destroy_keys(state)
+ : true);
+}
+
/* Completes flow table dump operation 'dump', which must have been initialized
* with a successful call to dpif_flow_dump_start(). Returns 0 if the dump
* operation was error-free, otherwise a positive errno value describing the
diff --git a/lib/dpif.h b/lib/dpif.h
index 0c763dc..4e24416 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -523,6 +523,8 @@ bool dpif_flow_dump_next(struct dpif_flow_dump *, void *state,
const struct nlattr **mask, size_t *mask_len,
const struct nlattr **actions, size_t *actions_len,
const struct dpif_flow_stats **);
+bool dpif_flow_dump_next_may_destroy_keys(struct dpif_flow_dump *dump,
+ void *state);
int dpif_flow_dump_done(struct dpif_flow_dump *);
void dpif_flow_dump_state_uninit(const struct dpif *, void *state);
--
1.7.9.5
More information about the dev
mailing list