aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2019-10-07 08:28:55 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2019-10-07 08:28:55 +0000
commitfc0ff31cc5eef898e304b434bfb8b96935a1b269 (patch)
tree67d2cb2bdcec55cae3550796dc691d34909d5e1c /sys/contrib
parentca195342d5c373c0ae77a974ef2358fc8447be1c (diff)
downloadsrc-fc0ff31cc5eef898e304b434bfb8b96935a1b269.tar.gz
src-fc0ff31cc5eef898e304b434bfb8b96935a1b269.zip
MFC r352954:
Notify all sleeping threads of device removal in krping. Implement d_purge for krping_cdevsw. Submitted by: slavash@ Sponsored by: Mellanox Technologies
Notes
Notes: svn path=/stable/11/; revision=353181
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/rdma/krping/krping.c14
-rw-r--r--sys/contrib/rdma/krping/krping.h1
-rw-r--r--sys/contrib/rdma/krping/krping_dev.c9
3 files changed, 24 insertions, 0 deletions
diff --git a/sys/contrib/rdma/krping/krping.c b/sys/contrib/rdma/krping/krping.c
index 7b1038c27db7..8b32fe31f4cb 100644
--- a/sys/contrib/rdma/krping/krping.c
+++ b/sys/contrib/rdma/krping/krping.c
@@ -2189,3 +2189,17 @@ krping_walk_cb_list(void (*f)(struct krping_stats *, void *), void *arg)
(*f)(cb->pd ? &cb->stats : NULL, arg);
mutex_unlock(&krping_mutex);
}
+
+void
+krping_cancel_all(void)
+{
+ struct krping_cb *cb;
+
+ mutex_lock(&krping_mutex);
+ list_for_each_entry(cb, &krping_cbs, list) {
+ cb->state = ERROR;
+ wake_up_interruptible(&cb->sem);
+ }
+ mutex_unlock(&krping_mutex);
+}
+
diff --git a/sys/contrib/rdma/krping/krping.h b/sys/contrib/rdma/krping/krping.h
index 5987b1c8625f..37df45b86776 100644
--- a/sys/contrib/rdma/krping/krping.h
+++ b/sys/contrib/rdma/krping/krping.h
@@ -17,3 +17,4 @@ struct krping_stats {
int krping_doit(char *);
void krping_walk_cb_list(void (*)(struct krping_stats *, void *), void *);
int krping_sigpending(void);
+void krping_cancel_all(void);
diff --git a/sys/contrib/rdma/krping/krping_dev.c b/sys/contrib/rdma/krping/krping_dev.c
index 342c5b0065f3..dda81af8c140 100644
--- a/sys/contrib/rdma/krping/krping_dev.c
+++ b/sys/contrib/rdma/krping/krping_dev.c
@@ -40,6 +40,7 @@ static d_open_t krping_open;
static d_close_t krping_close;
static d_read_t krping_read;
static d_write_t krping_write;
+static d_purge_t krping_purge;
/* Character device entry points */
static struct cdevsw krping_cdevsw = {
@@ -48,6 +49,7 @@ static struct cdevsw krping_cdevsw = {
.d_close = krping_close,
.d_read = krping_read,
.d_write = krping_write,
+ .d_purge = krping_purge,
.d_name = "krping",
};
@@ -210,6 +212,13 @@ done:
return(err);
}
+static void
+krping_purge(struct cdev *dev __unused)
+{
+
+ krping_cancel_all();
+}
+
int
krping_sigpending(void)
{