@@ -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 );
@@ -78,7 +78,6 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
7878
7979 init_waitqueue_head (& conn -> req_running_q );
8080 init_waitqueue_head (& conn -> r_count_q );
81- INIT_LIST_HEAD (& conn -> conns_list );
8281 INIT_LIST_HEAD (& conn -> requests );
8382 INIT_LIST_HEAD (& conn -> async_requests );
8483 spin_lock_init (& conn -> request_lock );
@@ -91,19 +90,17 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
9190
9291 init_rwsem (& conn -> session_lock );
9392
94- down_write (& conn_list_lock );
95- list_add (& conn -> conns_list , & conn_list );
96- up_write (& conn_list_lock );
9793 return conn ;
9894}
9995
10096bool ksmbd_conn_lookup_dialect (struct ksmbd_conn * c )
10197{
10298 struct ksmbd_conn * t ;
99+ int bkt ;
103100 bool ret = false;
104101
105102 down_read (& conn_list_lock );
106- list_for_each_entry ( t , & conn_list , conns_list ) {
103+ hash_for_each ( conn_list , bkt , t , hlist ) {
107104 if (memcmp (t -> ClientGUID , c -> ClientGUID , SMB2_CLIENT_GUID_SIZE ))
108105 continue ;
109106
@@ -164,9 +161,10 @@ void ksmbd_conn_unlock(struct ksmbd_conn *conn)
164161void ksmbd_all_conn_set_status (u64 sess_id , u32 status )
165162{
166163 struct ksmbd_conn * conn ;
164+ int bkt ;
167165
168166 down_read (& conn_list_lock );
169- list_for_each_entry ( conn , & conn_list , conns_list ) {
167+ hash_for_each ( conn_list , bkt , conn , hlist ) {
170168 if (conn -> binding || xa_load (& conn -> sessions , sess_id ))
171169 WRITE_ONCE (conn -> status , status );
172170 }
@@ -182,14 +180,14 @@ int ksmbd_conn_wait_idle_sess_id(struct ksmbd_conn *curr_conn, u64 sess_id)
182180{
183181 struct ksmbd_conn * conn ;
184182 int rc , retry_count = 0 , max_timeout = 120 ;
185- int rcount = 1 ;
183+ int rcount = 1 , bkt ;
186184
187185retry_idle :
188186 if (retry_count >= max_timeout )
189187 return - EIO ;
190188
191189 down_read (& conn_list_lock );
192- list_for_each_entry ( conn , & conn_list , conns_list ) {
190+ hash_for_each ( conn_list , bkt , conn , hlist ) {
193191 if (conn -> binding || xa_load (& conn -> sessions , sess_id )) {
194192 if (conn == curr_conn )
195193 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