It's the easiest way to avoid complicated locking for metadata access. Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> --- 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html