Commit c99636f21b965063f0b41363cc15d2b19692ed14

Con Kolivas 2012-12-07T13:21:46

Begin tearing down the old workio command queues by removing submit commands from there and submit them asynchronously via their own threads.

diff --git a/cgminer.c b/cgminer.c
index 84bf866..4616859 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -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 @@ out:
 	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)
diff --git a/driver-cpu.c b/driver-cpu.c
index a4b8df2..75d9a5a 100644
--- a/driver-cpu.c
+++ b/driver-cpu.c
@@ -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 @@ CPUSearch:
 	/* 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;
 	}
diff --git a/driver-ztex.c b/driver-ztex.c
index c00ba26..40afb05 100644
--- a/driver-ztex.c
+++ b/driver-ztex.c
@@ -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);
 					}
 				}
 			}
diff --git a/findnonce.c b/findnonce.c
index 312222b..bf39a12 100644
--- a/findnonce.c
+++ b/findnonce.c
@@ -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);
diff --git a/miner.h b/miner.h
index 6f1bd70..e226acf 100644
--- a/miner.h
+++ b/miner.h
@@ -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);