Loading drivers/md/raid5.c +8 −5 Original line number Original line Diff line number Diff line Loading @@ -672,20 +672,23 @@ get_active_stripe(struct r5conf *conf, sector_t sector, *(conf->hash_locks + hash)); *(conf->hash_locks + hash)); sh = __find_stripe(conf, sector, conf->generation - previous); sh = __find_stripe(conf, sector, conf->generation - previous); if (!sh) { if (!sh) { if (!conf->inactive_blocked) if (!test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state)) sh = get_free_stripe(conf, hash); sh = get_free_stripe(conf, hash); if (noblock && sh == NULL) if (noblock && sh == NULL) break; break; if (!sh) { if (!sh) { conf->inactive_blocked = 1; set_bit(R5_INACTIVE_BLOCKED, &conf->cache_state); wait_event_lock_irq( wait_event_lock_irq( conf->wait_for_stripe, conf->wait_for_stripe, !list_empty(conf->inactive_list + hash) && !list_empty(conf->inactive_list + hash) && (atomic_read(&conf->active_stripes) (atomic_read(&conf->active_stripes) < (conf->max_nr_stripes * 3 / 4) < (conf->max_nr_stripes * 3 / 4) || !conf->inactive_blocked), || !test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state)), *(conf->hash_locks + hash)); *(conf->hash_locks + hash)); conf->inactive_blocked = 0; clear_bit(R5_INACTIVE_BLOCKED, &conf->cache_state); } else { } else { init_stripe(sh, sector, previous); init_stripe(sh, sector, previous); atomic_inc(&sh->count); atomic_inc(&sh->count); Loading Loading @@ -4602,7 +4605,7 @@ static int raid5_congested(struct mddev *mddev, int bits) * how busy the stripe_cache is * how busy the stripe_cache is */ */ if (conf->inactive_blocked) if (test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state)) return 1; return 1; if (conf->quiesce) if (conf->quiesce) return 1; return 1; Loading drivers/md/raid5.h +6 −3 Original line number Original line Diff line number Diff line Loading @@ -509,9 +509,11 @@ struct r5conf { struct llist_head released_stripes; struct llist_head released_stripes; wait_queue_head_t wait_for_stripe; wait_queue_head_t wait_for_stripe; wait_queue_head_t wait_for_overlap; wait_queue_head_t wait_for_overlap; int inactive_blocked; /* release of inactive stripes blocked, unsigned long cache_state; #define R5_INACTIVE_BLOCKED 1 /* release of inactive stripes blocked, * waiting for 25% to be free * waiting for 25% to be free */ */ int pool_size; /* number of disks in stripeheads in pool */ int pool_size; /* number of disks in stripeheads in pool */ spinlock_t device_lock; spinlock_t device_lock; struct disk_info *disks; struct disk_info *disks; Loading @@ -526,6 +528,7 @@ struct r5conf { int worker_cnt_per_group; int worker_cnt_per_group; }; }; /* /* * Our supported algorithms * Our supported algorithms */ */ Loading Loading
drivers/md/raid5.c +8 −5 Original line number Original line Diff line number Diff line Loading @@ -672,20 +672,23 @@ get_active_stripe(struct r5conf *conf, sector_t sector, *(conf->hash_locks + hash)); *(conf->hash_locks + hash)); sh = __find_stripe(conf, sector, conf->generation - previous); sh = __find_stripe(conf, sector, conf->generation - previous); if (!sh) { if (!sh) { if (!conf->inactive_blocked) if (!test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state)) sh = get_free_stripe(conf, hash); sh = get_free_stripe(conf, hash); if (noblock && sh == NULL) if (noblock && sh == NULL) break; break; if (!sh) { if (!sh) { conf->inactive_blocked = 1; set_bit(R5_INACTIVE_BLOCKED, &conf->cache_state); wait_event_lock_irq( wait_event_lock_irq( conf->wait_for_stripe, conf->wait_for_stripe, !list_empty(conf->inactive_list + hash) && !list_empty(conf->inactive_list + hash) && (atomic_read(&conf->active_stripes) (atomic_read(&conf->active_stripes) < (conf->max_nr_stripes * 3 / 4) < (conf->max_nr_stripes * 3 / 4) || !conf->inactive_blocked), || !test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state)), *(conf->hash_locks + hash)); *(conf->hash_locks + hash)); conf->inactive_blocked = 0; clear_bit(R5_INACTIVE_BLOCKED, &conf->cache_state); } else { } else { init_stripe(sh, sector, previous); init_stripe(sh, sector, previous); atomic_inc(&sh->count); atomic_inc(&sh->count); Loading Loading @@ -4602,7 +4605,7 @@ static int raid5_congested(struct mddev *mddev, int bits) * how busy the stripe_cache is * how busy the stripe_cache is */ */ if (conf->inactive_blocked) if (test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state)) return 1; return 1; if (conf->quiesce) if (conf->quiesce) return 1; return 1; Loading
drivers/md/raid5.h +6 −3 Original line number Original line Diff line number Diff line Loading @@ -509,9 +509,11 @@ struct r5conf { struct llist_head released_stripes; struct llist_head released_stripes; wait_queue_head_t wait_for_stripe; wait_queue_head_t wait_for_stripe; wait_queue_head_t wait_for_overlap; wait_queue_head_t wait_for_overlap; int inactive_blocked; /* release of inactive stripes blocked, unsigned long cache_state; #define R5_INACTIVE_BLOCKED 1 /* release of inactive stripes blocked, * waiting for 25% to be free * waiting for 25% to be free */ */ int pool_size; /* number of disks in stripeheads in pool */ int pool_size; /* number of disks in stripeheads in pool */ spinlock_t device_lock; spinlock_t device_lock; struct disk_info *disks; struct disk_info *disks; Loading @@ -526,6 +528,7 @@ struct r5conf { int worker_cnt_per_group; int worker_cnt_per_group; }; }; /* /* * Our supported algorithms * Our supported algorithms */ */ Loading