Lines Matching full:conn
28 * @conn: connection instance to be cleaned up
30 * During the thread termination, the corresponding conn instance
31 * resources(sock/memory) are released and finally the conn object is freed.
33 void ksmbd_conn_free(struct ksmbd_conn *conn) in ksmbd_conn_free() argument
36 list_del(&conn->conns_list); in ksmbd_conn_free()
39 xa_destroy(&conn->sessions); in ksmbd_conn_free()
40 kvfree(conn->request_buf); in ksmbd_conn_free()
41 kfree(conn->preauth_info); in ksmbd_conn_free()
42 if (atomic_dec_and_test(&conn->refcnt)) { in ksmbd_conn_free()
43 ksmbd_free_transport(conn->transport); in ksmbd_conn_free()
44 kfree(conn); in ksmbd_conn_free()
55 struct ksmbd_conn *conn; in ksmbd_conn_alloc() local
57 conn = kzalloc(sizeof(struct ksmbd_conn), KSMBD_DEFAULT_GFP); in ksmbd_conn_alloc()
58 if (!conn) in ksmbd_conn_alloc()
61 conn->need_neg = true; in ksmbd_conn_alloc()
62 ksmbd_conn_set_new(conn); in ksmbd_conn_alloc()
63 conn->local_nls = load_nls("utf8"); in ksmbd_conn_alloc()
64 if (!conn->local_nls) in ksmbd_conn_alloc()
65 conn->local_nls = load_nls_default(); in ksmbd_conn_alloc()
67 conn->um = utf8_load(UNICODE_AGE(12, 1, 0)); in ksmbd_conn_alloc()
69 conn->um = ERR_PTR(-EOPNOTSUPP); in ksmbd_conn_alloc()
70 if (IS_ERR(conn->um)) in ksmbd_conn_alloc()
71 conn->um = NULL; in ksmbd_conn_alloc()
72 atomic_set(&conn->req_running, 0); in ksmbd_conn_alloc()
73 atomic_set(&conn->r_count, 0); in ksmbd_conn_alloc()
74 atomic_set(&conn->refcnt, 1); in ksmbd_conn_alloc()
75 conn->total_credits = 1; in ksmbd_conn_alloc()
76 conn->outstanding_credits = 0; in ksmbd_conn_alloc()
78 init_waitqueue_head(&conn->req_running_q); in ksmbd_conn_alloc()
79 init_waitqueue_head(&conn->r_count_q); in ksmbd_conn_alloc()
80 INIT_LIST_HEAD(&conn->conns_list); in ksmbd_conn_alloc()
81 INIT_LIST_HEAD(&conn->requests); in ksmbd_conn_alloc()
82 INIT_LIST_HEAD(&conn->async_requests); in ksmbd_conn_alloc()
83 spin_lock_init(&conn->request_lock); in ksmbd_conn_alloc()
84 spin_lock_init(&conn->credits_lock); in ksmbd_conn_alloc()
85 ida_init(&conn->async_ida); in ksmbd_conn_alloc()
86 xa_init(&conn->sessions); in ksmbd_conn_alloc()
88 spin_lock_init(&conn->llist_lock); in ksmbd_conn_alloc()
89 INIT_LIST_HEAD(&conn->lock_list); in ksmbd_conn_alloc()
91 init_rwsem(&conn->session_lock); in ksmbd_conn_alloc()
94 list_add(&conn->conns_list, &conn_list); in ksmbd_conn_alloc()
96 return conn; in ksmbd_conn_alloc()
118 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_enqueue_request() local
121 if (conn->ops->get_cmd_val(work) != SMB2_CANCEL_HE) in ksmbd_conn_enqueue_request()
122 requests_queue = &conn->requests; in ksmbd_conn_enqueue_request()
124 atomic_inc(&conn->req_running); in ksmbd_conn_enqueue_request()
126 spin_lock(&conn->request_lock); in ksmbd_conn_enqueue_request()
128 spin_unlock(&conn->request_lock); in ksmbd_conn_enqueue_request()
134 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_try_dequeue_request() local
136 atomic_dec(&conn->req_running); in ksmbd_conn_try_dequeue_request()
137 if (waitqueue_active(&conn->req_running_q)) in ksmbd_conn_try_dequeue_request()
138 wake_up(&conn->req_running_q); in ksmbd_conn_try_dequeue_request()
144 spin_lock(&conn->request_lock); in ksmbd_conn_try_dequeue_request()
146 spin_unlock(&conn->request_lock); in ksmbd_conn_try_dequeue_request()
150 wake_up_all(&conn->req_running_q); in ksmbd_conn_try_dequeue_request()
153 void ksmbd_conn_lock(struct ksmbd_conn *conn) in ksmbd_conn_lock() argument
155 mutex_lock(&conn->srv_mutex); in ksmbd_conn_lock()
158 void ksmbd_conn_unlock(struct ksmbd_conn *conn) in ksmbd_conn_unlock() argument
160 mutex_unlock(&conn->srv_mutex); in ksmbd_conn_unlock()
165 struct ksmbd_conn *conn; in ksmbd_all_conn_set_status() local
168 list_for_each_entry(conn, &conn_list, conns_list) { in ksmbd_all_conn_set_status()
169 if (conn->binding || xa_load(&conn->sessions, sess_id)) in ksmbd_all_conn_set_status()
170 WRITE_ONCE(conn->status, status); in ksmbd_all_conn_set_status()
175 void ksmbd_conn_wait_idle(struct ksmbd_conn *conn) in ksmbd_conn_wait_idle() argument
177 wait_event(conn->req_running_q, atomic_read(&conn->req_running) < 2); in ksmbd_conn_wait_idle()
182 struct ksmbd_conn *conn; in ksmbd_conn_wait_idle_sess_id() local
191 list_for_each_entry(conn, &conn_list, conns_list) { in ksmbd_conn_wait_idle_sess_id()
192 if (conn->binding || xa_load(&conn->sessions, sess_id)) { in ksmbd_conn_wait_idle_sess_id()
193 if (conn == curr_conn) in ksmbd_conn_wait_idle_sess_id()
195 if (atomic_read(&conn->req_running) >= rcount) { in ksmbd_conn_wait_idle_sess_id()
196 rc = wait_event_timeout(conn->req_running_q, in ksmbd_conn_wait_idle_sess_id()
197 atomic_read(&conn->req_running) < rcount, in ksmbd_conn_wait_idle_sess_id()
214 struct ksmbd_conn *conn = work->conn; in ksmbd_conn_write() local
228 ksmbd_conn_lock(conn); in ksmbd_conn_write()
229 sent = conn->transport->ops->writev(conn->transport, work->iov, in ksmbd_conn_write()
234 ksmbd_conn_unlock(conn); in ksmbd_conn_write()
244 int ksmbd_conn_rdma_read(struct ksmbd_conn *conn, in ksmbd_conn_rdma_read() argument
251 if (conn->transport->ops->rdma_read) in ksmbd_conn_rdma_read()
252 ret = conn->transport->ops->rdma_read(conn->transport, in ksmbd_conn_rdma_read()
258 int ksmbd_conn_rdma_write(struct ksmbd_conn *conn, in ksmbd_conn_rdma_write() argument
265 if (conn->transport->ops->rdma_write) in ksmbd_conn_rdma_write()
266 ret = conn->transport->ops->rdma_write(conn->transport, in ksmbd_conn_rdma_write()
272 bool ksmbd_conn_alive(struct ksmbd_conn *conn) in ksmbd_conn_alive() argument
277 if (ksmbd_conn_exiting(conn)) in ksmbd_conn_alive()
283 if (atomic_read(&conn->stats.open_files_count) > 0) in ksmbd_conn_alive()
292 time_after(jiffies, conn->last_active + server_conf.deadtime)) { in ksmbd_conn_alive()
293 ksmbd_debug(CONN, "No response from client in %lu minutes\n", in ksmbd_conn_alive()
313 struct ksmbd_conn *conn = (struct ksmbd_conn *)p; in ksmbd_conn_handler_loop() local
314 struct ksmbd_transport *t = conn->transport; in ksmbd_conn_handler_loop()
319 mutex_init(&conn->srv_mutex); in ksmbd_conn_handler_loop()
326 conn->last_active = jiffies; in ksmbd_conn_handler_loop()
328 while (ksmbd_conn_alive(conn)) { in ksmbd_conn_handler_loop()
332 kvfree(conn->request_buf); in ksmbd_conn_handler_loop()
333 conn->request_buf = NULL; in ksmbd_conn_handler_loop()
336 if (atomic_read(&conn->req_running) + 1 > max_req) { in ksmbd_conn_handler_loop()
337 wait_event_interruptible(conn->req_running_q, in ksmbd_conn_handler_loop()
338 atomic_read(&conn->req_running) < max_req); in ksmbd_conn_handler_loop()
347 ksmbd_debug(CONN, "RFC1002 header %u bytes\n", pdu_size); in ksmbd_conn_handler_loop()
349 if (ksmbd_conn_good(conn)) in ksmbd_conn_handler_loop()
351 SMB3_MAX_MSGSIZE + conn->vals->max_write_size; in ksmbd_conn_handler_loop()
358 READ_ONCE(conn->status)); in ksmbd_conn_handler_loop()
374 conn->request_buf = kvmalloc(size, KSMBD_DEFAULT_GFP); in ksmbd_conn_handler_loop()
375 if (!conn->request_buf) in ksmbd_conn_handler_loop()
378 memcpy(conn->request_buf, hdr_buf, sizeof(hdr_buf)); in ksmbd_conn_handler_loop()
384 size = t->ops->read(t, conn->request_buf + 4, pdu_size, 2); in ksmbd_conn_handler_loop()
396 if (!ksmbd_smb_request(conn)) in ksmbd_conn_handler_loop()
399 if (((struct smb2_hdr *)smb2_get_msg(conn->request_buf))->ProtocolId == in ksmbd_conn_handler_loop()
410 if (default_conn_ops.process_fn(conn)) { in ksmbd_conn_handler_loop()
417 ksmbd_conn_set_releasing(conn); in ksmbd_conn_handler_loop()
419 ksmbd_debug(CONN, "Wait for all pending requests(%d)\n", atomic_read(&conn->r_count)); in ksmbd_conn_handler_loop()
420 wait_event(conn->r_count_q, atomic_read(&conn->r_count) == 0); in ksmbd_conn_handler_loop()
423 utf8_unload(conn->um); in ksmbd_conn_handler_loop()
424 unload_nls(conn->local_nls); in ksmbd_conn_handler_loop()
426 default_conn_ops.terminate_fn(conn); in ksmbd_conn_handler_loop()
438 void ksmbd_conn_r_count_inc(struct ksmbd_conn *conn) in ksmbd_conn_r_count_inc() argument
440 atomic_inc(&conn->r_count); in ksmbd_conn_r_count_inc()
443 void ksmbd_conn_r_count_dec(struct ksmbd_conn *conn) in ksmbd_conn_r_count_dec() argument
450 atomic_inc(&conn->refcnt); in ksmbd_conn_r_count_dec()
451 if (!atomic_dec_return(&conn->r_count) && waitqueue_active(&conn->r_count_q)) in ksmbd_conn_r_count_dec()
452 wake_up(&conn->r_count_q); in ksmbd_conn_r_count_dec()
454 if (atomic_dec_and_test(&conn->refcnt)) in ksmbd_conn_r_count_dec()
455 kfree(conn); in ksmbd_conn_r_count_dec()
481 struct ksmbd_conn *conn; in stop_sessions() local
486 list_for_each_entry(conn, &conn_list, conns_list) { in stop_sessions()
487 t = conn->transport; in stop_sessions()
488 ksmbd_conn_set_exiting(conn); in stop_sessions()