[ovs-dev] [batch 3/5] dpif-netdev: Take the classifier rdlock once per batch.
Ethan Jackson
ethan at nicira.com
Mon Jun 30 04:24:28 UTC 2014
Signed-off-by: Ethan Jackson <ethan at nicira.com>
---
lib/dpif-netdev.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index aa9a685..9242356 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1072,15 +1072,13 @@ dp_netdev_flow_cast(const struct cls_rule *cr)
static struct dp_netdev_flow *
dp_netdev_lookup_flow(const struct dp_netdev *dp, const struct miniflow *key)
- OVS_EXCLUDED(dp->cls.rwlock)
+ OVS_REQ_RDLOCK(dp->cls.rwlock)
{
struct dp_netdev_flow *netdev_flow;
struct cls_rule *rule;
- fat_rwlock_rdlock(&dp->cls.rwlock);
rule = classifier_lookup_miniflow_first(&dp->cls, key);
netdev_flow = dp_netdev_flow_cast(rule);
- fat_rwlock_unlock(&dp->cls.rwlock);
return netdev_flow;
}
@@ -1319,7 +1317,9 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
miniflow_init(&miniflow, &flow);
ovs_mutex_lock(&dp->flow_mutex);
+ fat_rwlock_rdlock(&dp->cls.rwlock);
netdev_flow = dp_netdev_lookup_flow(dp, &miniflow);
+ fat_rwlock_unlock(&dp->cls.rwlock);
if (!netdev_flow) {
if (put->flags & DPIF_FP_CREATE) {
if (hmap_count(&dp->flow_table) < MAX_FLOWS) {
@@ -2070,6 +2070,7 @@ dp_netdev_input(struct dp_netdev *dp, struct dpif_packet **packets, int cnt,
miniflow_initialize(&key.flow, key.buf);
+ fat_rwlock_rdlock(&dp->cls.rwlock);
for (i = 0; i < cnt; i++) {
struct dp_netdev_flow *netdev_flow;
struct ofpbuf *buf = &packets[i]->ofpbuf;
@@ -2102,6 +2103,7 @@ dp_netdev_input(struct dp_netdev *dp, struct dpif_packet **packets, int cnt,
DPIF_UC_MISS, &key.flow, NULL);
}
}
+ fat_rwlock_unlock(&dp->cls.rwlock);
if (batch.flow) {
packet_batch_execute(&batch, dp);
--
1.8.1.2
More information about the dev
mailing list