@@ -19,7 +19,7 @@ static DEFINE_MUTEX(init_lock);
1919
2020static struct ksmbd_conn_ops default_conn_ops ;
2121
22- LIST_HEAD (conn_list );
22+ DEFINE_HASHTABLE (conn_list , CONN_HASH_BITS );
2323DECLARE_RWSEM (conn_list_lock );
2424
2525/**
@@ -33,7 +33,7 @@ DECLARE_RWSEM(conn_list_lock);
3333void ksmbd_conn_free (struct ksmbd_conn * conn )
3434{
3535 down_write (& conn_list_lock );
36- list_del (& conn -> conns_list );
36+ hash_del (& conn -> hlist );
3737 up_write (& conn_list_lock );
3838
3939 xa_destroy (& conn -> sessions );
@@ -77,7 +77,6 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
7777
7878 init_waitqueue_head (& conn -> req_running_q );
7979 init_waitqueue_head (& conn -> r_count_q );
80- INIT_LIST_HEAD (& conn -> conns_list );
8180 INIT_LIST_HEAD (& conn -> requests );
8281 INIT_LIST_HEAD (& conn -> async_requests );
8382 spin_lock_init (& conn -> request_lock );
@@ -90,19 +89,17 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
9089
9190 init_rwsem (& conn -> session_lock );
9291
93- down_write (& conn_list_lock );
94- list_add (& conn -> conns_list , & conn_list );
95- up_write (& conn_list_lock );
9692 return conn ;
9793}
9894
9995bool ksmbd_conn_lookup_dialect (struct ksmbd_conn * c )
10096{
10197 struct ksmbd_conn * t ;
98+ int bkt ;
10299 bool ret = false;
103100
104101 down_read (& conn_list_lock );
105- list_for_each_entry ( t , & conn_list , conns_list ) {
102+ hash_for_each ( conn_list , bkt , t , hlist ) {
106103 if (memcmp (t -> ClientGUID , c -> ClientGUID , SMB2_CLIENT_GUID_SIZE ))
107104 continue ;
108105
@@ -163,9 +160,10 @@ void ksmbd_conn_unlock(struct ksmbd_conn *conn)
163160void ksmbd_all_conn_set_status (u64 sess_id , u32 status )
164161{
165162 struct ksmbd_conn * conn ;
163+ int bkt ;
166164
167165 down_read (& conn_list_lock );
168- list_for_each_entry ( conn , & conn_list , conns_list ) {
166+ hash_for_each ( conn_list , bkt , conn , hlist ) {
169167 if (conn -> binding || xa_load (& conn -> sessions , sess_id ))
170168 WRITE_ONCE (conn -> status , status );
171169 }
@@ -181,14 +179,14 @@ int ksmbd_conn_wait_idle_sess_id(struct ksmbd_conn *curr_conn, u64 sess_id)
181179{
182180 struct ksmbd_conn * conn ;
183181 int rc , retry_count = 0 , max_timeout = 120 ;
184- int rcount = 1 ;
182+ int rcount = 1 , bkt ;
185183
186184retry_idle :
187185 if (retry_count >= max_timeout )
188186 return - EIO ;
189187
190188 down_read (& conn_list_lock );
191- list_for_each_entry ( conn , & conn_list , conns_list ) {
189+ hash_for_each ( conn_list , bkt , conn , hlist ) {
192190 if (conn -> binding || xa_load (& conn -> sessions , sess_id )) {
193191 if (conn == curr_conn )
194192 rcount = 2 ;
@@ -480,10 +478,11 @@ static void stop_sessions(void)
480478{
481479 struct ksmbd_conn * conn ;
482480 struct ksmbd_transport * t ;
481+ int bkt ;
483482
484483again :
485484 down_read (& conn_list_lock );
486- list_for_each_entry ( conn , & conn_list , conns_list ) {
485+ hash_for_each ( conn_list , bkt , conn , hlist ) {
487486 t = conn -> transport ;
488487 ksmbd_conn_set_exiting (conn );
489488 if (t -> ops -> shutdown ) {
@@ -494,7 +493,7 @@ static void stop_sessions(void)
494493 }
495494 up_read (& conn_list_lock );
496495
497- if (!list_empty ( & conn_list )) {
496+ if (!hash_empty ( conn_list )) {
498497 msleep (100 );
499498 goto again ;
500499 }
0 commit comments