Commit 0bfe649f authored by Toke Høiland-Jørgensen's avatar Toke Høiland-Jørgensen Committed by Johannes Berg

fq_impl: Properly enforce memory limit

The fq structure would fail to properly enforce the memory limit in the case
where the packet being enqueued was bigger than the packet being removed to
bring the memory usage down. So keep dropping packets until the memory usage is
back below the limit. Also, fix the statistics for memory limit violations.
Signed-off-by: default avatarToke Høiland-Jørgensen <toke@toke.dk>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent e5f5ce37
...@@ -146,6 +146,7 @@ static void fq_tin_enqueue(struct fq *fq, ...@@ -146,6 +146,7 @@ static void fq_tin_enqueue(struct fq *fq,
fq_flow_get_default_t get_default_func) fq_flow_get_default_t get_default_func)
{ {
struct fq_flow *flow; struct fq_flow *flow;
bool oom;
lockdep_assert_held(&fq->lock); lockdep_assert_held(&fq->lock);
...@@ -167,8 +168,8 @@ static void fq_tin_enqueue(struct fq *fq, ...@@ -167,8 +168,8 @@ static void fq_tin_enqueue(struct fq *fq,
} }
__skb_queue_tail(&flow->queue, skb); __skb_queue_tail(&flow->queue, skb);
oom = (fq->memory_usage > fq->memory_limit);
if (fq->backlog > fq->limit || fq->memory_usage > fq->memory_limit) { while (fq->backlog > fq->limit || oom) {
flow = list_first_entry_or_null(&fq->backlogs, flow = list_first_entry_or_null(&fq->backlogs,
struct fq_flow, struct fq_flow,
backlogchain); backlogchain);
...@@ -183,8 +184,10 @@ static void fq_tin_enqueue(struct fq *fq, ...@@ -183,8 +184,10 @@ static void fq_tin_enqueue(struct fq *fq,
flow->tin->overlimit++; flow->tin->overlimit++;
fq->overlimit++; fq->overlimit++;
if (fq->memory_usage > fq->memory_limit) if (oom) {
fq->overmemory++; fq->overmemory++;
oom = (fq->memory_usage > fq->memory_limit);
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment