Permalink
Browse files

Begin tearing down the old workio command queues by removing submit c…

…ommands from there and submit them asynchronously via their own threads.
  • Loading branch information...
1 parent 5dc2588 commit c99636f21b965063f0b41363cc15d2b19692ed14 @ckolivas committed Dec 7, 2012
Showing with 20 additions and 67 deletions.
  1. +12 −55 cgminer.c
  2. +2 −4 driver-cpu.c
  3. +3 −3 driver-ztex.c
  4. +2 −4 findnonce.c
  5. +1 −1 miner.h
View
@@ -64,7 +64,6 @@
enum workio_commands {
WC_GET_WORK,
- WC_SUBMIT_WORK,
};
struct workio_cmd {
@@ -2737,11 +2736,8 @@ static void workio_cmd_free(struct workio_cmd *wc)
return;
switch (wc->cmd) {
- case WC_SUBMIT_WORK:
- free_work(wc->work);
- break;
- default: /* do nothing */
- break;
+ default: /* do nothing */
+ break;
}
memset(wc, 0, sizeof(*wc)); /* poison */
@@ -3284,8 +3280,7 @@ static void check_solve(struct work *work)
static void *submit_work_thread(void *userdata)
{
- struct workio_cmd *wc = (struct workio_cmd *)userdata;
- struct work *work = wc->work;
+ struct work *work = (struct work *)userdata;
struct pool *pool = work->pool;
bool resubmit = false;
struct curl_ent *ce;
@@ -3374,25 +3369,9 @@ static void *submit_work_thread(void *userdata)
}
push_curl_entry(ce, pool);
out:
- workio_cmd_free(wc);
return NULL;
}
-/* We try to reuse curl handles as much as possible, but if there is already
- * work queued to be submitted, we start generating extra handles to submit
- * the shares to avoid ever increasing backlogs. This allows us to scale to
- * any size hardware */
-static bool workio_submit_work(struct workio_cmd *wc)
-{
- pthread_t submit_thread;
-
- if (unlikely(pthread_create(&submit_thread, NULL, submit_work_thread, (void *)wc))) {
- applog(LOG_ERR, "Failed to create submit_work_thread");
- return false;
- }
- return true;
-}
-
/* Find the pool that currently has the highest priority */
static struct pool *priority_pool(int choice)
{
@@ -4482,9 +4461,6 @@ static void *workio_thread(void *userdata)
case WC_GET_WORK:
ok = workio_get_work(wc);
break;
- case WC_SUBMIT_WORK:
- ok = workio_submit_work(wc);
- break;
default:
ok = false;
break;
@@ -5454,35 +5430,16 @@ static void get_work(struct work *work, struct thr_info *thr, const int thr_id)
work->mined = true;
}
-bool submit_work_sync(struct thr_info *thr, struct work *work_in, struct timeval *tv_work_found)
+void submit_work_async(struct work *work_in, struct timeval *tv_work_found)
{
- struct workio_cmd *wc;
-
- /* fill out work request message */
- wc = calloc(1, sizeof(*wc));
- if (unlikely(!wc)) {
- applog(LOG_ERR, "Failed to calloc wc in submit_work_sync");
- return false;
- }
+ struct work *work = copy_work(work_in);
+ pthread_t submit_thread;
- wc->work = copy_work(work_in);
- wc->cmd = WC_SUBMIT_WORK;
- wc->thr = thr;
if (tv_work_found)
- memcpy(&(wc->work->tv_work_found), tv_work_found, sizeof(struct timeval));
-
+ memcpy(&(work->tv_work_found), tv_work_found, sizeof(struct timeval));
applog(LOG_DEBUG, "Pushing submit work to work thread");
-
- /* send solution to workio thread */
- if (unlikely(!tq_push(thr_info[work_thr_id].q, wc))) {
- applog(LOG_ERR, "Failed to tq_push work in submit_work_sync");
- goto err_out;
- }
-
- return true;
-err_out:
- workio_cmd_free(wc);
- return false;
+ if (unlikely(pthread_create(&submit_thread, NULL, submit_work_thread, (void *)work)))
+ quit(1, "Failed to create submit_work_thread");
}
static bool hashtest(struct thr_info *thr, struct work *work)
@@ -5552,7 +5509,7 @@ static bool test_nonce(struct thr_info *thr, struct work *work, uint32_t nonce)
return hashtest(thr, work);
}
-bool submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce)
+void submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce)
{
struct timeval tv_work_found;
gettimeofday(&tv_work_found, NULL);
@@ -5566,9 +5523,9 @@ bool submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce)
/* Do one last check before attempting to submit the work */
/* Side effect: sets work->data for us */
if (!test_nonce(thr, work, nonce))
- return true;
+ return;
- return submit_work_sync(thr, work, &tv_work_found);
+ submit_work_async(work, &tv_work_found);
}
static inline bool abandon_work(struct work *work, struct timeval *wdiff, uint64_t hashes)
View
@@ -75,7 +75,7 @@ static inline void affine_to_cpu(int __maybe_unused id, int __maybe_unused cpu)
/* TODO: resolve externals */
-extern bool submit_work_sync(struct thr_info *thr, const struct work *work_in, struct timeval *tv);
+extern void submit_work_async(const struct work *work_in, struct timeval *tv);
extern char *set_int_range(const char *arg, int *i, int min, int max);
extern int dev_from_id(int thr_id);
@@ -831,9 +831,7 @@ static int64_t cpu_scanhash(struct thr_info *thr, struct work *work, int64_t max
/* if nonce found, submit work */
if (unlikely(rc)) {
applog(LOG_DEBUG, "CPU %d found something?", dev_from_id(thr_id));
- if (unlikely(!submit_work_sync(thr, work, NULL))) {
- applog(LOG_ERR, "Failed to submit_work_sync in miner_thread %d", thr_id);
- }
+ submit_work_async(work, NULL);
work->blk.nonce = last_nonce + 1;
goto CPUSearch;
}
View
@@ -195,7 +195,7 @@ static int64_t ztex_scanhash(struct thr_info *thr, struct work *work,
int backlog_p = 0, backlog_max;
uint32_t *lastnonce;
uint32_t nonce, noncecnt = 0;
- bool overflow, found, rv;
+ bool overflow, found;
struct libztex_hash_data hdata[GOLDEN_BACKLOG];
ztex = thr->cgpu->device_ztex;
@@ -310,8 +310,8 @@ static int64_t ztex_scanhash(struct thr_info *thr, struct work *work,
nonce = swab32(nonce);
#endif
work->blk.nonce = 0xffffffff;
- rv = submit_nonce(thr, work, nonce);
- applog(LOG_DEBUG, "%s: submitted %0.8x %d", ztex->repr, nonce, rv);
+ submit_nonce(thr, work, nonce);
+ applog(LOG_DEBUG, "%s: submitted %0.8x", ztex->repr, nonce);
}
}
}
View
@@ -216,10 +216,8 @@ static void *postcalc_hash(void *userdata)
applog(LOG_DEBUG, "OCL NONCE %u found in slot %d", nonce, entry);
if (opt_scrypt)
send_scrypt_nonce(pcd, nonce);
- else {
- if (unlikely(submit_nonce(thr, &pcd->work, nonce) == false))
- applog(LOG_ERR, "Failed to submit work, exiting");
- }
+ else
+ submit_nonce(thr, &pcd->work, nonce);
}
free(pcd);
View
@@ -1036,7 +1036,7 @@ struct modminer_fpga_state {
#endif
extern void get_datestamp(char *, struct timeval *);
-bool submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce);
+extern void submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce);
extern void tailsprintf(char *f, const char *fmt, ...);
extern void wlogprint(const char *f, ...);
extern int curses_int(const char *query);

0 comments on commit c99636f

Please sign in to comment.