diff options
Diffstat (limited to 'include/net/fq_impl.h')
| -rw-r--r-- | include/net/fq_impl.h | 9 | 
1 files changed, 6 insertions, 3 deletions
| diff --git a/include/net/fq_impl.h b/include/net/fq_impl.h index 4e6131cd3f43..ac1a2317941e 100644 --- a/include/net/fq_impl.h +++ b/include/net/fq_impl.h @@ -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); +		}  	}  } | 
