|
|
@ -3000,7 +3000,7 @@ static void stage_work(struct work *work); |
|
|
|
|
|
|
|
|
|
|
|
static bool clone_available(void) |
|
|
|
static bool clone_available(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct work *work, *tmp; |
|
|
|
struct work *work_clone = NULL, *work, *tmp; |
|
|
|
bool cloned = false; |
|
|
|
bool cloned = false; |
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(stgd_lock); |
|
|
|
mutex_lock(stgd_lock); |
|
|
@ -3009,13 +3009,10 @@ static bool clone_available(void) |
|
|
|
|
|
|
|
|
|
|
|
HASH_ITER(hh, staged_work, work, tmp) { |
|
|
|
HASH_ITER(hh, staged_work, work, tmp) { |
|
|
|
if (can_roll(work) && should_roll(work)) { |
|
|
|
if (can_roll(work) && should_roll(work)) { |
|
|
|
struct work *work_clone; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
roll_work(work); |
|
|
|
roll_work(work); |
|
|
|
work_clone = make_clone(work); |
|
|
|
work_clone = make_clone(work); |
|
|
|
roll_work(work); |
|
|
|
roll_work(work); |
|
|
|
applog(LOG_DEBUG, "Pushing cloned available work to stage thread"); |
|
|
|
applog(LOG_DEBUG, "Pushing cloned available work to stage thread"); |
|
|
|
stage_work(work_clone); |
|
|
|
|
|
|
|
cloned = true; |
|
|
|
cloned = true; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -3024,6 +3021,8 @@ static bool clone_available(void) |
|
|
|
out_unlock: |
|
|
|
out_unlock: |
|
|
|
mutex_unlock(stgd_lock); |
|
|
|
mutex_unlock(stgd_lock); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (cloned) |
|
|
|
|
|
|
|
stage_work(work_clone); |
|
|
|
return cloned; |
|
|
|
return cloned; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|