RDMA/rtrs-srv: Destroy path files after making sure no IOs in-flight
[ Upstream commit c4d32e77fc1006f99eeb78417efc3d81a384072a ]
Destroying path files may lead to the freeing of rdma_stats. This creates
the following race.
An IO is in-flight, or has just passed the session state check in
process_read/process_write. The close_work gets triggered and the function
rtrs_srv_close_work() starts and does destroy path which frees the
rdma_stats. After this the function process_read/process_write resumes and
tries to update the stats through the function rtrs_srv_update_rdma_stats
This commit solves the problem by moving the destroy path function to a
later point. This point makes sure any inflights are completed. This is
done by qp drain, and waiting for all in-flights through ops_id.
Fixes: 9cb8374804
("RDMA/rtrs: server: main functionality")
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Santosh Kumar Pradhan <santosh.pradhan@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
Link: https://lore.kernel.org/r/20231120154146.920486-6-haris.iqbal@ionos.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
7be574c34d
commit
233c32bcf0
|
@ -1537,7 +1537,6 @@ static void rtrs_srv_close_work(struct work_struct *work)
|
||||||
|
|
||||||
srv_path = container_of(work, typeof(*srv_path), close_work);
|
srv_path = container_of(work, typeof(*srv_path), close_work);
|
||||||
|
|
||||||
rtrs_srv_destroy_path_files(srv_path);
|
|
||||||
rtrs_srv_stop_hb(srv_path);
|
rtrs_srv_stop_hb(srv_path);
|
||||||
|
|
||||||
for (i = 0; i < srv_path->s.con_num; i++) {
|
for (i = 0; i < srv_path->s.con_num; i++) {
|
||||||
|
@ -1557,6 +1556,8 @@ static void rtrs_srv_close_work(struct work_struct *work)
|
||||||
/* Wait for all completion */
|
/* Wait for all completion */
|
||||||
wait_for_completion(&srv_path->complete_done);
|
wait_for_completion(&srv_path->complete_done);
|
||||||
|
|
||||||
|
rtrs_srv_destroy_path_files(srv_path);
|
||||||
|
|
||||||
/* Notify upper layer if we are the last path */
|
/* Notify upper layer if we are the last path */
|
||||||
rtrs_srv_path_down(srv_path);
|
rtrs_srv_path_down(srv_path);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue