mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-11 15:27:53 +00:00
Merge pull request #171 from luke-jr/icarus_longpoll
Icarus: Abandon a scanhash early when work restart requested
This commit is contained in:
commit
9641ff2ecc
@ -301,6 +301,8 @@ if test "x$bitforce" != xno; then
|
|||||||
fi
|
fi
|
||||||
AM_CONDITIONAL([HAVE_LIBUDEV], [test x$libudev != xno])
|
AM_CONDITIONAL([HAVE_LIBUDEV], [test x$libudev != xno])
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([sys/epoll.h])
|
||||||
|
|
||||||
PKG_PROG_PKG_CONFIG()
|
PKG_PROG_PKG_CONFIG()
|
||||||
|
|
||||||
PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.15.6], [AC_DEFINE([CURL_HAS_SOCKOPT], [1], [Defined if version of curl supports sockopts.])],
|
PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.15.6], [AC_DEFINE([CURL_HAS_SOCKOPT], [1], [Defined if version of curl supports sockopts.])],
|
||||||
|
@ -46,11 +46,17 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_EPOLL_H
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#define HAVE_EPOLL
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "elist.h"
|
#include "elist.h"
|
||||||
#include "miner.h"
|
#include "miner.h"
|
||||||
|
|
||||||
#define ICARUS_READ_FAULT_COUNT (8)
|
// 8 second timeout
|
||||||
|
#define ICARUS_READ_FAULT_DECISECONDS (1)
|
||||||
|
#define ICARUS_READ_FAULT_COUNT (80)
|
||||||
|
|
||||||
struct device_api icarus_api;
|
struct device_api icarus_api;
|
||||||
|
|
||||||
@ -87,7 +93,7 @@ static int icarus_open(const char *devpath)
|
|||||||
ISTRIP | INLCR | IGNCR | ICRNL | IXON);
|
ISTRIP | INLCR | IGNCR | ICRNL | IXON);
|
||||||
my_termios.c_oflag &= ~OPOST;
|
my_termios.c_oflag &= ~OPOST;
|
||||||
my_termios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
|
my_termios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
|
||||||
my_termios.c_cc[VTIME] = 10; /* block 1 second */
|
my_termios.c_cc[VTIME] = ICARUS_READ_FAULT_DECISECONDS;
|
||||||
my_termios.c_cc[VMIN] = 0;
|
my_termios.c_cc[VMIN] = 0;
|
||||||
tcsetattr(serialfd, TCSANOW, &my_termios);
|
tcsetattr(serialfd, TCSANOW, &my_termios);
|
||||||
|
|
||||||
@ -108,12 +114,31 @@ static int icarus_open(const char *devpath)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int icarus_gets(unsigned char *buf, size_t bufLen, int fd)
|
static int icarus_gets(unsigned char *buf, size_t bufLen, int fd, volatile unsigned long *wr)
|
||||||
{
|
{
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
int epollfd = -1;
|
||||||
|
|
||||||
|
#ifdef HAVE_EPOLL
|
||||||
|
struct epoll_event ev, evr;
|
||||||
|
epollfd = epoll_create(1);
|
||||||
|
if (epollfd != -1) {
|
||||||
|
ev.events = EPOLLIN;
|
||||||
|
ev.data.fd = fd;
|
||||||
|
if (-1 == epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev)) {
|
||||||
|
close(epollfd);
|
||||||
|
epollfd = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
while (bufLen) {
|
while (bufLen) {
|
||||||
|
#ifdef HAVE_EPOLL
|
||||||
|
if (epollfd != -1 && epoll_wait(epollfd, &evr, 1, ICARUS_READ_FAULT_DECISECONDS * 100) != 1)
|
||||||
|
ret = 0;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
ret = read(fd, buf, 1);
|
ret = read(fd, buf, 1);
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
bufLen--;
|
bufLen--;
|
||||||
@ -122,13 +147,20 @@ static int icarus_gets(unsigned char *buf, size_t bufLen, int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rc++;
|
rc++;
|
||||||
|
if (*wr)
|
||||||
|
return 1;
|
||||||
if (rc == ICARUS_READ_FAULT_COUNT) {
|
if (rc == ICARUS_READ_FAULT_COUNT) {
|
||||||
|
if (epollfd != -1)
|
||||||
|
close(epollfd);
|
||||||
applog(LOG_DEBUG,
|
applog(LOG_DEBUG,
|
||||||
"Icarus Read: No data in %d seconds", rc);
|
"Icarus Read: No data in %d seconds", rc * ICARUS_READ_FAULT_DECISECONDS / 10);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (epollfd != -1)
|
||||||
|
close(epollfd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,7 +204,8 @@ static bool icarus_detect_one(const char *devpath)
|
|||||||
icarus_write(fd, ob_bin, sizeof(ob_bin));
|
icarus_write(fd, ob_bin, sizeof(ob_bin));
|
||||||
|
|
||||||
memset(nonce_bin, 0, sizeof(nonce_bin));
|
memset(nonce_bin, 0, sizeof(nonce_bin));
|
||||||
icarus_gets(nonce_bin, sizeof(nonce_bin), fd);
|
volatile unsigned long wr = 0;
|
||||||
|
icarus_gets(nonce_bin, sizeof(nonce_bin), fd, &wr);
|
||||||
|
|
||||||
icarus_close(fd);
|
icarus_close(fd);
|
||||||
|
|
||||||
@ -243,6 +276,8 @@ static bool icarus_prepare(struct thr_info *thr)
|
|||||||
static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
|
static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
|
||||||
__maybe_unused uint64_t max_nonce)
|
__maybe_unused uint64_t max_nonce)
|
||||||
{
|
{
|
||||||
|
volatile unsigned long *wr = &work_restart[thr->id].restart;
|
||||||
|
|
||||||
struct cgpu_info *icarus;
|
struct cgpu_info *icarus;
|
||||||
int fd;
|
int fd;
|
||||||
int ret;
|
int ret;
|
||||||
@ -278,7 +313,7 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
|
|||||||
|
|
||||||
/* Icarus will return 8 bytes nonces or nothing */
|
/* Icarus will return 8 bytes nonces or nothing */
|
||||||
memset(nonce_bin, 0, sizeof(nonce_bin));
|
memset(nonce_bin, 0, sizeof(nonce_bin));
|
||||||
ret = icarus_gets(nonce_bin, sizeof(nonce_bin), fd);
|
ret = icarus_gets(nonce_bin, sizeof(nonce_bin), fd, wr);
|
||||||
|
|
||||||
nonce_hex = bin2hex(nonce_bin, sizeof(nonce_bin));
|
nonce_hex = bin2hex(nonce_bin, sizeof(nonce_bin));
|
||||||
if (nonce_hex) {
|
if (nonce_hex) {
|
||||||
|
@ -111,8 +111,6 @@ bool ScanHash_4WaySSE2(int thr_id, const unsigned char *pmidstate,
|
|||||||
|
|
||||||
pdata += 64;
|
pdata += 64;
|
||||||
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
unsigned int thash[9][NPAR] __attribute__((aligned(128)));
|
unsigned int thash[9][NPAR] __attribute__((aligned(128)));
|
||||||
|
@ -84,8 +84,6 @@ bool ScanHash_altivec_4way(int thr_id, const unsigned char *pmidstate,
|
|||||||
|
|
||||||
pdata += 64;
|
pdata += 64;
|
||||||
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
unsigned int thash[9][NPAR] __attribute__((aligned(128)));
|
unsigned int thash[9][NPAR] __attribute__((aligned(128)));
|
||||||
|
@ -589,8 +589,6 @@ bool scanhash_asm32(int thr_id, const unsigned char *midstate,
|
|||||||
|
|
||||||
data += 64;
|
data += 64;
|
||||||
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
n++;
|
n++;
|
||||||
*nonce = n;
|
*nonce = n;
|
||||||
|
@ -251,8 +251,6 @@ bool scanhash_c(int thr_id, const unsigned char *midstate, unsigned char *data,
|
|||||||
|
|
||||||
data += 64;
|
data += 64;
|
||||||
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
n++;
|
n++;
|
||||||
*nonce = n;
|
*nonce = n;
|
||||||
|
@ -65,8 +65,6 @@ bool scanhash_sse2_64(int thr_id, const unsigned char *pmidstate,
|
|||||||
|
|
||||||
pdata += 64;
|
pdata += 64;
|
||||||
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
/* For debugging */
|
/* For debugging */
|
||||||
union {
|
union {
|
||||||
__m128i m;
|
__m128i m;
|
||||||
|
@ -65,8 +65,6 @@ bool scanhash_sse2_32(int thr_id, const unsigned char *pmidstate,
|
|||||||
|
|
||||||
pdata += 64;
|
pdata += 64;
|
||||||
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
/* Message expansion */
|
/* Message expansion */
|
||||||
memcpy(m_midstate, pmidstate, sizeof(m_midstate));
|
memcpy(m_midstate, pmidstate, sizeof(m_midstate));
|
||||||
memcpy(m_w, pdata, sizeof(m_w)); /* The 2nd half of the data */
|
memcpy(m_w, pdata, sizeof(m_w)); /* The 2nd half of the data */
|
||||||
|
@ -62,8 +62,6 @@ bool scanhash_sse4_64(int thr_id, const unsigned char *pmidstate,
|
|||||||
|
|
||||||
pdata += 64;
|
pdata += 64;
|
||||||
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
/* For debugging */
|
/* For debugging */
|
||||||
union {
|
union {
|
||||||
__m128i m;
|
__m128i m;
|
||||||
|
@ -35,8 +35,6 @@ bool scanhash_via(int thr_id, const unsigned char *pmidstate,
|
|||||||
unsigned long stat_ctr = 0;
|
unsigned long stat_ctr = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
/* bitcoin gives us big endian input, but via wants LE,
|
/* bitcoin gives us big endian input, but via wants LE,
|
||||||
* so we reverse the swapping bitcoin has already done (extra work)
|
* so we reverse the swapping bitcoin has already done (extra work)
|
||||||
* in order to permit the hardware to swap everything
|
* in order to permit the hardware to swap everything
|
||||||
|
Loading…
Reference in New Issue
Block a user