[stgt] [PATCH] ssc: use only one background thread
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Sat Oct 4 12:33:49 CEST 2008
It's the easiest way to avoid complicated locking for metadata access.
Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
usr/bs.c | 13 ++++++++++---
usr/bs_mmap.c | 2 +-
usr/bs_rdwr.c | 2 +-
usr/bs_ssc.c | 2 +-
usr/bs_thread.h | 3 ++-
5 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/usr/bs.c b/usr/bs.c
index cef7b19..e20189f 100644
--- a/usr/bs.c
+++ b/usr/bs.c
@@ -173,7 +173,8 @@ static void *bs_thread_worker_fn(void *arg)
return NULL;
}
-int bs_thread_open(struct bs_thread_info *info, request_func_t *rfn)
+int bs_thread_open(struct bs_thread_info *info, request_func_t *rfn,
+ int nr_threads)
{
int i, ret;
@@ -205,12 +206,18 @@ int bs_thread_open(struct bs_thread_info *info, request_func_t *rfn)
if (ret)
goto event_del;
- for (i = 0; i < ARRAY_SIZE(info->worker_thread); i++) {
+ if (nr_threads > ARRAY_SIZE(info->worker_thread)) {
+ eprintf("too many threads %d\n", nr_threads);
+ nr_threads = ARRAY_SIZE(info->worker_thread);
+ }
+
+ for (i = 0; i < nr_threads; i++) {
ret = pthread_create(&info->worker_thread[i], NULL,
bs_thread_worker_fn, info);
if (ret)
goto destroy_threads;
}
+
rewrite:
ret = write(info->command_fd[1], &ret, sizeof(ret));
if (ret < 0) {
@@ -261,7 +268,7 @@ void bs_thread_close(struct bs_thread_info *info)
info->stop = 1;
pthread_cond_broadcast(&info->pending_cond);
- for (i = 0; i < ARRAY_SIZE(info->worker_thread); i++)
+ for (i = 0; i < info->worker_thread[i]; i++)
pthread_join(info->worker_thread[i], NULL);
pthread_cond_destroy(&info->finished_cond);
diff --git a/usr/bs_mmap.c b/usr/bs_mmap.c
index fff19d3..bb24f5e 100644
--- a/usr/bs_mmap.c
+++ b/usr/bs_mmap.c
@@ -96,7 +96,7 @@ static void bs_mmap_close(struct scsi_lu *lu)
static int bs_mmap_init(struct scsi_lu *lu)
{
struct bs_thread_info *info = BS_THREAD_I(lu);
- return bs_thread_open(info, bs_mmap_request);
+ return bs_thread_open(info, bs_mmap_request, NR_WORKER_THREADS);
}
static void bs_mmap_exit(struct scsi_lu *lu)
diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
index e2ece4a..65a6136 100644
--- a/usr/bs_rdwr.c
+++ b/usr/bs_rdwr.c
@@ -147,7 +147,7 @@ static int bs_rdwr_init(struct scsi_lu *lu)
{
struct bs_thread_info *info = BS_THREAD_I(lu);
- return bs_thread_open(info, bs_rdwr_request);
+ return bs_thread_open(info, bs_rdwr_request, NR_WORKER_THREADS);
}
static void bs_rdwr_exit(struct scsi_lu *lu)
diff --git a/usr/bs_ssc.c b/usr/bs_ssc.c
index dcc3e30..b2e8818 100644
--- a/usr/bs_ssc.c
+++ b/usr/bs_ssc.c
@@ -208,7 +208,7 @@ static void bs_ssc_close(struct scsi_lu *lu)
static int bs_ssc_init(struct scsi_lu *lu)
{
struct bs_thread_info *info = BS_THREAD_I(lu);
- return bs_thread_open(info, ssc_rdwr_request);
+ return bs_thread_open(info, ssc_rdwr_request, 1);
}
static void bs_ssc_exit(struct scsi_lu *lu)
diff --git a/usr/bs_thread.h b/usr/bs_thread.h
index b97861c..b2975a5 100644
--- a/usr/bs_thread.h
+++ b/usr/bs_thread.h
@@ -33,7 +33,8 @@ static inline struct bs_thread_info *BS_THREAD_I(struct scsi_lu *lu)
return (struct bs_thread_info *) ((char *)lu + sizeof(*lu));
}
-extern int bs_thread_open(struct bs_thread_info *info, request_func_t *rfn);
+extern int bs_thread_open(struct bs_thread_info *info, request_func_t *rfn,
+ int nr_threads);
extern void bs_thread_close(struct bs_thread_info *info);
extern int bs_thread_cmd_submit(struct scsi_cmd *cmd);
--
1.5.6.5
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list