#endif
#define nop do { } while (0)
-#define fio_ffz(v) generic_ffz((v))
#define read_barrier() __asm__ __volatile__("mb": : :"memory")
#endif
#define nop asm volatile ("hint @pause" ::: "memory");
#define read_barrier() asm volatile ("mf" ::: "memory")
-#define ia64_popcnt(x) \
-({ \
- unsigned long ia64_intri_res; \
- asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x)); \
- ia64_intri_res; \
-})
-
-static inline unsigned long fio_ffz(unsigned long bitmask)
-{
- return ia64_popcnt(bitmask & (~bitmask - 1));
-}
-
#endif
__asm__ __volatile__ ("sync" : : : "memory")
#endif
-static inline int __ilog2(unsigned long bitmask)
-{
- int lz;
-
- asm ("cntlzw %0,%1" : "=r" (lz) : "r" (bitmask));
- return 31 - lz;
-}
-
-static inline int fio_ffz(unsigned long bitmask)
-{
- if ((bitmask = ~bitmask) == 0)
- return 32;
- return __ilog2(bitmask & -bitmask);
-}
-
#endif
#endif
#define nop asm volatile ("diag 0,0,68" : : : "memory")
-#define fio_ffz(v) generic_ffz((v))
#define read_barrier() asm volatile("bcr 15,0" : : : "memory")
#endif
--- /dev/null
+#ifndef ARCH_SPARC_H
+#define ARCH_SPARC_H
+
+#define ARCH (arch_sparc)
+
+#ifndef __NR_ioprio_set
+#define __NR_ioprio_set 196
+#define __NR_ioprio_get 218
+#endif
+
+#ifndef __NR_fadvise64
+#define __NR_fadvise64 209
+#endif
+
+#ifndef __NR_sys_splice
+#define __NR_sys_splice 232
+#define __NR_sys_tee 280
+#define __NR_sys_vmsplice 25
+#endif
+
+#define nop do { } while (0)
+
+#define read_barrier() __asm__ __volatile__ ("" : : : "memory")
+
+#endif
--- /dev/null
+#ifndef ARCH_SPARC64_H
+#define ARCH_SPARC64_H
+
+#define ARCH (arch_sparc64)
+
+#ifndef __NR_ioprio_set
+#define __NR_ioprio_set 196
+#define __NR_ioprio_get 218
+#endif
+
+#ifndef __NR_fadvise64
+#define __NR_fadvise64 209
+#endif
+
+#ifndef __NR_sys_splice
+#define __NR_sys_splice 232
+#define __NR_sys_tee 280
+#define __NR_sys_vmsplice 25
+#endif
+
+#define nop do { } while (0)
+
+#define membar_safe(type) \
+ do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \
+ " membar " type "\n" \
+ "1:\n" \
+ : : : "memory"); \
+ } while (0)
+
+#define read_barrier() \
+ membar_safe("#LoadLoad")
+
+#endif
#define nop __asm__ __volatile__("rep;nop": : :"memory")
#define read_barrier() asm volatile ("": : :"memory")
-static inline unsigned long fio_ffz(unsigned long bitmask)
-{
- __asm__("bsfl %1,%0" :"=r" (bitmask) :"r" (~bitmask));
- return bitmask;
-}
-
#endif
#define nop __asm__ __volatile__("rep;nop": : :"memory")
#define read_barrier() asm volatile("lfence":::"memory")
-static inline unsigned long fio_ffz(unsigned long bitmask)
-{
- __asm__("bsfq %1,%0" :"=r" (bitmask) :"r" (~bitmask));
- return bitmask;
-}
-
-
#endif
arch_ia64,
arch_s390,
arch_alpha,
+ arch_sparc,
+ arch_sparc64,
};
-static inline unsigned long generic_ffz(unsigned long word)
-{
- unsigned int i;
-
- for (i = 0; i < sizeof(word) * 8; i++)
- if ((word & (1UL << i)) == 0)
- return i;
-
- return -1;
-}
-
#if defined(__i386__)
#include "arch-x86.h"
#elif defined(__x86_64__)
#include "arch-alpha.h"
#elif defined(__s390x__) || defined(__s390__)
#include "arch-s390.h"
+#elif defined(__sparc__)
+#include "arch-sparc.h"
+#elif defined(__sparc64__)
+#include "arch-sparc64.h"
#else
#error "Unsupported arch"
#endif
setitimer(ITIMER_REAL, &itimer, NULL);
}
-/*
- * We need to rearm on BSD/solaris. Switch this to sigaction in the future...
- */
-static void set_sig_handlers(void (*sighandler)(int))
-{
- signal(SIGINT, sighandler);
- signal(SIGALRM, sighandler);
-}
-
-static void sig_handler(int sig)
+static void sig_alrm(int sig)
{
- set_sig_handlers(sig_handler);
-
- if (!threads)
- return;
-
- switch (sig) {
- case SIGALRM:
+ if (threads) {
update_io_ticks();
print_thread_status();
status_timer_arm();
- break;
- default:
+ }
+}
+
+static void sig_int(int sig)
+{
+ if (threads) {
printf("\nfio: terminating on signal %d\n", sig);
fflush(stdout);
terminate_threads(TERMINATE_ALL);
- break;
}
}
+/*
+ * We need to rearm on BSD/solaris. Switch this to sigaction in the future...
+ */
+static void set_sig_handlers(void)
+{
+ struct sigaction act;
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sig_alrm;
+ act.sa_flags = SA_RESTART;
+ sigaction(SIGALRM, &act, NULL);
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sig_int;
+ act.sa_flags = SA_RESTART;
+ sigaction(SIGINT, &act, NULL);
+}
+
/*
* Check if we are above the minimum rate given.
*/
fflush(stdout);
}
- set_sig_handlers(sig_handler);
+ set_sig_handlers();
todo = thread_number;
nr_running = 0;
#include "fio.h"
#include "hash.h"
+#include "lib/ffz.h"
/*
* Change this define to play with the timeout handling
*b = (i * BLOCKS_PER_MAP);
while ((*b) * min_bs < f->real_file_size) {
if (f->file_map[i] != -1UL) {
- *b += fio_ffz(f->file_map[i]);
+ *b += ffz(f->file_map[i]);
if (*b > last_block(td, f, ddir))
break;
f->last_free_lookup = i;
#include <limits.h>
#include "mutex.h"
+#include "lib/ffz.h"
#define MP_SAFE /* define to make thread safe */
#define SMALLOC_REDZONE /* define to detect memory corruption */
blocks_iter(pool, pool_idx, idx, nr_blocks, mask_clear);
}
-static inline int __ffs(int word)
-{
- int r = 0;
-
- if (!(word & 0xffff)) {
- word >>= 16;
- r += 16;
- }
- if (!(word & 0xff)) {
- word >>= 8;
- r += 8;
- }
- if (!(word & 0xf)) {
- word >>= 4;
- r += 4;
- }
- if (!(word & 3)) {
- word >>= 2;
- r += 2;
- }
- if (!(word & 1)) {
- word >>= 1;
- r += 1;
- }
-
- return r;
-}
-
static int find_next_zero(int word, int start)
{
assert(word != -1U);