Skip to content

Commit 914bec1

Browse files
hiroa-kidavem330
authored andcommitted
bql: Avoid possible inconsistent calculation.
dql->num_queued could change while processing dql_completed(). To provide consistent calculation, added an on stack variable. Signed-off-by: Hiroaki SHIMODA <[email protected]> Cc: Tom Herbert <[email protected]> Cc: Eric Dumazet <[email protected]> Cc: Denys Fedoryshchenko <[email protected]> Signed-off-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 25426b7 commit 914bec1

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

lib/dynamic_queue_limits.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,18 @@
1717
void dql_completed(struct dql *dql, unsigned int count)
1818
{
1919
unsigned int inprogress, prev_inprogress, limit;
20-
unsigned int ovlimit, completed;
20+
unsigned int ovlimit, completed, num_queued;
2121
bool all_prev_completed;
2222

23+
num_queued = ACCESS_ONCE(dql->num_queued);
24+
2325
/* Can't complete more than what's in queue */
24-
BUG_ON(count > dql->num_queued - dql->num_completed);
26+
BUG_ON(count > num_queued - dql->num_completed);
2527

2628
completed = dql->num_completed + count;
2729
limit = dql->limit;
28-
ovlimit = POSDIFF(dql->num_queued - dql->num_completed, limit);
29-
inprogress = dql->num_queued - completed;
30+
ovlimit = POSDIFF(num_queued - dql->num_completed, limit);
31+
inprogress = num_queued - completed;
3032
prev_inprogress = dql->prev_num_queued - dql->num_completed;
3133
all_prev_completed = AFTER_EQ(completed, dql->prev_num_queued);
3234

@@ -106,7 +108,7 @@ void dql_completed(struct dql *dql, unsigned int count)
106108
dql->prev_ovlimit = ovlimit;
107109
dql->prev_last_obj_cnt = dql->last_obj_cnt;
108110
dql->num_completed = completed;
109-
dql->prev_num_queued = dql->num_queued;
111+
dql->prev_num_queued = num_queued;
110112
}
111113
EXPORT_SYMBOL(dql_completed);
112114

0 commit comments

Comments
 (0)