Browse Source

Do a sleep of the full duration it would take to do all the work using clock_nanosleep in avalon_send_tasks to avoid sleep overruns before polling to see if it's ready.

nfactor-troky
Con Kolivas 11 years ago
parent
commit
1864ed2634
  1. 16
      driver-avalon.c

16
driver-avalon.c

@ -1020,14 +1020,22 @@ static void *avalon_send_tasks(void *userdata)
while (likely(!avalon->shutdown)) { while (likely(!avalon->shutdown)) {
int start_count, end_count, i, j, ret; int start_count, end_count, i, j, ret;
struct timespec ts_start, ts_end;
struct avalon_task at; struct avalon_task at;
bool idled = false; bool idled = false;
int64_t us_timeout;
while (avalon_buffer_full(avalon)) while (avalon_buffer_full(avalon))
nmsleep(40); nmsleep(40);
avalon_adjust_freq(info, avalon); avalon_adjust_freq(info, avalon);
/* A full nonce range */
us_timeout = 0x100000000ll / info->asic_count / info->frequency;
us_to_timespec(&ts_end, us_timeout);
clock_gettime(CLOCK_MONOTONIC, &ts_start);
timeraddspec(&ts_end, &ts_start);
mutex_lock(&info->qlock); mutex_lock(&info->qlock);
start_count = avalon->work_array * avalon_get_work_count; start_count = avalon->work_array * avalon_get_work_count;
end_count = start_count + avalon_get_work_count; end_count = start_count + avalon_get_work_count;
@ -1079,6 +1087,14 @@ static void *avalon_send_tasks(void *userdata)
applog(LOG_WARNING, "%s%i: Idled %d miners", applog(LOG_WARNING, "%s%i: Idled %d miners",
avalon->drv->name, avalon->device_id, idled); avalon->drv->name, avalon->device_id, idled);
} }
/* Sleep how long it would take to complete a full nonce range
* at the current frequency using the clock_nanosleep function
* timed from before we started loading new work so it will
* fall short of the full duration. */
do {
ret = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts_end, NULL);
} while (ret == EINTR);
} }
return NULL; return NULL;
} }

Loading…
Cancel
Save