Commit 392c8801 authored by Philipp Reisner's avatar Philipp Reisner

drbd: drbd_thread has now a pointer to a tconn instead of to a mdev

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 19393e10
...@@ -119,9 +119,9 @@ static void __bm_print_lock_info(struct drbd_conf *mdev, const char *func) ...@@ -119,9 +119,9 @@ static void __bm_print_lock_info(struct drbd_conf *mdev, const char *func)
if (!__ratelimit(&drbd_ratelimit_state)) if (!__ratelimit(&drbd_ratelimit_state))
return; return;
dev_err(DEV, "FIXME %s in %s, bitmap locked for '%s' by %s\n", dev_err(DEV, "FIXME %s in %s, bitmap locked for '%s' by %s\n",
drbd_task_to_thread_name(mdev, current), drbd_task_to_thread_name(mdev->tconn, current),
func, b->bm_why ?: "?", func, b->bm_why ?: "?",
drbd_task_to_thread_name(mdev, b->bm_task)); drbd_task_to_thread_name(mdev->tconn, b->bm_task));
} }
void drbd_bm_lock(struct drbd_conf *mdev, char *why, enum bm_flag flags) void drbd_bm_lock(struct drbd_conf *mdev, char *why, enum bm_flag flags)
...@@ -138,9 +138,9 @@ void drbd_bm_lock(struct drbd_conf *mdev, char *why, enum bm_flag flags) ...@@ -138,9 +138,9 @@ void drbd_bm_lock(struct drbd_conf *mdev, char *why, enum bm_flag flags)
if (trylock_failed) { if (trylock_failed) {
dev_warn(DEV, "%s going to '%s' but bitmap already locked for '%s' by %s\n", dev_warn(DEV, "%s going to '%s' but bitmap already locked for '%s' by %s\n",
drbd_task_to_thread_name(mdev, current), drbd_task_to_thread_name(mdev->tconn, current),
why, b->bm_why ?: "?", why, b->bm_why ?: "?",
drbd_task_to_thread_name(mdev, b->bm_task)); drbd_task_to_thread_name(mdev->tconn, b->bm_task));
mutex_lock(&b->bm_change); mutex_lock(&b->bm_change);
} }
if (BM_LOCKED_MASK & b->bm_flags) if (BM_LOCKED_MASK & b->bm_flags)
......
...@@ -625,7 +625,7 @@ struct drbd_thread { ...@@ -625,7 +625,7 @@ struct drbd_thread {
struct completion stop; struct completion stop;
enum drbd_thread_state t_state; enum drbd_thread_state t_state;
int (*function) (struct drbd_thread *); int (*function) (struct drbd_thread *);
struct drbd_conf *mdev; struct drbd_tconn *tconn;
int reset_cpu_mask; int reset_cpu_mask;
char name[9]; char name[9];
}; };
...@@ -1151,7 +1151,7 @@ enum dds_flags { ...@@ -1151,7 +1151,7 @@ enum dds_flags {
extern void drbd_init_set_defaults(struct drbd_conf *mdev); extern void drbd_init_set_defaults(struct drbd_conf *mdev);
extern int drbd_thread_start(struct drbd_thread *thi); extern int drbd_thread_start(struct drbd_thread *thi);
extern void _drbd_thread_stop(struct drbd_thread *thi, int restart, int wait); extern void _drbd_thread_stop(struct drbd_thread *thi, int restart, int wait);
extern char *drbd_task_to_thread_name(struct drbd_conf *mdev, struct task_struct *task); extern char *drbd_task_to_thread_name(struct drbd_tconn *tconn, struct task_struct *task);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern void drbd_thread_current_set_cpu(struct drbd_thread *thi); extern void drbd_thread_current_set_cpu(struct drbd_thread *thi);
extern void drbd_calc_cpu_mask(struct drbd_tconn *tconn); extern void drbd_calc_cpu_mask(struct drbd_tconn *tconn);
......
...@@ -442,12 +442,12 @@ void tl_restart(struct drbd_conf *mdev, enum drbd_req_event what) ...@@ -442,12 +442,12 @@ void tl_restart(struct drbd_conf *mdev, enum drbd_req_event what)
static int drbd_thread_setup(void *arg) static int drbd_thread_setup(void *arg)
{ {
struct drbd_thread *thi = (struct drbd_thread *) arg; struct drbd_thread *thi = (struct drbd_thread *) arg;
struct drbd_conf *mdev = thi->mdev; struct drbd_tconn *tconn = thi->tconn;
unsigned long flags; unsigned long flags;
int retval; int retval;
snprintf(current->comm, sizeof(current->comm), "drbd_%c_%s", snprintf(current->comm, sizeof(current->comm), "drbd_%c_%s",
thi->name[0], thi->mdev->tconn->name); thi->name[0], thi->tconn->name);
restart: restart:
retval = thi->function(thi); retval = thi->function(thi);
...@@ -465,7 +465,7 @@ static int drbd_thread_setup(void *arg) ...@@ -465,7 +465,7 @@ static int drbd_thread_setup(void *arg)
*/ */
if (thi->t_state == RESTARTING) { if (thi->t_state == RESTARTING) {
dev_info(DEV, "Restarting %s thread\n", thi->name); conn_info(tconn, "Restarting %s thread\n", thi->name);
thi->t_state = RUNNING; thi->t_state = RUNNING;
spin_unlock_irqrestore(&thi->t_lock, flags); spin_unlock_irqrestore(&thi->t_lock, flags);
goto restart; goto restart;
...@@ -477,27 +477,27 @@ static int drbd_thread_setup(void *arg) ...@@ -477,27 +477,27 @@ static int drbd_thread_setup(void *arg)
complete(&thi->stop); complete(&thi->stop);
spin_unlock_irqrestore(&thi->t_lock, flags); spin_unlock_irqrestore(&thi->t_lock, flags);
dev_info(DEV, "Terminating %s\n", current->comm); conn_info(tconn, "Terminating %s\n", current->comm);
/* Release mod reference taken when thread was started */ /* Release mod reference taken when thread was started */
module_put(THIS_MODULE); module_put(THIS_MODULE);
return retval; return retval;
} }
static void drbd_thread_init(struct drbd_conf *mdev, struct drbd_thread *thi, static void drbd_thread_init(struct drbd_tconn *tconn, struct drbd_thread *thi,
int (*func) (struct drbd_thread *), char *name) int (*func) (struct drbd_thread *), char *name)
{ {
spin_lock_init(&thi->t_lock); spin_lock_init(&thi->t_lock);
thi->task = NULL; thi->task = NULL;
thi->t_state = NONE; thi->t_state = NONE;
thi->function = func; thi->function = func;
thi->mdev = mdev; thi->tconn = tconn;
strncpy(thi->name, name, ARRAY_SIZE(thi->name)); strncpy(thi->name, name, ARRAY_SIZE(thi->name));
} }
int drbd_thread_start(struct drbd_thread *thi) int drbd_thread_start(struct drbd_thread *thi)
{ {
struct drbd_conf *mdev = thi->mdev; struct drbd_tconn *tconn = thi->tconn;
struct task_struct *nt; struct task_struct *nt;
unsigned long flags; unsigned long flags;
...@@ -507,28 +507,27 @@ int drbd_thread_start(struct drbd_thread *thi) ...@@ -507,28 +507,27 @@ int drbd_thread_start(struct drbd_thread *thi)
switch (thi->t_state) { switch (thi->t_state) {
case NONE: case NONE:
dev_info(DEV, "Starting %s thread (from %s [%d])\n", conn_info(tconn, "Starting %s thread (from %s [%d])\n",
thi->name, current->comm, current->pid); thi->name, current->comm, current->pid);
/* Get ref on module for thread - this is released when thread exits */ /* Get ref on module for thread - this is released when thread exits */
if (!try_module_get(THIS_MODULE)) { if (!try_module_get(THIS_MODULE)) {
dev_err(DEV, "Failed to get module reference in drbd_thread_start\n"); conn_err(tconn, "Failed to get module reference in drbd_thread_start\n");
spin_unlock_irqrestore(&thi->t_lock, flags); spin_unlock_irqrestore(&thi->t_lock, flags);
return false; return false;
} }
init_completion(&thi->stop); init_completion(&thi->stop);
D_ASSERT(thi->task == NULL);
thi->reset_cpu_mask = 1; thi->reset_cpu_mask = 1;
thi->t_state = RUNNING; thi->t_state = RUNNING;
spin_unlock_irqrestore(&thi->t_lock, flags); spin_unlock_irqrestore(&thi->t_lock, flags);
flush_signals(current); /* otherw. may get -ERESTARTNOINTR */ flush_signals(current); /* otherw. may get -ERESTARTNOINTR */
nt = kthread_create(drbd_thread_setup, (void *) thi, nt = kthread_create(drbd_thread_setup, (void *) thi,
"drbd%d_%s", mdev_to_minor(mdev), thi->name); "drbd_%c_%s", thi->name[0], thi->tconn->name);
if (IS_ERR(nt)) { if (IS_ERR(nt)) {
dev_err(DEV, "Couldn't start thread\n"); conn_err(tconn, "Couldn't start thread\n");
module_put(THIS_MODULE); module_put(THIS_MODULE);
return false; return false;
...@@ -541,7 +540,7 @@ int drbd_thread_start(struct drbd_thread *thi) ...@@ -541,7 +540,7 @@ int drbd_thread_start(struct drbd_thread *thi)
break; break;
case EXITING: case EXITING:
thi->t_state = RESTARTING; thi->t_state = RESTARTING;
dev_info(DEV, "Restarting %s thread (from %s [%d])\n", conn_info(tconn, "Restarting %s thread (from %s [%d])\n",
thi->name, current->comm, current->pid); thi->name, current->comm, current->pid);
/* fall through */ /* fall through */
case RUNNING: case RUNNING:
...@@ -582,7 +581,6 @@ void _drbd_thread_stop(struct drbd_thread *thi, int restart, int wait) ...@@ -582,7 +581,6 @@ void _drbd_thread_stop(struct drbd_thread *thi, int restart, int wait)
init_completion(&thi->stop); init_completion(&thi->stop);
if (thi->task != current) if (thi->task != current)
force_sig(DRBD_SIGKILL, thi->task); force_sig(DRBD_SIGKILL, thi->task);
} }
spin_unlock_irqrestore(&thi->t_lock, flags); spin_unlock_irqrestore(&thi->t_lock, flags);
...@@ -591,9 +589,8 @@ void _drbd_thread_stop(struct drbd_thread *thi, int restart, int wait) ...@@ -591,9 +589,8 @@ void _drbd_thread_stop(struct drbd_thread *thi, int restart, int wait)
wait_for_completion(&thi->stop); wait_for_completion(&thi->stop);
} }
static struct drbd_thread *drbd_task_to_thread(struct drbd_conf *mdev, struct task_struct *task) static struct drbd_thread *drbd_task_to_thread(struct drbd_tconn *tconn, struct task_struct *task)
{ {
struct drbd_tconn *tconn = mdev->tconn;
struct drbd_thread *thi = struct drbd_thread *thi =
task == tconn->receiver.task ? &tconn->receiver : task == tconn->receiver.task ? &tconn->receiver :
task == tconn->asender.task ? &tconn->asender : task == tconn->asender.task ? &tconn->asender :
...@@ -602,9 +599,9 @@ static struct drbd_thread *drbd_task_to_thread(struct drbd_conf *mdev, struct ta ...@@ -602,9 +599,9 @@ static struct drbd_thread *drbd_task_to_thread(struct drbd_conf *mdev, struct ta
return thi; return thi;
} }
char *drbd_task_to_thread_name(struct drbd_conf *mdev, struct task_struct *task) char *drbd_task_to_thread_name(struct drbd_tconn *tconn, struct task_struct *task)
{ {
struct drbd_thread *thi = drbd_task_to_thread(mdev, task); struct drbd_thread *thi = drbd_task_to_thread(tconn, task);
return thi ? thi->name : task->comm; return thi ? thi->name : task->comm;
} }
...@@ -656,7 +653,7 @@ void drbd_thread_current_set_cpu(struct drbd_thread *thi) ...@@ -656,7 +653,7 @@ void drbd_thread_current_set_cpu(struct drbd_thread *thi)
if (!thi->reset_cpu_mask) if (!thi->reset_cpu_mask)
return; return;
thi->reset_cpu_mask = 0; thi->reset_cpu_mask = 0;
set_cpus_allowed_ptr(p, thi->mdev->tconn->cpu_mask); set_cpus_allowed_ptr(p, thi->tconn->cpu_mask);
} }
#endif #endif
...@@ -1866,10 +1863,6 @@ void drbd_init_set_defaults(struct drbd_conf *mdev) ...@@ -1866,10 +1863,6 @@ void drbd_init_set_defaults(struct drbd_conf *mdev)
init_waitqueue_head(&mdev->al_wait); init_waitqueue_head(&mdev->al_wait);
init_waitqueue_head(&mdev->seq_wait); init_waitqueue_head(&mdev->seq_wait);
drbd_thread_init(mdev, &mdev->tconn->receiver, drbdd_init, "receiver");
drbd_thread_init(mdev, &mdev->tconn->worker, drbd_worker, "worker");
drbd_thread_init(mdev, &mdev->tconn->asender, drbd_asender, "asender");
/* mdev->tconn->agreed_pro_version gets initialized in drbd_connect() */ /* mdev->tconn->agreed_pro_version gets initialized in drbd_connect() */
mdev->write_ordering = WO_bdev_flush; mdev->write_ordering = WO_bdev_flush;
mdev->resync_wenr = LC_FREE; mdev->resync_wenr = LC_FREE;
...@@ -2202,6 +2195,10 @@ struct drbd_tconn *drbd_new_tconn(char *name) ...@@ -2202,6 +2195,10 @@ struct drbd_tconn *drbd_new_tconn(char *name)
init_waitqueue_head(&tconn->net_cnt_wait); init_waitqueue_head(&tconn->net_cnt_wait);
idr_init(&tconn->volumes); idr_init(&tconn->volumes);
drbd_thread_init(tconn, &tconn->receiver, drbdd_init, "receiver");
drbd_thread_init(tconn, &tconn->worker, drbd_worker, "worker");
drbd_thread_init(tconn, &tconn->asender, drbd_asender, "asender");
write_lock_irq(&global_state_lock); write_lock_irq(&global_state_lock);
list_add(&tconn->all_tconn, &drbd_tconns); list_add(&tconn->all_tconn, &drbd_tconns);
write_unlock_irq(&global_state_lock); write_unlock_irq(&global_state_lock);
......
...@@ -4224,7 +4224,7 @@ static int drbd_do_auth(struct drbd_tconn *tconn) ...@@ -4224,7 +4224,7 @@ static int drbd_do_auth(struct drbd_tconn *tconn)
int drbdd_init(struct drbd_thread *thi) int drbdd_init(struct drbd_thread *thi)
{ {
struct drbd_tconn *tconn = thi->mdev->tconn; struct drbd_tconn *tconn = thi->tconn;
int h; int h;
conn_info(tconn, "receiver (re)started\n"); conn_info(tconn, "receiver (re)started\n");
...@@ -4591,7 +4591,7 @@ static int tconn_process_done_ee(struct drbd_tconn *tconn) ...@@ -4591,7 +4591,7 @@ static int tconn_process_done_ee(struct drbd_tconn *tconn)
int drbd_asender(struct drbd_thread *thi) int drbd_asender(struct drbd_thread *thi)
{ {
struct drbd_tconn *tconn = thi->mdev->tconn; struct drbd_tconn *tconn = thi->tconn;
struct p_header *h = &tconn->meta.rbuf.header; struct p_header *h = &tconn->meta.rbuf.header;
struct asender_cmd *cmd = NULL; struct asender_cmd *cmd = NULL;
struct packet_info pi; struct packet_info pi;
......
...@@ -1643,7 +1643,7 @@ static int _worker_dying(int vnr, void *p, void *data) ...@@ -1643,7 +1643,7 @@ static int _worker_dying(int vnr, void *p, void *data)
int drbd_worker(struct drbd_thread *thi) int drbd_worker(struct drbd_thread *thi)
{ {
struct drbd_tconn *tconn = thi->mdev->tconn; struct drbd_tconn *tconn = thi->tconn;
struct drbd_work *w = NULL; struct drbd_work *w = NULL;
LIST_HEAD(work_list); LIST_HEAD(work_list);
int intr = 0; int intr = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment