#define nop do { } while (0)
#define fio_ffz(v) generic_ffz((v))
+#define read_barrier() __asm__ __volatile__("mb": : :"memory")
#endif
#define __NR_sys_vmsplice 1302
#endif
-#define nop asm volatile ("hint @pause" ::: "memory");
+#define nop asm volatile ("hint @pause" ::: "memory");
+#define read_barrier() asm volatile ("mf" ::: "memory")
#define ia64_popcnt(x) \
({ \
#define nop do { } while (0)
+#ifdef __powerpc64__
+#define read_barrier() \
+ __asm__ __volatile__ ("lwsync" : : : "memory")
+#else
+#define read_barrier() \
+ __asm__ __volatile__ ("sync" : : : "memory")
+#endif
+
static inline int __ilog2(unsigned long bitmask)
{
int lz;
#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
#define FIO_HAVE_SYSLET
-#define nop __asm__ __volatile__("rep;nop": : :"memory")
+#define nop __asm__ __volatile__("rep;nop": : :"memory")
+#define read_barrier() asm volatile ("": : :"memory")
static inline unsigned long fio_ffz(unsigned long bitmask)
{
#define FIO_HAVE_SYSLET
-#define nop __asm__ __volatile__("rep;nop": : :"memory")
+#define nop __asm__ __volatile__("rep;nop": : :"memory")
+#define read_barrier() asm volatile("lfence":::"memory")
static inline unsigned long fio_ffz(unsigned long bitmask)
{
unsigned int nr_events;
struct syslet_ring *ring;
+ unsigned int ring_mask;
void *stack;
};
static void fio_syslet_add_events(struct thread_data *td, unsigned int nr)
{
struct syslet_data *sd = td->io_ops->data;
- unsigned int i;
+ unsigned int i, uidx;
+
+ uidx = sd->ring->user_tail;
+ read_barrier();
for (i = 0; i < nr; i++) {
- unsigned int idx = (i + sd->ring->user_tail) % td->o.iodepth;
+ unsigned int idx = (i + uidx) & sd->ring_mask;
struct syslet_completion *comp = &sd->ring->comp[idx];
struct io_u *io_u = (struct io_u *) (long) comp->caller_data;
long ret;
goto err_mem;
sd->ring = ring;
+ sd->ring_mask = ring_nr - 1;
sd->stack = stack;
memset(sd->ring, 0, ring_size);