Begin tearing down the old workio command queues by removing submit commands from there and submit them asynchronously via their own threads.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
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);