Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
int percpu_op_available(void);
int percpu_op_available(void);
+static inline uint32_t percpu_current_cpu(void)
+{
+ return rseq_current_cpu();
+}
+
static inline __attribute__((always_inline))
int percpu_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv,
int cpu)
static inline __attribute__((always_inline))
int percpu_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv,
int cpu)
struct percpu_list_entry c[CPU_SETSIZE];
};
struct percpu_list_entry c[CPU_SETSIZE];
};
-/* A simple percpu spinlock. Returns the cpu lock was acquired on. */
-int rseq_percpu_lock(struct percpu_lock *lock)
+/* A simple percpu spinlock. */
+void rseq_percpu_lock(struct percpu_lock *lock, int cpu)
- cpu = rseq_cpu_start();
ret = percpu_cmpeqv_storev(&lock->c[cpu].v,
0, 1, cpu);
if (rseq_likely(!ret))
ret = percpu_cmpeqv_storev(&lock->c[cpu].v,
0, 1, cpu);
if (rseq_likely(!ret))
* Matches rseq_smp_store_release().
*/
rseq_smp_acquire__after_ctrl_dep();
* Matches rseq_smp_store_release().
*/
rseq_smp_acquire__after_ctrl_dep();
}
void rseq_percpu_unlock(struct percpu_lock *lock, int cpu)
}
void rseq_percpu_unlock(struct percpu_lock *lock, int cpu)
void *test_percpu_spinlock_thread(void *arg)
{
struct spinlock_test_data *data = arg;
void *test_percpu_spinlock_thread(void *arg)
{
struct spinlock_test_data *data = arg;
if (rseq_register_current_thread()) {
fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
if (rseq_register_current_thread()) {
fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
abort();
}
for (i = 0; i < data->reps; i++) {
abort();
}
for (i = 0; i < data->reps; i++) {
- cpu = rseq_percpu_lock(&data->lock);
+ int cpu = percpu_current_cpu();
+
+ rseq_percpu_lock(&data->lock, cpu);
data->c[cpu].count++;
rseq_percpu_unlock(&data->lock, cpu);
}
data->c[cpu].count++;
rseq_percpu_unlock(&data->lock, cpu);
}
for (i = 0; i < 100000; i++) {
struct percpu_list_node *node;
for (i = 0; i < 100000; i++) {
struct percpu_list_node *node;
- node = percpu_list_pop(list, rseq_cpu_start());
+ node = percpu_list_pop(list, percpu_current_cpu());
sched_yield(); /* encourage shuffling */
if (node)
sched_yield(); /* encourage shuffling */
if (node)
- percpu_list_push(list, node, rseq_cpu_start());
+ percpu_list_push(list, node, percpu_current_cpu());
}
if (rseq_unregister_current_thread()) {
}
if (rseq_unregister_current_thread()) {