mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-22 12:14:01 +08:00
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: Toke Høiland-Jørgensen <toke@toke.dk> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
e5f5ce37a7
commit
0bfe649fbb
@ -146,6 +146,7 @@ static void fq_tin_enqueue(struct fq *fq,
|
||||
fq_flow_get_default_t get_default_func)
|
||||
{
|
||||
struct fq_flow *flow;
|
||||
bool oom;
|
||||
|
||||
lockdep_assert_held(&fq->lock);
|
||||
|
||||
@ -167,8 +168,8 @@ static void fq_tin_enqueue(struct fq *fq,
|
||||
}
|
||||
|
||||
__skb_queue_tail(&flow->queue, skb);
|
||||
|
||||
if (fq->backlog > fq->limit || fq->memory_usage > fq->memory_limit) {
|
||||
oom = (fq->memory_usage > fq->memory_limit);
|
||||
while (fq->backlog > fq->limit || oom) {
|
||||
flow = list_first_entry_or_null(&fq->backlogs,
|
||||
struct fq_flow,
|
||||
backlogchain);
|
||||
@ -183,8 +184,10 @@ static void fq_tin_enqueue(struct fq *fq,
|
||||
|
||||
flow->tin->overlimit++;
|
||||
fq->overlimit++;
|
||||
if (fq->memory_usage > fq->memory_limit)
|
||||
if (oom) {
|
||||
fq->overmemory++;
|
||||
oom = (fq->memory_usage > fq->memory_limit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user