Fix preemptible warning in aggsum_add()

In the new aggsum counters the CPU_SEQID macro should be surrounded by
kpreempt_disable)() and kpreempt_enable() calls to prevent a Linux
kernel BUG warning.  The addsum_add() function use the cpuid to
minimize lock contention when selecting a bucket, after selection
the bucket is protected by a mutex and it is safe to reschedule the
process to a different processor at any time.

Reviewed-by: Matthew Thode <prometheanfire@gentoo.org>
Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #7609
Closes #7610
This commit is contained in:
Brian Behlendorf 2018-06-07 15:55:11 -07:00 committed by GitHub
parent 39042f9736
commit 174bcd581d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -183,8 +183,11 @@ aggsum_borrow(aggsum_t *as, int64_t delta, struct aggsum_bucket *asb)
void void
aggsum_add(aggsum_t *as, int64_t delta) aggsum_add(aggsum_t *as, int64_t delta)
{ {
struct aggsum_bucket *asb = struct aggsum_bucket *asb;
&as->as_buckets[CPU_SEQID % as->as_numbuckets];
kpreempt_disable();
asb = &as->as_buckets[CPU_SEQID % as->as_numbuckets];
kpreempt_enable();
for (;;) { for (;;) {
mutex_enter(&asb->asc_lock); mutex_enter(&asb->asc_lock);