From c7978f11ed8a80ca71898ecb8ecba7174c8ec571 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Wed, 27 Jul 2011 20:40:06 +1000 Subject: [PATCH] Dividing work is like the work is never removed at all so treat it as such. However the queued bool needs to be reset to ensure we *can* request more work even if we didn't initially. --- main.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/main.c b/main.c index 3f87c341..369ffc82 100644 --- a/main.c +++ b/main.c @@ -1478,16 +1478,7 @@ static void *stage_thread(void *userdata) if (!work->cloned && !work->clone) gettimeofday(&work->tv_staged, NULL); - /* If the work is cloned it has already gone to get_work once - * so it must be used ASAP before it goes stale so put it at - * the head of the list */ - if (work->cloned) { - if (unlikely(!tq_push_head(getq, work))) { - applog(LOG_ERR, "Failed to tq_push work in stage_thread"); - ok = false; - break; - } - } else if (unlikely(!tq_push(getq, work))) { + if (unlikely(!tq_push(getq, work))) { applog(LOG_ERR, "Failed to tq_push work in stage_thread"); ok = false; break; @@ -2327,7 +2318,7 @@ static bool divide_work(struct timeval *now, struct work *work, uint32_t hash_di return false; } -static bool get_work(struct work *work, bool queued, struct thr_info *thr, +static bool get_work(struct work *work, bool requested, struct thr_info *thr, const int thr_id, uint32_t hash_div) { struct timespec abstime = {}; @@ -2342,10 +2333,11 @@ static bool get_work(struct work *work, bool queued, struct thr_info *thr, thread_reportout(thr); retry: pool = current_pool(); - if (unlikely(!queued && !queue_request())) { + if (unlikely(!requested && !queue_request())) { applog(LOG_WARNING, "Failed to queue_request in get_work"); goto out; } + requested = false; if (!requests_staged() && can_roll(work)) { /* Only print this message once each time we shift to localgen */ @@ -2387,8 +2379,8 @@ retry: goto retry; } - dec_queued(); if (stale_work(work_heap)) { + dec_queued(); discard_work(work_heap); goto retry; } @@ -2404,10 +2396,12 @@ retry: * should we divide the same work up again. Make the work we're * handing out be clone */ if (divide_work(&now, work_heap, hash_div)) { - tq_push(thr_info[stage_thr_id].q, work_heap); + tq_push_head(getq, work_heap); work->clone = true; - } else + } else { + dec_queued(); free(work_heap); + } ret = true; out: