|
|
@ -2999,14 +2999,14 @@ static struct work *make_clone(struct work *work) |
|
|
|
|
|
|
|
|
|
|
|
static void stage_work(struct work *work); |
|
|
|
static void stage_work(struct work *work); |
|
|
|
|
|
|
|
|
|
|
|
/* Called with stgd_lock held */ |
|
|
|
static bool clone_available(void) |
|
|
|
static bool __clone_available(void) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
struct work *work, *tmp; |
|
|
|
struct work *work, *tmp; |
|
|
|
bool cloned = false; |
|
|
|
bool cloned = false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(stgd_lock); |
|
|
|
if (!staged_rollable) |
|
|
|
if (!staged_rollable) |
|
|
|
goto out; |
|
|
|
goto out_unlock; |
|
|
|
|
|
|
|
|
|
|
|
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)) { |
|
|
@ -3022,7 +3022,9 @@ static bool __clone_available(void) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
out: |
|
|
|
out_unlock: |
|
|
|
|
|
|
|
mutex_unlock(stgd_lock); |
|
|
|
|
|
|
|
|
|
|
|
return cloned; |
|
|
|
return cloned; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -6864,7 +6866,7 @@ retry: |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (__clone_available()) { |
|
|
|
if (clone_available()) { |
|
|
|
applog(LOG_DEBUG, "Cloned getwork work"); |
|
|
|
applog(LOG_DEBUG, "Cloned getwork work"); |
|
|
|
free_work(work); |
|
|
|
free_work(work); |
|
|
|
continue; |
|
|
|
continue; |
|
|
|