|
|
|
@ -232,6 +232,7 @@ static pthread_mutex_t hash_lock;
@@ -232,6 +232,7 @@ static pthread_mutex_t hash_lock;
|
|
|
|
|
static pthread_mutex_t qd_lock; |
|
|
|
|
static pthread_mutex_t stgd_lock; |
|
|
|
|
static pthread_mutex_t curses_lock; |
|
|
|
|
static pthread_rwlock_t blk_lock; |
|
|
|
|
static double total_mhashes_done; |
|
|
|
|
static struct timeval total_tv_start, total_tv_end; |
|
|
|
|
|
|
|
|
@ -240,7 +241,7 @@ pthread_mutex_t control_lock;
@@ -240,7 +241,7 @@ pthread_mutex_t control_lock;
|
|
|
|
|
int hw_errors; |
|
|
|
|
static int total_accepted, total_rejected; |
|
|
|
|
static int total_getworks, total_stale, total_discarded; |
|
|
|
|
static int total_queued, total_staged, lp_staged; |
|
|
|
|
static int total_queued; |
|
|
|
|
static unsigned int new_blocks; |
|
|
|
|
|
|
|
|
|
enum block_change { |
|
|
|
@ -1314,6 +1315,16 @@ static inline void decay_time(double *f, double fadd)
@@ -1314,6 +1315,16 @@ static inline void decay_time(double *f, double fadd)
|
|
|
|
|
*f = (fadd + *f * 0.9) / 1.9; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int requests_staged(void) |
|
|
|
|
{ |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
mutex_lock(&stgd_lock); |
|
|
|
|
ret = HASH_COUNT(staged_work); |
|
|
|
|
mutex_unlock(&stgd_lock); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static WINDOW *mainwin, *statuswin, *logwin; |
|
|
|
|
static double total_secs = 0.1; |
|
|
|
|
static char statusline[256]; |
|
|
|
@ -1348,8 +1359,8 @@ static void curses_print_status(int thr_id)
@@ -1348,8 +1359,8 @@ static void curses_print_status(int thr_id)
|
|
|
|
|
wprintw(statuswin, " %s", statusline); |
|
|
|
|
wclrtoeol(statuswin); |
|
|
|
|
wmove(statuswin, 3,0); |
|
|
|
|
wprintw(statuswin, " TQ: %d ST: %d LS: %d SS: %d DW: %d NB: %d LW: %d LO: %d RF: %d I: %d", |
|
|
|
|
total_queued, total_staged, lp_staged, total_stale, total_discarded, new_blocks, |
|
|
|
|
wprintw(statuswin, " TQ: %d ST: %d SS: %d DW: %d NB: %d LW: %d LO: %d RF: %d I: %d", |
|
|
|
|
total_queued, requests_staged(), total_stale, total_discarded, new_blocks, |
|
|
|
|
local_work, total_lo, total_ro, scan_intensity); |
|
|
|
|
wclrtoeol(statuswin); |
|
|
|
|
wmove(statuswin, 4, 0); |
|
|
|
@ -1902,46 +1913,6 @@ static bool workio_submit_work(struct workio_cmd *wc)
@@ -1902,46 +1913,6 @@ static bool workio_submit_work(struct workio_cmd *wc)
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void inc_staged(struct pool *pool, int inc, bool lp) |
|
|
|
|
{ |
|
|
|
|
mutex_lock(&stgd_lock); |
|
|
|
|
if (lp) { |
|
|
|
|
lp_staged += inc; |
|
|
|
|
total_staged += inc; |
|
|
|
|
} else if (lp_staged) |
|
|
|
|
--lp_staged; |
|
|
|
|
else |
|
|
|
|
total_staged += inc; |
|
|
|
|
mutex_unlock(&stgd_lock); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void dec_staged(int inc) |
|
|
|
|
{ |
|
|
|
|
mutex_lock(&stgd_lock); |
|
|
|
|
total_staged -= inc; |
|
|
|
|
mutex_unlock(&stgd_lock); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int requests_staged(void) |
|
|
|
|
{ |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
mutex_lock(&stgd_lock); |
|
|
|
|
ret = total_staged; |
|
|
|
|
mutex_unlock(&stgd_lock); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int real_staged(void) |
|
|
|
|
{ |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
mutex_lock(&stgd_lock); |
|
|
|
|
ret = total_staged - lp_staged; |
|
|
|
|
mutex_unlock(&stgd_lock); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Find the pool that currently has the highest priority */ |
|
|
|
|
static struct pool *priority_pool(int choice) |
|
|
|
|
{ |
|
|
|
@ -2029,8 +2000,6 @@ static void switch_pools(struct pool *selected)
@@ -2029,8 +2000,6 @@ static void switch_pools(struct pool *selected)
|
|
|
|
|
mutex_lock(&qd_lock); |
|
|
|
|
total_queued = 0; |
|
|
|
|
mutex_unlock(&qd_lock); |
|
|
|
|
|
|
|
|
|
inc_staged(pool, 1, true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void discard_work(struct work *work) |
|
|
|
@ -2061,7 +2030,6 @@ static void dec_queued(void)
@@ -2061,7 +2030,6 @@ static void dec_queued(void)
|
|
|
|
|
if (total_queued > 0) |
|
|
|
|
total_queued--; |
|
|
|
|
mutex_unlock(&qd_lock); |
|
|
|
|
dec_staged(1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int requests_queued(void) |
|
|
|
@ -2079,7 +2047,7 @@ static int discard_stale(void)
@@ -2079,7 +2047,7 @@ static int discard_stale(void)
|
|
|
|
|
struct work *work, *tmp; |
|
|
|
|
int i, stale = 0; |
|
|
|
|
|
|
|
|
|
mutex_lock(&getq->mutex); |
|
|
|
|
mutex_lock(&stgd_lock); |
|
|
|
|
HASH_ITER(hh, staged_work, work, tmp) { |
|
|
|
|
if (stale_work(work)) { |
|
|
|
|
HASH_DEL(staged_work, work); |
|
|
|
@ -2087,7 +2055,7 @@ static int discard_stale(void)
@@ -2087,7 +2055,7 @@ static int discard_stale(void)
|
|
|
|
|
stale++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
mutex_unlock(&getq->mutex); |
|
|
|
|
mutex_unlock(&stgd_lock); |
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
applog(LOG_DEBUG, "Discarded %d stales that didn't match current hash", stale); |
|
|
|
@ -2103,7 +2071,6 @@ static bool queue_request(struct thr_info *thr, bool needed);
@@ -2103,7 +2071,6 @@ static bool queue_request(struct thr_info *thr, bool needed);
|
|
|
|
|
|
|
|
|
|
static void restart_threads(void) |
|
|
|
|
{ |
|
|
|
|
struct pool *pool = current_pool(); |
|
|
|
|
int i, stale; |
|
|
|
|
|
|
|
|
|
block_changed = BLOCK_NONE; |
|
|
|
@ -2114,10 +2081,6 @@ static void restart_threads(void)
@@ -2114,10 +2081,6 @@ static void restart_threads(void)
|
|
|
|
|
for (i = 0; i < stale; i++) |
|
|
|
|
queue_request(NULL, true); |
|
|
|
|
|
|
|
|
|
/* Temporarily increase the staged count so that the pool is not seen
|
|
|
|
|
* as lagging when a new block hits */ |
|
|
|
|
inc_staged(pool, mining_threads, true); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < mining_threads; i++) |
|
|
|
|
work_restart[i].restart = 1; |
|
|
|
|
} |
|
|
|
@ -2156,17 +2119,17 @@ static void test_work_current(struct work *work)
@@ -2156,17 +2119,17 @@ static void test_work_current(struct work *work)
|
|
|
|
|
|
|
|
|
|
/* Search to see if this block exists yet and if not, consider it a
|
|
|
|
|
* new block and set the current block details to this one */ |
|
|
|
|
mutex_lock(&getq->mutex); |
|
|
|
|
rd_lock(&blk_lock); |
|
|
|
|
HASH_FIND_STR(blocks, hexstr, s); |
|
|
|
|
mutex_unlock(&getq->mutex); |
|
|
|
|
rd_unlock(&blk_lock); |
|
|
|
|
if (!s) { |
|
|
|
|
s = calloc(sizeof(struct block), 1); |
|
|
|
|
if (unlikely(!s)) |
|
|
|
|
quit (1, "test_work_current OOM"); |
|
|
|
|
strcpy(s->hash, hexstr); |
|
|
|
|
mutex_lock(&getq->mutex); |
|
|
|
|
wr_lock(&blk_lock); |
|
|
|
|
HASH_ADD_STR(blocks, hash, s); |
|
|
|
|
mutex_unlock(&getq->mutex); |
|
|
|
|
wr_unlock(&blk_lock); |
|
|
|
|
set_curblock(hexstr, work->data); |
|
|
|
|
|
|
|
|
|
new_blocks++; |
|
|
|
@ -2233,7 +2196,6 @@ static void *stage_thread(void *userdata)
@@ -2233,7 +2196,6 @@ static void *stage_thread(void *userdata)
|
|
|
|
|
applog(LOG_WARNING, "Failed to hash_push in stage_thread"); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
inc_staged(work->pool, 1, false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
tq_freeze(mythr->q); |
|
|
|
@ -2978,7 +2940,7 @@ static bool queue_request(struct thr_info *thr, bool needed)
@@ -2978,7 +2940,7 @@ static bool queue_request(struct thr_info *thr, bool needed)
|
|
|
|
|
int rq, rs; |
|
|
|
|
|
|
|
|
|
rq = requests_queued(); |
|
|
|
|
rs = real_staged(); |
|
|
|
|
rs = requests_staged(); |
|
|
|
|
|
|
|
|
|
/* If we've been generating lots of local work we may already have
|
|
|
|
|
* enough in the queue */ |
|
|
|
@ -3051,7 +3013,7 @@ static inline bool should_roll(struct work *work)
@@ -3051,7 +3013,7 @@ static inline bool should_roll(struct work *work)
|
|
|
|
|
{ |
|
|
|
|
int rs; |
|
|
|
|
|
|
|
|
|
rs = real_staged(); |
|
|
|
|
rs = requests_staged(); |
|
|
|
|
if (rs >= opt_queue + mining_threads) |
|
|
|
|
return false; |
|
|
|
|
if (work->pool == current_pool() || pool_strategy == POOL_LOADBALANCE || !rs) |
|
|
|
@ -4503,6 +4465,8 @@ int main (int argc, char *argv[])
@@ -4503,6 +4465,8 @@ int main (int argc, char *argv[])
|
|
|
|
|
quit(1, "Failed to pthread_mutex_init"); |
|
|
|
|
if (unlikely(pthread_mutex_init(&control_lock, NULL))) |
|
|
|
|
quit(1, "Failed to pthread_mutex_init"); |
|
|
|
|
if (unlikely(pthread_rwlock_init(&blk_lock, NULL))) |
|
|
|
|
quit(1, "Failed to pthread_rwlock_init"); |
|
|
|
|
|
|
|
|
|
init_max_name_len(); |
|
|
|
|
|
|
|
|
|