Commit d7a54e30 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by James Bottomley

[SCSI] sas_scsi_host: Convert to use the kthread API

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 47975477
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
* *
*/ */
#include <linux/kthread.h>
#include "sas_internal.h" #include "sas_internal.h"
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
...@@ -184,7 +186,7 @@ static int sas_queue_up(struct sas_task *task) ...@@ -184,7 +186,7 @@ static int sas_queue_up(struct sas_task *task)
list_add_tail(&task->list, &core->task_queue); list_add_tail(&task->list, &core->task_queue);
core->task_queue_size += 1; core->task_queue_size += 1;
spin_unlock_irqrestore(&core->task_queue_lock, flags); spin_unlock_irqrestore(&core->task_queue_lock, flags);
up(&core->queue_thread_sema); wake_up_process(core->queue_thread);
return 0; return 0;
} }
...@@ -819,7 +821,7 @@ static void sas_queue(struct sas_ha_struct *sas_ha) ...@@ -819,7 +821,7 @@ static void sas_queue(struct sas_ha_struct *sas_ha)
struct sas_internal *i = to_sas_internal(core->shost->transportt); struct sas_internal *i = to_sas_internal(core->shost->transportt);
spin_lock_irqsave(&core->task_queue_lock, flags); spin_lock_irqsave(&core->task_queue_lock, flags);
while (!core->queue_thread_kill && while (!kthread_should_stop() &&
!list_empty(&core->task_queue)) { !list_empty(&core->task_queue)) {
can_queue = sas_ha->lldd_queue_size - core->task_queue_size; can_queue = sas_ha->lldd_queue_size - core->task_queue_size;
...@@ -858,8 +860,6 @@ static void sas_queue(struct sas_ha_struct *sas_ha) ...@@ -858,8 +860,6 @@ static void sas_queue(struct sas_ha_struct *sas_ha)
spin_unlock_irqrestore(&core->task_queue_lock, flags); spin_unlock_irqrestore(&core->task_queue_lock, flags);
} }
static DECLARE_COMPLETION(queue_th_comp);
/** /**
* sas_queue_thread -- The Task Collector thread * sas_queue_thread -- The Task Collector thread
* @_sas_ha: pointer to struct sas_ha * @_sas_ha: pointer to struct sas_ha
...@@ -867,40 +867,33 @@ static DECLARE_COMPLETION(queue_th_comp); ...@@ -867,40 +867,33 @@ static DECLARE_COMPLETION(queue_th_comp);
static int sas_queue_thread(void *_sas_ha) static int sas_queue_thread(void *_sas_ha)
{ {
struct sas_ha_struct *sas_ha = _sas_ha; struct sas_ha_struct *sas_ha = _sas_ha;
struct scsi_core *core = &sas_ha->core;
daemonize("sas_queue_%d", core->shost->host_no);
current->flags |= PF_NOFREEZE; current->flags |= PF_NOFREEZE;
complete(&queue_th_comp);
while (1) { while (1) {
down_interruptible(&core->queue_thread_sema); set_current_state(TASK_INTERRUPTIBLE);
schedule();
sas_queue(sas_ha); sas_queue(sas_ha);
if (core->queue_thread_kill) if (kthread_should_stop())
break; break;
} }
complete(&queue_th_comp);
return 0; return 0;
} }
int sas_init_queue(struct sas_ha_struct *sas_ha) int sas_init_queue(struct sas_ha_struct *sas_ha)
{ {
int res;
struct scsi_core *core = &sas_ha->core; struct scsi_core *core = &sas_ha->core;
spin_lock_init(&core->task_queue_lock); spin_lock_init(&core->task_queue_lock);
core->task_queue_size = 0; core->task_queue_size = 0;
INIT_LIST_HEAD(&core->task_queue); INIT_LIST_HEAD(&core->task_queue);
init_MUTEX_LOCKED(&core->queue_thread_sema);
res = kernel_thread(sas_queue_thread, sas_ha, 0); core->queue_thread = kthread_run(sas_queue_thread, sas_ha,
if (res >= 0) "sas_queue_%d", core->shost->host_no);
wait_for_completion(&queue_th_comp); if (IS_ERR(core->queue_thread))
return PTR_ERR(core->queue_thread);
return res < 0 ? res : 0; return 0;
} }
void sas_shutdown_queue(struct sas_ha_struct *sas_ha) void sas_shutdown_queue(struct sas_ha_struct *sas_ha)
...@@ -909,10 +902,7 @@ void sas_shutdown_queue(struct sas_ha_struct *sas_ha) ...@@ -909,10 +902,7 @@ void sas_shutdown_queue(struct sas_ha_struct *sas_ha)
struct scsi_core *core = &sas_ha->core; struct scsi_core *core = &sas_ha->core;
struct sas_task *task, *n; struct sas_task *task, *n;
init_completion(&queue_th_comp); kthread_stop(core->queue_thread);
core->queue_thread_kill = 1;
up(&core->queue_thread_sema);
wait_for_completion(&queue_th_comp);
if (!list_empty(&core->task_queue)) if (!list_empty(&core->task_queue))
SAS_DPRINTK("HA: %llx: scsi core task queue is NOT empty!?\n", SAS_DPRINTK("HA: %llx: scsi core task queue is NOT empty!?\n",
......
...@@ -314,8 +314,7 @@ struct scsi_core { ...@@ -314,8 +314,7 @@ struct scsi_core {
struct list_head task_queue; struct list_head task_queue;
int task_queue_size; int task_queue_size;
struct semaphore queue_thread_sema; struct task_struct *queue_thread;
int queue_thread_kill;
}; };
struct sas_ha_event { struct sas_ha_event {
......
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