Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit be512691 authored by NeilBrown's avatar NeilBrown
Browse files

md: bitmap: improve bitmap maintenance code.



The code for checking which bits in the bitmap can be cleared
has 2 problems:
 1/ it repeatedly takes and drops a spinlock, where it would make
    more sense to just hold on to it most of the time.
 2/ it doesn't make use of some opportunities to skip large sections
    of the bitmap

This patch fixes those.  It will only affect CPU consumption, not
correctness.

Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 2b69c839
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -1097,14 +1097,12 @@ void bitmap_daemon_work(struct bitmap *bitmap)
	}
	bitmap->allclean = 1;

	spin_lock_irqsave(&bitmap->lock, flags);
	for (j = 0; j < bitmap->chunks; j++) {
		bitmap_counter_t *bmc;
		spin_lock_irqsave(&bitmap->lock, flags);
		if (!bitmap->filemap) {
		if (!bitmap->filemap)
			/* error or shutdown */
			spin_unlock_irqrestore(&bitmap->lock, flags);
			break;
		}

		page = filemap_get_page(bitmap, j);

@@ -1121,6 +1119,8 @@ void bitmap_daemon_work(struct bitmap *bitmap)
					write_page(bitmap, page, 0);
					bitmap->allclean = 0;
				}
				spin_lock_irqsave(&bitmap->lock, flags);
				j |= (PAGE_BITS - 1);
				continue;
			}

@@ -1181,9 +1181,10 @@ void bitmap_daemon_work(struct bitmap *bitmap)
					ext2_clear_bit(file_page_offset(j), paddr);
				kunmap_atomic(paddr, KM_USER0);
			}
		} else
			j |= PAGE_COUNTER_MASK;
	}
	spin_unlock_irqrestore(&bitmap->lock, flags);
	}

	/* now sync the final page */
	if (lastpage != NULL) {