* UCRL-CODE-235197
*
* This file is part of the SPL, Solaris Porting Layer.
- * For details, see <http://github.com/behlendorf/spl/>.
+ * For details, see <http://zfsonlinux.org/>.
*
* The SPL is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Solaris Porting LAyer Tests (SPLAT) Read/Writer Lock Tests.
\*****************************************************************************/
+#include <sys/random.h>
#include <sys/rwlock.h>
#include <sys/taskq.h>
-#include <sys/random.h>
+#include <linux/delay.h>
+#include <linux/mm_compat.h>
#include "splat-internal.h"
#define SPLAT_RWLOCK_NAME "rwlock"
typedef struct rw_thr {
const char *rwt_name;
rw_priv_t *rwt_rwp;
- int rwt_id;
+ struct task_struct *rwt_thread;
} rw_thr_t;
void splat_init_rw_priv(rw_priv_t *rwp, struct file *file)
rw_thr_t *rwt = (rw_thr_t *)arg;
rw_priv_t *rwp = rwt->rwt_rwp;
uint8_t rnd;
- char name[16];
ASSERT(rwp->rw_magic == SPLAT_RWLOCK_TEST_MAGIC);
- snprintf(name, sizeof(name), "rwlock_wr_thr%d", rwt->rwt_id);
- daemonize(name);
+
get_random_bytes((void *)&rnd, 1);
msleep((unsigned int)rnd);
splat_vprint(rwp->rw_file, rwt->rwt_name,
- "%s trying to acquire rwlock (%d holding/%d waiting)\n",
- name, rwp->rw_holders, rwp->rw_waiters);
+ "%s trying to acquire rwlock (%d holding/%d waiting)\n",
+ rwt->rwt_thread->comm, rwp->rw_holders, rwp->rw_waiters);
spin_lock(&rwp->rw_lock);
rwp->rw_waiters++;
spin_unlock(&rwp->rw_lock);
rwp->rw_holders++;
spin_unlock(&rwp->rw_lock);
splat_vprint(rwp->rw_file, rwt->rwt_name,
- "%s acquired rwlock (%d holding/%d waiting)\n",
- name, rwp->rw_holders, rwp->rw_waiters);
+ "%s acquired rwlock (%d holding/%d waiting)\n",
+ rwt->rwt_thread->comm, rwp->rw_holders, rwp->rw_waiters);
/* Wait for control thread to signal we can release the write lock */
wait_event_interruptible(rwp->rw_waitq, splat_locked_test(&rwp->rw_lock,
- rwp->rw_release == SPLAT_RWLOCK_RELEASE_WR));
+ rwp->rw_release == SPLAT_RWLOCK_RELEASE_WR));
spin_lock(&rwp->rw_lock);
rwp->rw_completed++;
rwp->rw_holders--;
spin_unlock(&rwp->rw_lock);
splat_vprint(rwp->rw_file, rwt->rwt_name,
- "%s dropped rwlock (%d holding/%d waiting)\n",
- name, rwp->rw_holders, rwp->rw_waiters);
+ "%s dropped rwlock (%d holding/%d waiting)\n",
+ rwt->rwt_thread->comm, rwp->rw_holders, rwp->rw_waiters);
rw_exit(&rwp->rw_rwlock);
rw_thr_t *rwt = (rw_thr_t *)arg;
rw_priv_t *rwp = rwt->rwt_rwp;
uint8_t rnd;
- char name[16];
ASSERT(rwp->rw_magic == SPLAT_RWLOCK_TEST_MAGIC);
- snprintf(name, sizeof(name), "rwlock_rd_thr%d", rwt->rwt_id);
- daemonize(name);
+
get_random_bytes((void *)&rnd, 1);
msleep((unsigned int)rnd);
/* Don't try and take the semaphore until after someone has it */
- wait_event_interruptible(rwp->rw_waitq, splat_locked_test(&rwp->rw_lock,
- rwp->rw_holders > 0));
+ wait_event_interruptible(rwp->rw_waitq,
+ splat_locked_test(&rwp->rw_lock, rwp->rw_holders > 0));
splat_vprint(rwp->rw_file, rwt->rwt_name,
- "%s trying to acquire rwlock (%d holding/%d waiting)\n",
- name, rwp->rw_holders, rwp->rw_waiters);
+ "%s trying to acquire rwlock (%d holding/%d waiting)\n",
+ rwt->rwt_thread->comm, rwp->rw_holders, rwp->rw_waiters);
spin_lock(&rwp->rw_lock);
rwp->rw_waiters++;
spin_unlock(&rwp->rw_lock);
rwp->rw_holders++;
spin_unlock(&rwp->rw_lock);
splat_vprint(rwp->rw_file, rwt->rwt_name,
- "%s acquired rwlock (%d holding/%d waiting)\n",
- name, rwp->rw_holders, rwp->rw_waiters);
+ "%s acquired rwlock (%d holding/%d waiting)\n",
+ rwt->rwt_thread->comm, rwp->rw_holders, rwp->rw_waiters);
/* Wait for control thread to signal we can release the read lock */
wait_event_interruptible(rwp->rw_waitq, splat_locked_test(&rwp->rw_lock,
- rwp->rw_release == SPLAT_RWLOCK_RELEASE_RD));
+ rwp->rw_release == SPLAT_RWLOCK_RELEASE_RD));
spin_lock(&rwp->rw_lock);
rwp->rw_completed++;
rwp->rw_holders--;
spin_unlock(&rwp->rw_lock);
splat_vprint(rwp->rw_file, rwt->rwt_name,
- "%s dropped rwlock (%d holding/%d waiting)\n",
- name, rwp->rw_holders, rwp->rw_waiters);
+ "%s dropped rwlock (%d holding/%d waiting)\n",
+ rwt->rwt_thread->comm, rwp->rw_holders, rwp->rw_waiters);
rw_exit(&rwp->rw_rwlock);
splat_rwlock_test1(struct file *file, void *arg)
{
int i, count = 0, rc = 0;
- long pids[SPLAT_RWLOCK_TEST_COUNT];
rw_thr_t rwt[SPLAT_RWLOCK_TEST_COUNT];
rw_priv_t *rwp;
/* Create some threads, the exact number isn't important just as
* long as we know how many we managed to create and should expect. */
-
-
-
for (i = 0; i < SPLAT_RWLOCK_TEST_COUNT; i++) {
rwt[i].rwt_rwp = rwp;
- rwt[i].rwt_id = i;
rwt[i].rwt_name = SPLAT_RWLOCK_TEST1_NAME;
/* The first thread will be the writer */
if (i == 0)
- pids[i] = kernel_thread(splat_rwlock_wr_thr, &rwt[i], 0);
+ rwt[i].rwt_thread = spl_kthread_create(splat_rwlock_wr_thr,
+ &rwt[i], "%s/%d", SPLAT_RWLOCK_TEST_NAME, i);
else
- pids[i] = kernel_thread(splat_rwlock_rd_thr, &rwt[i], 0);
+ rwt[i].rwt_thread = spl_kthread_create(splat_rwlock_rd_thr,
+ &rwt[i], "%s/%d", SPLAT_RWLOCK_TEST_NAME, i);
- if (pids[i] >= 0)
+ if (!IS_ERR(rwt[i].rwt_thread)) {
+ wake_up_process(rwt[i].rwt_thread);
count++;
+ }
}
/* Wait for the writer */