diff --git a/src/vnsw/agent/oper/agent_profile.cc b/src/vnsw/agent/oper/agent_profile.cc index 1df182b8467..60958f2bf48 100644 --- a/src/vnsw/agent/oper/agent_profile.cc +++ b/src/vnsw/agent/oper/agent_profile.cc @@ -154,8 +154,8 @@ void ProfileData::FlowStats::Reset() { for (uint16_t i = 0; i < flow_event_queue_.size(); i++) { flow_event_queue_[i].Reset(); } - for (uint16_t i = 0; i < flow_misc_event_queue_.size(); i++) { - flow_misc_event_queue_[i].Reset(); + for (uint16_t i = 0; i < flow_tokenless_queue_.size(); i++) { + flow_tokenless_queue_[i].Reset(); } for (uint16_t i = 0; i < flow_delete_queue_.size(); i++) { flow_delete_queue_[i].Reset(); @@ -483,15 +483,15 @@ static void GetQueueSummaryInfo(SandeshFlowQueueSummaryInfo *info, int index, one.set_busy_msec(busy_time); info->set_flow_event_queue(one); - // flow_misc_event_queue + // flow_tokenless_queue qcount = 0; enqueues = 0; dequeues = 0; max_qlen = 0; busy_time = 0; starts = 0; - it = flow_stats->flow_misc_event_queue_.begin(); - while (it != flow_stats->flow_misc_event_queue_.end()) { + it = flow_stats->flow_tokenless_queue_.begin(); + while (it != flow_stats->flow_tokenless_queue_.end()) { qcount += it->queue_count_; enqueues += it->enqueue_count_; dequeues += it->dequeue_count_; @@ -508,7 +508,7 @@ static void GetQueueSummaryInfo(SandeshFlowQueueSummaryInfo *info, int index, one.set_max_qlen(max_qlen); one.set_starts(starts); one.set_busy_msec(busy_time); - info->set_flow_misc_event_queue(one); + info->set_flow_tokenless_queue(one); // flow_delete_queue qcount = 0; diff --git a/src/vnsw/agent/oper/agent_profile.h b/src/vnsw/agent/oper/agent_profile.h index d0f07d3f5ae..56b3de3bee4 100644 --- a/src/vnsw/agent/oper/agent_profile.h +++ b/src/vnsw/agent/oper/agent_profile.h @@ -65,7 +65,7 @@ class ProfileData { WorkQueueStats flow_mgmt_queue_; WorkQueueStats flow_update_queue_; std::vector flow_event_queue_; - std::vector flow_misc_event_queue_; + std::vector flow_tokenless_queue_; std::vector flow_delete_queue_; std::vector flow_ksync_queue_; std::vector flow_stats_queue_; diff --git a/src/vnsw/agent/oper/agent_profile.sandesh b/src/vnsw/agent/oper/agent_profile.sandesh index 91c8e5d4bae..00d365034a0 100644 --- a/src/vnsw/agent/oper/agent_profile.sandesh +++ b/src/vnsw/agent/oper/agent_profile.sandesh @@ -108,7 +108,7 @@ struct SandeshFlowQueueSummaryInfo { 2: string time_str; 3: SandeshFlowTokenInfo token_stats; 4: SandeshFlowQueueSummaryOneInfo flow_event_queue; - 5: SandeshFlowQueueSummaryOneInfo flow_misc_event_queue; + 5: SandeshFlowQueueSummaryOneInfo flow_tokenless_queue; 6: SandeshFlowQueueSummaryOneInfo flow_ksync_queue; 7: SandeshFlowQueueSummaryOneInfo flow_delete_queue; 8: SandeshFlowQueueSummaryOneInfo flow_update_queue; diff --git a/src/vnsw/agent/pkt/flow_proto.cc b/src/vnsw/agent/pkt/flow_proto.cc index a9788fb7024..5ef57e86cc9 100644 --- a/src/vnsw/agent/pkt/flow_proto.cc +++ b/src/vnsw/agent/pkt/flow_proto.cc @@ -42,7 +42,7 @@ FlowProto::FlowProto(Agent *agent, boost::asio::io_service &io) : (new FlowEventQueue(agent, this, flow_table_list_[i], &add_tokens_, latency, 16)); - flow_misc_event_queue_.push_back + flow_tokenless_queue_.push_back (new FlowEventQueue(agent, this, flow_table_list_[i], NULL, latency, 16)); @@ -65,7 +65,7 @@ FlowProto::FlowProto(Agent *agent, boost::asio::io_service &io) : FlowProto::~FlowProto() { STLDeleteValues(&flow_event_queue_); - STLDeleteValues(&flow_misc_event_queue_); + STLDeleteValues(&flow_tokenless_queue_); STLDeleteValues(&flow_delete_queue_); STLDeleteValues(&flow_ksync_queue_); STLDeleteValues(&flow_table_list_); @@ -98,7 +98,7 @@ void FlowProto::Shutdown() { } for (uint32_t i = 0; i < flow_event_queue_.size(); i++) { flow_event_queue_[i]->Shutdown(); - flow_misc_event_queue_[i]->Shutdown(); + flow_tokenless_queue_[i]->Shutdown(); flow_delete_queue_[i]->Shutdown(); flow_ksync_queue_[i]->Shutdown(); } @@ -223,6 +223,7 @@ bool FlowProto::Enqueue(PktInfoPtr msg) { void FlowProto::DisableFlowEventQueue(uint32_t index, bool disabled) { flow_event_queue_[index]->set_disable(disabled); + flow_tokenless_queue_[index]->set_disable(disabled); flow_delete_queue_[index]->set_disable(disabled); } @@ -301,12 +302,18 @@ void FlowProto::EnqueueFlowEvent(FlowEvent *event) { break; } - case FlowEvent::FLOW_MESSAGE: + case FlowEvent::FLOW_MESSAGE: { + FlowEntry *flow = event->flow(); + FlowTable *table = flow->flow_table(); + queue = flow_event_queue_[table->table_index()]; + break; + } + case FlowEvent::EVICT_FLOW: case FlowEvent::FREE_FLOW_REF: { FlowEntry *flow = event->flow(); FlowTable *table = flow->flow_table(); - queue = flow_event_queue_[table->table_index()]; + queue = flow_tokenless_queue_[table->table_index()]; break; } @@ -318,23 +325,25 @@ void FlowProto::EnqueueFlowEvent(FlowEvent *event) { } case FlowEvent::GROW_FREE_LIST: { - FlowTable *table = GetTable(event->table_index()); - queue = flow_event_queue_[table->table_index()]; + queue = flow_tokenless_queue_[event->table_index()]; break; } case FlowEvent::KSYNC_EVENT: { FlowEventKSync *ksync_event = static_cast(event); - FlowTableKSyncObject *ksync_obj = static_cast - (ksync_event->ksync_entry()->GetObject()); - FlowTable *table = ksync_obj->flow_table(); - queue = flow_ksync_queue_[table->table_index()]; + FlowTableKSyncEntry *ksync_entry = + (static_cast (ksync_event->ksync_entry())); + FlowEntry *flow = ksync_entry->flow_entry().get(); + FlowTable *table = flow->flow_table(); + if (flow->flow_handle() == FlowEntry::kInvalidFlowHandle) + queue = flow_ksync_queue_[table->table_index()]; + else + queue = flow_tokenless_queue_[table->table_index()]; break; } case FlowEvent::REENTRANT: { - uint32_t index = event->table_index(); - queue = flow_event_queue_[index]; + queue = flow_event_queue_[event->table_index()]; break; } @@ -344,7 +353,11 @@ void FlowProto::EnqueueFlowEvent(FlowEvent *event) { break; } - case FlowEvent::FREE_DBENTRY: + case FlowEvent::FREE_DBENTRY: { + queue = flow_tokenless_queue_[0]; + break; + } + case FlowEvent::DELETE_DBENTRY: case FlowEvent::RECOMPUTE_FLOW: case FlowEvent::REVALUATE_DBENTRY: { @@ -433,6 +446,16 @@ bool FlowProto::FlowEventHandler(FlowEvent *req, FlowTable *table) { break; } + case FlowEvent::KSYNC_EVENT: { + return FlowKSyncMsgHandler(req, table); + } + + case FlowEvent::FREE_DBENTRY: { + FlowMgmtManager *mgr = agent()->pkt()->flow_mgmt_manager(); + mgr->flow_mgmt_dbclient()->FreeDBState(req->db_entry(), req->gen_id()); + break; + } + default: { assert(0); break; @@ -471,12 +494,6 @@ bool FlowProto::FlowKSyncMsgHandler(FlowEvent *req, FlowTable *table) { bool FlowProto::FlowUpdateHandler(FlowEvent *req) { switch (req->event()) { - case FlowEvent::FREE_DBENTRY: { - FlowMgmtManager *mgr = agent()->pkt()->flow_mgmt_manager(); - mgr->flow_mgmt_dbclient()->FreeDBState(req->db_entry(), req->gen_id()); - break; - } - case FlowEvent::DELETE_DBENTRY: case FlowEvent::REVALUATE_DBENTRY: { FlowEntry *flow = req->flow(); @@ -799,15 +816,15 @@ void FlowProto::SetProfileData(ProfileData *data) { data->flow_.flow_event_queue_.resize(flow_table_list_.size()); data->flow_.flow_delete_queue_.resize(flow_table_list_.size()); - data->flow_.flow_misc_event_queue_.resize(flow_table_list_.size()); + data->flow_.flow_tokenless_queue_.resize(flow_table_list_.size()); data->flow_.flow_ksync_queue_.resize(flow_table_list_.size()); for (uint16_t i = 0; i < flow_table_list_.size(); i++) { SetFlowEventQueueStats(agent(), flow_event_queue_[i]->queue(), &data->flow_.flow_event_queue_[i]); SetFlowEventQueueStats(agent(), flow_delete_queue_[i]->queue(), &data->flow_.flow_delete_queue_[i]); - SetFlowEventQueueStats(agent(), flow_misc_event_queue_[i]->queue(), - &data->flow_.flow_misc_event_queue_[i]); + SetFlowEventQueueStats(agent(), flow_tokenless_queue_[i]->queue(), + &data->flow_.flow_tokenless_queue_[i]); SetFlowEventQueueStats(agent(), flow_ksync_queue_[i]->queue(), &data->flow_.flow_ksync_queue_[i]); } diff --git a/src/vnsw/agent/pkt/flow_proto.h b/src/vnsw/agent/pkt/flow_proto.h index a1a4244bb75..a3a83de4f4b 100644 --- a/src/vnsw/agent/pkt/flow_proto.h +++ b/src/vnsw/agent/pkt/flow_proto.h @@ -133,7 +133,7 @@ class FlowProto : public Proto { FlowTokenPool del_tokens_; FlowTokenPool update_tokens_; std::vector flow_event_queue_; - std::vector flow_misc_event_queue_; + std::vector flow_tokenless_queue_; std::vector flow_delete_queue_; std::vector flow_ksync_queue_; std::vector flow_table_list_; diff --git a/src/vnsw/agent/pkt/flow_table.cc b/src/vnsw/agent/pkt/flow_table.cc index 0eff9952a52..99583732a3b 100644 --- a/src/vnsw/agent/pkt/flow_table.cc +++ b/src/vnsw/agent/pkt/flow_table.cc @@ -534,10 +534,10 @@ void FlowTable::EvictFlow(FlowEntry *flow, FlowEntry *reverse_flow, DeleteUnLocked(false, flow, NULL); // Reverse flow unlinked with forward flow. Make it short-flow - if (reverse_flow && reverse_flow->deleted() == false) { + // Dont update ksync, it will shortly get either evicted or deleted by + // ageing process + if (reverse_flow) reverse_flow->MakeShortFlow(FlowEntry::SHORT_NO_REVERSE_FLOW); - UpdateKSync(reverse_flow, true); - } } void FlowTable::HandleRevaluateDBEntry(const DBEntry *entry, FlowEntry *flow,