[stgt] [PATCH 2/3] Change lock that protects per target events list to rwlock

Chandra Seetharaman sekharan at us.ibm.com
Fri Oct 15 06:58:17 CEST 2010


Convert the per thread lock events_lock to a read write lock events_rwlock.
This will help with performance as there are more walk-thru the list
than the add/delete operations.

Signed-off-by: Chandra Seetharaman <sekharan at us.ibm.com>
---
 usr/iscsi/iscsi_tcp.c |   12 ++++++------
 usr/iscsi/iscsid.h    |    2 +-
 usr/iscsi/target.c    |    7 ++++---
 3 files changed, 11 insertions(+), 10 deletions(-)

Index: tgt-thread/usr/iscsi/iscsi_tcp.c
===================================================================
--- tgt-thread.orig/usr/iscsi/iscsi_tcp.c
+++ tgt-thread/usr/iscsi/iscsi_tcp.c
@@ -171,10 +171,10 @@ static void iscsi_tcp_event_handler(int 
 		if (tcp_conn->pthread) {
 			struct iscsi_target *target = conn->session->target;
 
-			pthread_mutex_lock(&target->event_lock);
+			pthread_rwlock_wrlock(&target->event_rwlock);
 			do_tgt_event_del(target->efd, &target->events_list,
 					 tcp_conn->fd);
-			pthread_mutex_unlock(&target->event_lock);
+			pthread_rwlock_unlock(&target->event_rwlock);
 			/* let the main thread handle this */
 			tcp_conn->pthread = 0;
 			tgt_event_add(tcp_conn->fd, EPOLLIN,
@@ -290,13 +290,13 @@ static void iscsi_tcp_conn_nexus_init(st
 
 		tcp_conn->pthread = 1;
 
-		pthread_mutex_lock(&target->event_lock);
+		pthread_rwlock_wrlock(&target->event_rwlock);
 
 		do_tgt_event_add(target->efd, &target->events_list,
 				 tcp_conn->fd, EPOLLIN,
 				 iscsi_tcp_event_handler, conn);
 
-		pthread_mutex_unlock(&target->event_lock);
+		pthread_rwlock_unlock(&target->event_rwlock);
 	} else
 		conn->tp->ep_event_modify(conn, EPOLLIN);
 }
@@ -377,10 +377,10 @@ static void iscsi_event_modify(struct is
 	if (tcp_conn->pthread) {
 		struct iscsi_target *target = conn->session->target;
 
-		pthread_mutex_lock(&target->event_lock);
+		pthread_rwlock_rdlock(&target->event_rwlock);
 		do_tgt_event_modify(target->efd, &target->events_list,
 				    tcp_conn->fd, events);
-		pthread_mutex_unlock(&target->event_lock);
+		pthread_rwlock_unlock(&target->event_rwlock);
 	} else {
 		ret = tgt_event_modify(tcp_conn->fd, events);
 		if (ret)
Index: tgt-thread/usr/iscsi/iscsid.h
===================================================================
--- tgt-thread.orig/usr/iscsi/iscsid.h
+++ tgt-thread/usr/iscsi/iscsid.h
@@ -254,7 +254,7 @@ struct iscsi_target {
 	struct list_head isns_list;
 
 	int efd;
-	pthread_mutex_t event_lock;
+	pthread_rwlock_t event_rwlock;
 	struct list_head events_list;
 
 	pthread_t thread;
Index: tgt-thread/usr/iscsi/target.c
===================================================================
--- tgt-thread.orig/usr/iscsi/target.c
+++ tgt-thread/usr/iscsi/target.c
@@ -385,6 +385,7 @@ void iscsi_target_destroy(int tid)
 
 		pthread_join(target->thread, NULL);
 		pthread_mutex_destroy(&target->bsfin.finished_lock);
+		pthread_rwlock_destroy(&target->event_rwlock);
 	}
 
 	close(target->efd);
@@ -410,14 +411,14 @@ static void *iscsi_thread_fn(void *arg)
 	INIT_LIST_HEAD(&t->bsfin.finished_list);
 
 	t->bsfin.th_id = syscall(SYS_gettid);
-	pthread_mutex_lock(&t->event_lock);
+	pthread_rwlock_wrlock(&t->event_rwlock);
 
 	eprintf("Th_id: %d\n", t->bsfin.th_id);
 
 	do_tgt_event_add(t->efd, &t->events_list, sig_fd, EPOLLIN,
 			bs_sig_request_done, &t->bsfin);
 
-	pthread_mutex_unlock(&t->event_lock);
+	pthread_rwlock_unlock(&t->event_rwlock);
 retry:
 	nevent = epoll_wait(t->efd, events, ARRAY_SIZE(events), 1000);
 	if (nevent < 0) {
@@ -485,7 +486,7 @@ int iscsi_target_create(struct target *t
 	INIT_LIST_HEAD(&target->sessions_list);
 	INIT_LIST_HEAD(&target->isns_list);
 	INIT_LIST_HEAD(&target->events_list);
-	pthread_mutex_init(&target->event_lock, NULL);
+	pthread_rwlock_init(&target->event_rwlock, NULL);
 	target->tid = tid;
 	list_add_tail(&target->tlist, &iscsi_targets_list);
 
--
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