@@ -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
@@ -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:
@@ -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 */