From: Gioh Kim <gi-oh.kim@xxxxxxxxxxxxxxx> If the fault-injection is enabled, it does not send a heart-beat and generates the error on the client side. Signed-off-by: Gioh Kim <gi-oh.kim@xxxxxxxxxxxxxxx> Signed-off-by: Jack Wang <jinpu.wang@xxxxxxxxxxxxxxx> --- drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c | 44 ++++++++++++++++++++ drivers/infiniband/ulp/rtrs/rtrs-srv.c | 5 +++ drivers/infiniband/ulp/rtrs/rtrs-srv.h | 13 ++++++ 3 files changed, 62 insertions(+) diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c index a9288175fbb5..57af9e7c3588 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c @@ -309,3 +309,47 @@ void rtrs_srv_destroy_sess_files(struct rtrs_srv_sess *sess) rtrs_srv_destroy_once_sysfs_root_folders(sess); } } + +#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS +void rtrs_srv_fault_inject_init(struct rtrs_srv_fault_inject *fault_inject, + struct rtrs_srv_sess *sess) +{ + char str[NAME_MAX]; + int cnt; + + cnt = sockaddr_to_str((struct sockaddr *)&sess->s.src_addr, + str, sizeof(str)); + cnt += scnprintf(str + cnt, sizeof(str) - cnt, "@"); + sockaddr_to_str((struct sockaddr *)&sess->s.dst_addr, + str + cnt, sizeof(str) - cnt); + + rtrs_fault_inject_init(&fault_inject->fj, str, -EBUSY); + /* injection points */ + rtrs_fault_inject_add(fault_inject->fj.dir, + "fail-hb-ack", &fault_inject->fail_hb_ack); +} + +void rtrs_srv_fault_inject_final(struct rtrs_srv_fault_inject *fault_inject) +{ + rtrs_fault_inject_final(&fault_inject->fj); +} + +int rtrs_should_fail_hb_ack(struct rtrs_srv_fault_inject *fault_inject) +{ + if (fault_inject->fail_hb_ack && should_fail(&fault_inject->fj.attr, 1)) + return fault_inject->fj.status; + return 0; +} +#else +void rtrs_srv_fault_inject_init(struct rtrs_srv_fault_inject *fault_inject, + struct rtrs_srv_sess *sess_name) +{ +} +void rtrs_srv_fault_inject_final(struct rtrs_srv_fault_inject *fault_inject) +{ +} +int rtrs_should_fail_hb_ack(struct rtrs_srv_fault_inject *fault_inject) +{ + return 0; +} +#endif diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c index 5e9bb7bf5ef3..6e53dac0d22c 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c @@ -1232,6 +1232,8 @@ static void rtrs_srv_rdma_done(struct ib_cq *cq, struct ib_wc *wc) } } else if (imm_type == RTRS_HB_MSG_IMM) { WARN_ON(con->c.cid); + if (unlikely(rtrs_should_fail_hb_ack(&sess->fault_inject))) + break; rtrs_send_hb_ack(&sess->s); } else if (imm_type == RTRS_HB_ACK_IMM) { WARN_ON(con->c.cid); @@ -1489,6 +1491,7 @@ static void rtrs_srv_close_work(struct work_struct *work) sess = container_of(work, typeof(*sess), close_work); + rtrs_srv_fault_inject_final(&sess->fault_inject); rtrs_srv_destroy_sess_files(sess); rtrs_srv_stop_hb(sess); @@ -1748,6 +1751,8 @@ static struct rtrs_srv_sess *__alloc_sess(struct rtrs_srv *srv, __add_path_to_srv(srv, sess); + rtrs_srv_fault_inject_init(&sess->fault_inject, sess); + return sess; err_unmap_bufs: diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.h b/drivers/infiniband/ulp/rtrs/rtrs-srv.h index 9543ae19996c..001889e148ac 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.h +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.h @@ -13,6 +13,7 @@ #include <linux/device.h> #include <linux/refcount.h> #include "rtrs-pri.h" +#include "rtrs-fault.h" /* * enum rtrs_srv_state - Server states. @@ -73,6 +74,13 @@ struct rtrs_srv_mr { struct rtrs_iu *iu; /* send buffer for new rkey msg */ }; +struct rtrs_srv_fault_inject { +#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS + struct rtrs_fault_inject fj; + bool fail_hb_ack; +#endif +}; + struct rtrs_srv_sess { struct rtrs_sess s; struct rtrs_srv *srv; @@ -90,6 +98,7 @@ struct rtrs_srv_sess { unsigned int mem_bits; struct kobject kobj; struct rtrs_srv_stats *stats; + struct rtrs_srv_fault_inject fault_inject; }; struct rtrs_srv { @@ -152,4 +161,8 @@ ssize_t rtrs_srv_reset_all_help(struct rtrs_srv_stats *stats, int rtrs_srv_create_sess_files(struct rtrs_srv_sess *sess); void rtrs_srv_destroy_sess_files(struct rtrs_srv_sess *sess); +void rtrs_srv_fault_inject_init(struct rtrs_srv_fault_inject *fault_inject, + struct rtrs_srv_sess *sess); +void rtrs_srv_fault_inject_final(struct rtrs_srv_fault_inject *fault_inject); +int rtrs_should_fail_hb_ack(struct rtrs_srv_fault_inject *fault_inject); #endif /* RTRS_SRV_H */ -- 2.25.1