All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@intel.com>
To: linux-kernel@vger.kernel.org
Cc: jani.nikula@intel.com, intel-gfx@lists.freedesktop.org,
	linux-block@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
	ath11k@lists.infradead.org, ath10k@lists.infradead.org,
	Kalle Valo <kvalo@codeaurora.org>,
	linux-wireless@vger.kernel.org,
	QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
Subject: [PATCH 1/6] relay: allow the use of const callback structs
Date: Wed, 18 Nov 2020 18:53:15 +0200	[thread overview]
Message-ID: <20201118165320.26829-1-jani.nikula@intel.com> (raw)

None of the relay users require the use of mutable structs for
callbacks, however the relay code does. Instead of assigning default
callbacks when there is none, add callback wrappers to conditionally
call the client callbacks if available, and fall back to default
behaviour (typically no-op) otherwise.

This lets all relay users make their struct rchan_callbacks const data.

Cc: linux-block@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Cc: ath11k@lists.infradead.org
Cc: ath10k@lists.infradead.org
Cc: Kalle Valo <kvalo@codeaurora.org>
Cc: linux-wireless@vger.kernel.org
Cc: QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
Cc: intel-gfx@lists.freedesktop.org
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 include/linux/relay.h |   4 +-
 kernel/relay.c        | 182 +++++++++++++++++++-----------------------
 2 files changed, 86 insertions(+), 100 deletions(-)

diff --git a/include/linux/relay.h b/include/linux/relay.h
index e13a333e7c37..7333909df65a 100644
--- a/include/linux/relay.h
+++ b/include/linux/relay.h
@@ -62,7 +62,7 @@ struct rchan
 	size_t subbuf_size;		/* sub-buffer size */
 	size_t n_subbufs;		/* number of sub-buffers per buffer */
 	size_t alloc_size;		/* total buffer size allocated */
-	struct rchan_callbacks *cb;	/* client callbacks */
+	const struct rchan_callbacks *cb; /* client callbacks, may be NULL */
 	struct kref kref;		/* channel refcount */
 	void *private_data;		/* for user-defined data */
 	size_t last_toobig;		/* tried to log event > subbuf size */
@@ -170,7 +170,7 @@ struct rchan *relay_open(const char *base_filename,
 			 struct dentry *parent,
 			 size_t subbuf_size,
 			 size_t n_subbufs,
-			 struct rchan_callbacks *cb,
+			 const struct rchan_callbacks *cb,
 			 void *private_data);
 extern int relay_late_setup_files(struct rchan *chan,
 				  const char *base_filename,
diff --git a/kernel/relay.c b/kernel/relay.c
index b08d936d5fa7..c53676f2d10f 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -27,13 +27,86 @@
 static DEFINE_MUTEX(relay_channels_mutex);
 static LIST_HEAD(relay_channels);
 
+/*
+ * rchan_callback wrappers. Call the callbacks if available, otherwise fall back
+ * to default behaviour.
+ */
+
+/*
+ * subbuf_start() callback.
+ */
+static int cb_subbuf_start(const struct rchan_callbacks *cb,
+			   struct rchan_buf *buf,
+			   void *subbuf,
+			   void *prev_subbuf,
+			   size_t prev_padding)
+{
+	if (cb && cb->subbuf_start)
+		return cb->subbuf_start(buf, subbuf, prev_subbuf, prev_padding);
+
+	if (relay_buf_full(buf))
+		return 0;
+
+	return 1;
+}
+
+/*
+ * buf_mapped() callback.
+ */
+static void cb_buf_mapped(const struct rchan_callbacks *cb,
+			  struct rchan_buf *buf,
+			  struct file *filp)
+{
+	if (cb && cb->buf_mapped)
+		cb->buf_mapped(buf, filp);
+}
+
+/*
+ * buf_unmapped() callback.
+ */
+static void cb_buf_unmapped(const struct rchan_callbacks *cb,
+			    struct rchan_buf *buf,
+			    struct file *filp)
+{
+	if (cb && cb->buf_unmapped)
+		cb->buf_unmapped(buf, filp);
+}
+
+/*
+ * create_buf_file_create() callback.
+ */
+static struct dentry *cb_create_buf_file(const struct rchan_callbacks *cb,
+					 const char *filename,
+					 struct dentry *parent,
+					 umode_t mode,
+					 struct rchan_buf *buf,
+					 int *is_global)
+{
+	if (cb && cb->create_buf_file)
+		return cb->create_buf_file(filename, parent, mode, buf, is_global);
+
+	return NULL;
+}
+
+/*
+ * remove_buf_file() callback.
+ */
+static int cb_remove_buf_file(const struct rchan_callbacks *cb,
+			      struct dentry *dentry)
+{
+	if (cb && cb->remove_buf_file)
+		return cb->remove_buf_file(dentry);
+
+	return -EINVAL;
+}
+
 /*
  * close() vm_op implementation for relay file mapping.
  */
 static void relay_file_mmap_close(struct vm_area_struct *vma)
 {
 	struct rchan_buf *buf = vma->vm_private_data;
-	buf->chan->cb->buf_unmapped(buf, vma->vm_file);
+	cb_buf_unmapped(buf->chan->cb, buf, vma->vm_file);
 }
 
 /*
@@ -107,7 +180,7 @@ static int relay_mmap_buf(struct rchan_buf *buf, struct vm_area_struct *vma)
 	vma->vm_ops = &relay_file_mmap_ops;
 	vma->vm_flags |= VM_DONTEXPAND;
 	vma->vm_private_data = buf;
-	buf->chan->cb->buf_mapped(buf, filp);
+	cb_buf_mapped(buf->chan->cb, buf, filp);
 
 	return 0;
 }
@@ -264,70 +337,6 @@ EXPORT_SYMBOL_GPL(relay_buf_full);
  * High-level relay kernel API and associated functions.
  */
 
-/*
- * rchan_callback implementations defining default channel behavior.  Used
- * in place of corresponding NULL values in client callback struct.
- */
-
-/*
- * subbuf_start() default callback.  Does nothing.
- */
-static int subbuf_start_default_callback (struct rchan_buf *buf,
-					  void *subbuf,
-					  void *prev_subbuf,
-					  size_t prev_padding)
-{
-	if (relay_buf_full(buf))
-		return 0;
-
-	return 1;
-}
-
-/*
- * buf_mapped() default callback.  Does nothing.
- */
-static void buf_mapped_default_callback(struct rchan_buf *buf,
-					struct file *filp)
-{
-}
-
-/*
- * buf_unmapped() default callback.  Does nothing.
- */
-static void buf_unmapped_default_callback(struct rchan_buf *buf,
-					  struct file *filp)
-{
-}
-
-/*
- * create_buf_file_create() default callback.  Does nothing.
- */
-static struct dentry *create_buf_file_default_callback(const char *filename,
-						       struct dentry *parent,
-						       umode_t mode,
-						       struct rchan_buf *buf,
-						       int *is_global)
-{
-	return NULL;
-}
-
-/*
- * remove_buf_file() default callback.  Does nothing.
- */
-static int remove_buf_file_default_callback(struct dentry *dentry)
-{
-	return -EINVAL;
-}
-
-/* relay channel default callbacks */
-static struct rchan_callbacks default_channel_callbacks = {
-	.subbuf_start = subbuf_start_default_callback,
-	.buf_mapped = buf_mapped_default_callback,
-	.buf_unmapped = buf_unmapped_default_callback,
-	.create_buf_file = create_buf_file_default_callback,
-	.remove_buf_file = remove_buf_file_default_callback,
-};
-
 /**
  *	wakeup_readers - wake up readers waiting on a channel
  *	@work: contains the channel buffer
@@ -371,7 +380,7 @@ static void __relay_reset(struct rchan_buf *buf, unsigned int init)
 	for (i = 0; i < buf->chan->n_subbufs; i++)
 		buf->padding[i] = 0;
 
-	buf->chan->cb->subbuf_start(buf, buf->data, NULL, 0);
+	cb_subbuf_start(buf->chan->cb, buf, buf->data, NULL, 0);
 }
 
 /**
@@ -426,9 +435,8 @@ static struct dentry *relay_create_buf_file(struct rchan *chan,
 	snprintf(tmpname, NAME_MAX, "%s%d", chan->base_filename, cpu);
 
 	/* Create file in fs */
-	dentry = chan->cb->create_buf_file(tmpname, chan->parent,
-					   S_IRUSR, buf,
-					   &chan->is_global);
+	dentry = cb_create_buf_file(chan->cb, tmpname, chan->parent,
+				    S_IRUSR, buf, &chan->is_global);
 	if (IS_ERR(dentry))
 		dentry = NULL;
 
@@ -461,9 +469,8 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan, unsigned int cpu)
 		relay_set_buf_dentry(buf, dentry);
 	} else {
 		/* Only retrieve global info, nothing more, nothing less */
-		dentry = chan->cb->create_buf_file(NULL, NULL,
-						   S_IRUSR, buf,
-						   &chan->is_global);
+		dentry = cb_create_buf_file(chan->cb, NULL, NULL,
+					    S_IRUSR, buf, &chan->is_global);
 		if (IS_ERR_OR_NULL(dentry))
 			goto free_buf;
 	}
@@ -495,31 +502,10 @@ static void relay_close_buf(struct rchan_buf *buf)
 {
 	buf->finalized = 1;
 	irq_work_sync(&buf->wakeup_work);
-	buf->chan->cb->remove_buf_file(buf->dentry);
+	cb_remove_buf_file(buf->chan->cb, buf->dentry);
 	kref_put(&buf->kref, relay_remove_buf);
 }
 
-static void setup_callbacks(struct rchan *chan,
-				   struct rchan_callbacks *cb)
-{
-	if (!cb) {
-		chan->cb = &default_channel_callbacks;
-		return;
-	}
-
-	if (!cb->subbuf_start)
-		cb->subbuf_start = subbuf_start_default_callback;
-	if (!cb->buf_mapped)
-		cb->buf_mapped = buf_mapped_default_callback;
-	if (!cb->buf_unmapped)
-		cb->buf_unmapped = buf_unmapped_default_callback;
-	if (!cb->create_buf_file)
-		cb->create_buf_file = create_buf_file_default_callback;
-	if (!cb->remove_buf_file)
-		cb->remove_buf_file = remove_buf_file_default_callback;
-	chan->cb = cb;
-}
-
 int relay_prepare_cpu(unsigned int cpu)
 {
 	struct rchan *chan;
@@ -565,7 +551,7 @@ struct rchan *relay_open(const char *base_filename,
 			 struct dentry *parent,
 			 size_t subbuf_size,
 			 size_t n_subbufs,
-			 struct rchan_callbacks *cb,
+			 const struct rchan_callbacks *cb,
 			 void *private_data)
 {
 	unsigned int i;
@@ -597,7 +583,7 @@ struct rchan *relay_open(const char *base_filename,
 		chan->has_base_filename = 1;
 		strlcpy(chan->base_filename, base_filename, NAME_MAX);
 	}
-	setup_callbacks(chan, cb);
+	chan->cb = cb;
 	kref_init(&chan->kref);
 
 	mutex_lock(&relay_channels_mutex);
@@ -780,7 +766,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
 	new_subbuf = buf->subbufs_produced % buf->chan->n_subbufs;
 	new = buf->start + new_subbuf * buf->chan->subbuf_size;
 	buf->offset = 0;
-	if (!buf->chan->cb->subbuf_start(buf, new, old, buf->prev_padding)) {
+	if (!cb_subbuf_start(buf->chan->cb, buf, new, old, buf->prev_padding)) {
 		buf->offset = buf->chan->subbuf_size + 1;
 		return 0;
 	}
-- 
2.20.1


WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@intel.com>
To: linux-kernel@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>,
	jani.nikula@intel.com, intel-gfx@lists.freedesktop.org,
	linux-wireless@vger.kernel.org,
	QCA ath9k Development <ath9k-devel@qca.qualcomm.com>,
	ath10k@lists.infradead.org, linux-block@vger.kernel.org,
	ath11k@lists.infradead.org, Kalle Valo <kvalo@codeaurora.org>
Subject: [PATCH 1/6] relay: allow the use of const callback structs
Date: Wed, 18 Nov 2020 18:53:15 +0200	[thread overview]
Message-ID: <20201118165320.26829-1-jani.nikula@intel.com> (raw)

None of the relay users require the use of mutable structs for
callbacks, however the relay code does. Instead of assigning default
callbacks when there is none, add callback wrappers to conditionally
call the client callbacks if available, and fall back to default
behaviour (typically no-op) otherwise.

This lets all relay users make their struct rchan_callbacks const data.

Cc: linux-block@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Cc: ath11k@lists.infradead.org
Cc: ath10k@lists.infradead.org
Cc: Kalle Valo <kvalo@codeaurora.org>
Cc: linux-wireless@vger.kernel.org
Cc: QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
Cc: intel-gfx@lists.freedesktop.org
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 include/linux/relay.h |   4 +-
 kernel/relay.c        | 182 +++++++++++++++++++-----------------------
 2 files changed, 86 insertions(+), 100 deletions(-)

diff --git a/include/linux/relay.h b/include/linux/relay.h
index e13a333e7c37..7333909df65a 100644
--- a/include/linux/relay.h
+++ b/include/linux/relay.h
@@ -62,7 +62,7 @@ struct rchan
 	size_t subbuf_size;		/* sub-buffer size */
 	size_t n_subbufs;		/* number of sub-buffers per buffer */
 	size_t alloc_size;		/* total buffer size allocated */
-	struct rchan_callbacks *cb;	/* client callbacks */
+	const struct rchan_callbacks *cb; /* client callbacks, may be NULL */
 	struct kref kref;		/* channel refcount */
 	void *private_data;		/* for user-defined data */
 	size_t last_toobig;		/* tried to log event > subbuf size */
@@ -170,7 +170,7 @@ struct rchan *relay_open(const char *base_filename,
 			 struct dentry *parent,
 			 size_t subbuf_size,
 			 size_t n_subbufs,
-			 struct rchan_callbacks *cb,
+			 const struct rchan_callbacks *cb,
 			 void *private_data);
 extern int relay_late_setup_files(struct rchan *chan,
 				  const char *base_filename,
diff --git a/kernel/relay.c b/kernel/relay.c
index b08d936d5fa7..c53676f2d10f 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -27,13 +27,86 @@
 static DEFINE_MUTEX(relay_channels_mutex);
 static LIST_HEAD(relay_channels);
 
+/*
+ * rchan_callback wrappers. Call the callbacks if available, otherwise fall back
+ * to default behaviour.
+ */
+
+/*
+ * subbuf_start() callback.
+ */
+static int cb_subbuf_start(const struct rchan_callbacks *cb,
+			   struct rchan_buf *buf,
+			   void *subbuf,
+			   void *prev_subbuf,
+			   size_t prev_padding)
+{
+	if (cb && cb->subbuf_start)
+		return cb->subbuf_start(buf, subbuf, prev_subbuf, prev_padding);
+
+	if (relay_buf_full(buf))
+		return 0;
+
+	return 1;
+}
+
+/*
+ * buf_mapped() callback.
+ */
+static void cb_buf_mapped(const struct rchan_callbacks *cb,
+			  struct rchan_buf *buf,
+			  struct file *filp)
+{
+	if (cb && cb->buf_mapped)
+		cb->buf_mapped(buf, filp);
+}
+
+/*
+ * buf_unmapped() callback.
+ */
+static void cb_buf_unmapped(const struct rchan_callbacks *cb,
+			    struct rchan_buf *buf,
+			    struct file *filp)
+{
+	if (cb && cb->buf_unmapped)
+		cb->buf_unmapped(buf, filp);
+}
+
+/*
+ * create_buf_file_create() callback.
+ */
+static struct dentry *cb_create_buf_file(const struct rchan_callbacks *cb,
+					 const char *filename,
+					 struct dentry *parent,
+					 umode_t mode,
+					 struct rchan_buf *buf,
+					 int *is_global)
+{
+	if (cb && cb->create_buf_file)
+		return cb->create_buf_file(filename, parent, mode, buf, is_global);
+
+	return NULL;
+}
+
+/*
+ * remove_buf_file() callback.
+ */
+static int cb_remove_buf_file(const struct rchan_callbacks *cb,
+			      struct dentry *dentry)
+{
+	if (cb && cb->remove_buf_file)
+		return cb->remove_buf_file(dentry);
+
+	return -EINVAL;
+}
+
 /*
  * close() vm_op implementation for relay file mapping.
  */
 static void relay_file_mmap_close(struct vm_area_struct *vma)
 {
 	struct rchan_buf *buf = vma->vm_private_data;
-	buf->chan->cb->buf_unmapped(buf, vma->vm_file);
+	cb_buf_unmapped(buf->chan->cb, buf, vma->vm_file);
 }
 
 /*
@@ -107,7 +180,7 @@ static int relay_mmap_buf(struct rchan_buf *buf, struct vm_area_struct *vma)
 	vma->vm_ops = &relay_file_mmap_ops;
 	vma->vm_flags |= VM_DONTEXPAND;
 	vma->vm_private_data = buf;
-	buf->chan->cb->buf_mapped(buf, filp);
+	cb_buf_mapped(buf->chan->cb, buf, filp);
 
 	return 0;
 }
@@ -264,70 +337,6 @@ EXPORT_SYMBOL_GPL(relay_buf_full);
  * High-level relay kernel API and associated functions.
  */
 
-/*
- * rchan_callback implementations defining default channel behavior.  Used
- * in place of corresponding NULL values in client callback struct.
- */
-
-/*
- * subbuf_start() default callback.  Does nothing.
- */
-static int subbuf_start_default_callback (struct rchan_buf *buf,
-					  void *subbuf,
-					  void *prev_subbuf,
-					  size_t prev_padding)
-{
-	if (relay_buf_full(buf))
-		return 0;
-
-	return 1;
-}
-
-/*
- * buf_mapped() default callback.  Does nothing.
- */
-static void buf_mapped_default_callback(struct rchan_buf *buf,
-					struct file *filp)
-{
-}
-
-/*
- * buf_unmapped() default callback.  Does nothing.
- */
-static void buf_unmapped_default_callback(struct rchan_buf *buf,
-					  struct file *filp)
-{
-}
-
-/*
- * create_buf_file_create() default callback.  Does nothing.
- */
-static struct dentry *create_buf_file_default_callback(const char *filename,
-						       struct dentry *parent,
-						       umode_t mode,
-						       struct rchan_buf *buf,
-						       int *is_global)
-{
-	return NULL;
-}
-
-/*
- * remove_buf_file() default callback.  Does nothing.
- */
-static int remove_buf_file_default_callback(struct dentry *dentry)
-{
-	return -EINVAL;
-}
-
-/* relay channel default callbacks */
-static struct rchan_callbacks default_channel_callbacks = {
-	.subbuf_start = subbuf_start_default_callback,
-	.buf_mapped = buf_mapped_default_callback,
-	.buf_unmapped = buf_unmapped_default_callback,
-	.create_buf_file = create_buf_file_default_callback,
-	.remove_buf_file = remove_buf_file_default_callback,
-};
-
 /**
  *	wakeup_readers - wake up readers waiting on a channel
  *	@work: contains the channel buffer
@@ -371,7 +380,7 @@ static void __relay_reset(struct rchan_buf *buf, unsigned int init)
 	for (i = 0; i < buf->chan->n_subbufs; i++)
 		buf->padding[i] = 0;
 
-	buf->chan->cb->subbuf_start(buf, buf->data, NULL, 0);
+	cb_subbuf_start(buf->chan->cb, buf, buf->data, NULL, 0);
 }
 
 /**
@@ -426,9 +435,8 @@ static struct dentry *relay_create_buf_file(struct rchan *chan,
 	snprintf(tmpname, NAME_MAX, "%s%d", chan->base_filename, cpu);
 
 	/* Create file in fs */
-	dentry = chan->cb->create_buf_file(tmpname, chan->parent,
-					   S_IRUSR, buf,
-					   &chan->is_global);
+	dentry = cb_create_buf_file(chan->cb, tmpname, chan->parent,
+				    S_IRUSR, buf, &chan->is_global);
 	if (IS_ERR(dentry))
 		dentry = NULL;
 
@@ -461,9 +469,8 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan, unsigned int cpu)
 		relay_set_buf_dentry(buf, dentry);
 	} else {
 		/* Only retrieve global info, nothing more, nothing less */
-		dentry = chan->cb->create_buf_file(NULL, NULL,
-						   S_IRUSR, buf,
-						   &chan->is_global);
+		dentry = cb_create_buf_file(chan->cb, NULL, NULL,
+					    S_IRUSR, buf, &chan->is_global);
 		if (IS_ERR_OR_NULL(dentry))
 			goto free_buf;
 	}
@@ -495,31 +502,10 @@ static void relay_close_buf(struct rchan_buf *buf)
 {
 	buf->finalized = 1;
 	irq_work_sync(&buf->wakeup_work);
-	buf->chan->cb->remove_buf_file(buf->dentry);
+	cb_remove_buf_file(buf->chan->cb, buf->dentry);
 	kref_put(&buf->kref, relay_remove_buf);
 }
 
-static void setup_callbacks(struct rchan *chan,
-				   struct rchan_callbacks *cb)
-{
-	if (!cb) {
-		chan->cb = &default_channel_callbacks;
-		return;
-	}
-
-	if (!cb->subbuf_start)
-		cb->subbuf_start = subbuf_start_default_callback;
-	if (!cb->buf_mapped)
-		cb->buf_mapped = buf_mapped_default_callback;
-	if (!cb->buf_unmapped)
-		cb->buf_unmapped = buf_unmapped_default_callback;
-	if (!cb->create_buf_file)
-		cb->create_buf_file = create_buf_file_default_callback;
-	if (!cb->remove_buf_file)
-		cb->remove_buf_file = remove_buf_file_default_callback;
-	chan->cb = cb;
-}
-
 int relay_prepare_cpu(unsigned int cpu)
 {
 	struct rchan *chan;
@@ -565,7 +551,7 @@ struct rchan *relay_open(const char *base_filename,
 			 struct dentry *parent,
 			 size_t subbuf_size,
 			 size_t n_subbufs,
-			 struct rchan_callbacks *cb,
+			 const struct rchan_callbacks *cb,
 			 void *private_data)
 {
 	unsigned int i;
@@ -597,7 +583,7 @@ struct rchan *relay_open(const char *base_filename,
 		chan->has_base_filename = 1;
 		strlcpy(chan->base_filename, base_filename, NAME_MAX);
 	}
-	setup_callbacks(chan, cb);
+	chan->cb = cb;
 	kref_init(&chan->kref);
 
 	mutex_lock(&relay_channels_mutex);
@@ -780,7 +766,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
 	new_subbuf = buf->subbufs_produced % buf->chan->n_subbufs;
 	new = buf->start + new_subbuf * buf->chan->subbuf_size;
 	buf->offset = 0;
-	if (!buf->chan->cb->subbuf_start(buf, new, old, buf->prev_padding)) {
+	if (!cb_subbuf_start(buf->chan->cb, buf, new, old, buf->prev_padding)) {
 		buf->offset = buf->chan->subbuf_size + 1;
 		return 0;
 	}
-- 
2.20.1


-- 
ath11k mailing list
ath11k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath11k

WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@intel.com>
To: linux-kernel@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>,
	jani.nikula@intel.com, intel-gfx@lists.freedesktop.org,
	linux-wireless@vger.kernel.org,
	QCA ath9k Development <ath9k-devel@qca.qualcomm.com>,
	ath10k@lists.infradead.org, linux-block@vger.kernel.org,
	ath11k@lists.infradead.org, Kalle Valo <kvalo@codeaurora.org>
Subject: [PATCH 1/6] relay: allow the use of const callback structs
Date: Wed, 18 Nov 2020 18:53:15 +0200	[thread overview]
Message-ID: <20201118165320.26829-1-jani.nikula@intel.com> (raw)

None of the relay users require the use of mutable structs for
callbacks, however the relay code does. Instead of assigning default
callbacks when there is none, add callback wrappers to conditionally
call the client callbacks if available, and fall back to default
behaviour (typically no-op) otherwise.

This lets all relay users make their struct rchan_callbacks const data.

Cc: linux-block@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Cc: ath11k@lists.infradead.org
Cc: ath10k@lists.infradead.org
Cc: Kalle Valo <kvalo@codeaurora.org>
Cc: linux-wireless@vger.kernel.org
Cc: QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
Cc: intel-gfx@lists.freedesktop.org
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 include/linux/relay.h |   4 +-
 kernel/relay.c        | 182 +++++++++++++++++++-----------------------
 2 files changed, 86 insertions(+), 100 deletions(-)

diff --git a/include/linux/relay.h b/include/linux/relay.h
index e13a333e7c37..7333909df65a 100644
--- a/include/linux/relay.h
+++ b/include/linux/relay.h
@@ -62,7 +62,7 @@ struct rchan
 	size_t subbuf_size;		/* sub-buffer size */
 	size_t n_subbufs;		/* number of sub-buffers per buffer */
 	size_t alloc_size;		/* total buffer size allocated */
-	struct rchan_callbacks *cb;	/* client callbacks */
+	const struct rchan_callbacks *cb; /* client callbacks, may be NULL */
 	struct kref kref;		/* channel refcount */
 	void *private_data;		/* for user-defined data */
 	size_t last_toobig;		/* tried to log event > subbuf size */
@@ -170,7 +170,7 @@ struct rchan *relay_open(const char *base_filename,
 			 struct dentry *parent,
 			 size_t subbuf_size,
 			 size_t n_subbufs,
-			 struct rchan_callbacks *cb,
+			 const struct rchan_callbacks *cb,
 			 void *private_data);
 extern int relay_late_setup_files(struct rchan *chan,
 				  const char *base_filename,
diff --git a/kernel/relay.c b/kernel/relay.c
index b08d936d5fa7..c53676f2d10f 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -27,13 +27,86 @@
 static DEFINE_MUTEX(relay_channels_mutex);
 static LIST_HEAD(relay_channels);
 
+/*
+ * rchan_callback wrappers. Call the callbacks if available, otherwise fall back
+ * to default behaviour.
+ */
+
+/*
+ * subbuf_start() callback.
+ */
+static int cb_subbuf_start(const struct rchan_callbacks *cb,
+			   struct rchan_buf *buf,
+			   void *subbuf,
+			   void *prev_subbuf,
+			   size_t prev_padding)
+{
+	if (cb && cb->subbuf_start)
+		return cb->subbuf_start(buf, subbuf, prev_subbuf, prev_padding);
+
+	if (relay_buf_full(buf))
+		return 0;
+
+	return 1;
+}
+
+/*
+ * buf_mapped() callback.
+ */
+static void cb_buf_mapped(const struct rchan_callbacks *cb,
+			  struct rchan_buf *buf,
+			  struct file *filp)
+{
+	if (cb && cb->buf_mapped)
+		cb->buf_mapped(buf, filp);
+}
+
+/*
+ * buf_unmapped() callback.
+ */
+static void cb_buf_unmapped(const struct rchan_callbacks *cb,
+			    struct rchan_buf *buf,
+			    struct file *filp)
+{
+	if (cb && cb->buf_unmapped)
+		cb->buf_unmapped(buf, filp);
+}
+
+/*
+ * create_buf_file_create() callback.
+ */
+static struct dentry *cb_create_buf_file(const struct rchan_callbacks *cb,
+					 const char *filename,
+					 struct dentry *parent,
+					 umode_t mode,
+					 struct rchan_buf *buf,
+					 int *is_global)
+{
+	if (cb && cb->create_buf_file)
+		return cb->create_buf_file(filename, parent, mode, buf, is_global);
+
+	return NULL;
+}
+
+/*
+ * remove_buf_file() callback.
+ */
+static int cb_remove_buf_file(const struct rchan_callbacks *cb,
+			      struct dentry *dentry)
+{
+	if (cb && cb->remove_buf_file)
+		return cb->remove_buf_file(dentry);
+
+	return -EINVAL;
+}
+
 /*
  * close() vm_op implementation for relay file mapping.
  */
 static void relay_file_mmap_close(struct vm_area_struct *vma)
 {
 	struct rchan_buf *buf = vma->vm_private_data;
-	buf->chan->cb->buf_unmapped(buf, vma->vm_file);
+	cb_buf_unmapped(buf->chan->cb, buf, vma->vm_file);
 }
 
 /*
@@ -107,7 +180,7 @@ static int relay_mmap_buf(struct rchan_buf *buf, struct vm_area_struct *vma)
 	vma->vm_ops = &relay_file_mmap_ops;
 	vma->vm_flags |= VM_DONTEXPAND;
 	vma->vm_private_data = buf;
-	buf->chan->cb->buf_mapped(buf, filp);
+	cb_buf_mapped(buf->chan->cb, buf, filp);
 
 	return 0;
 }
@@ -264,70 +337,6 @@ EXPORT_SYMBOL_GPL(relay_buf_full);
  * High-level relay kernel API and associated functions.
  */
 
-/*
- * rchan_callback implementations defining default channel behavior.  Used
- * in place of corresponding NULL values in client callback struct.
- */
-
-/*
- * subbuf_start() default callback.  Does nothing.
- */
-static int subbuf_start_default_callback (struct rchan_buf *buf,
-					  void *subbuf,
-					  void *prev_subbuf,
-					  size_t prev_padding)
-{
-	if (relay_buf_full(buf))
-		return 0;
-
-	return 1;
-}
-
-/*
- * buf_mapped() default callback.  Does nothing.
- */
-static void buf_mapped_default_callback(struct rchan_buf *buf,
-					struct file *filp)
-{
-}
-
-/*
- * buf_unmapped() default callback.  Does nothing.
- */
-static void buf_unmapped_default_callback(struct rchan_buf *buf,
-					  struct file *filp)
-{
-}
-
-/*
- * create_buf_file_create() default callback.  Does nothing.
- */
-static struct dentry *create_buf_file_default_callback(const char *filename,
-						       struct dentry *parent,
-						       umode_t mode,
-						       struct rchan_buf *buf,
-						       int *is_global)
-{
-	return NULL;
-}
-
-/*
- * remove_buf_file() default callback.  Does nothing.
- */
-static int remove_buf_file_default_callback(struct dentry *dentry)
-{
-	return -EINVAL;
-}
-
-/* relay channel default callbacks */
-static struct rchan_callbacks default_channel_callbacks = {
-	.subbuf_start = subbuf_start_default_callback,
-	.buf_mapped = buf_mapped_default_callback,
-	.buf_unmapped = buf_unmapped_default_callback,
-	.create_buf_file = create_buf_file_default_callback,
-	.remove_buf_file = remove_buf_file_default_callback,
-};
-
 /**
  *	wakeup_readers - wake up readers waiting on a channel
  *	@work: contains the channel buffer
@@ -371,7 +380,7 @@ static void __relay_reset(struct rchan_buf *buf, unsigned int init)
 	for (i = 0; i < buf->chan->n_subbufs; i++)
 		buf->padding[i] = 0;
 
-	buf->chan->cb->subbuf_start(buf, buf->data, NULL, 0);
+	cb_subbuf_start(buf->chan->cb, buf, buf->data, NULL, 0);
 }
 
 /**
@@ -426,9 +435,8 @@ static struct dentry *relay_create_buf_file(struct rchan *chan,
 	snprintf(tmpname, NAME_MAX, "%s%d", chan->base_filename, cpu);
 
 	/* Create file in fs */
-	dentry = chan->cb->create_buf_file(tmpname, chan->parent,
-					   S_IRUSR, buf,
-					   &chan->is_global);
+	dentry = cb_create_buf_file(chan->cb, tmpname, chan->parent,
+				    S_IRUSR, buf, &chan->is_global);
 	if (IS_ERR(dentry))
 		dentry = NULL;
 
@@ -461,9 +469,8 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan, unsigned int cpu)
 		relay_set_buf_dentry(buf, dentry);
 	} else {
 		/* Only retrieve global info, nothing more, nothing less */
-		dentry = chan->cb->create_buf_file(NULL, NULL,
-						   S_IRUSR, buf,
-						   &chan->is_global);
+		dentry = cb_create_buf_file(chan->cb, NULL, NULL,
+					    S_IRUSR, buf, &chan->is_global);
 		if (IS_ERR_OR_NULL(dentry))
 			goto free_buf;
 	}
@@ -495,31 +502,10 @@ static void relay_close_buf(struct rchan_buf *buf)
 {
 	buf->finalized = 1;
 	irq_work_sync(&buf->wakeup_work);
-	buf->chan->cb->remove_buf_file(buf->dentry);
+	cb_remove_buf_file(buf->chan->cb, buf->dentry);
 	kref_put(&buf->kref, relay_remove_buf);
 }
 
-static void setup_callbacks(struct rchan *chan,
-				   struct rchan_callbacks *cb)
-{
-	if (!cb) {
-		chan->cb = &default_channel_callbacks;
-		return;
-	}
-
-	if (!cb->subbuf_start)
-		cb->subbuf_start = subbuf_start_default_callback;
-	if (!cb->buf_mapped)
-		cb->buf_mapped = buf_mapped_default_callback;
-	if (!cb->buf_unmapped)
-		cb->buf_unmapped = buf_unmapped_default_callback;
-	if (!cb->create_buf_file)
-		cb->create_buf_file = create_buf_file_default_callback;
-	if (!cb->remove_buf_file)
-		cb->remove_buf_file = remove_buf_file_default_callback;
-	chan->cb = cb;
-}
-
 int relay_prepare_cpu(unsigned int cpu)
 {
 	struct rchan *chan;
@@ -565,7 +551,7 @@ struct rchan *relay_open(const char *base_filename,
 			 struct dentry *parent,
 			 size_t subbuf_size,
 			 size_t n_subbufs,
-			 struct rchan_callbacks *cb,
+			 const struct rchan_callbacks *cb,
 			 void *private_data)
 {
 	unsigned int i;
@@ -597,7 +583,7 @@ struct rchan *relay_open(const char *base_filename,
 		chan->has_base_filename = 1;
 		strlcpy(chan->base_filename, base_filename, NAME_MAX);
 	}
-	setup_callbacks(chan, cb);
+	chan->cb = cb;
 	kref_init(&chan->kref);
 
 	mutex_lock(&relay_channels_mutex);
@@ -780,7 +766,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
 	new_subbuf = buf->subbufs_produced % buf->chan->n_subbufs;
 	new = buf->start + new_subbuf * buf->chan->subbuf_size;
 	buf->offset = 0;
-	if (!buf->chan->cb->subbuf_start(buf, new, old, buf->prev_padding)) {
+	if (!cb_subbuf_start(buf->chan->cb, buf, new, old, buf->prev_padding)) {
 		buf->offset = buf->chan->subbuf_size + 1;
 		return 0;
 	}
-- 
2.20.1


_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k

WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@intel.com>
To: linux-kernel@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>,
	jani.nikula@intel.com, intel-gfx@lists.freedesktop.org,
	linux-wireless@vger.kernel.org,
	QCA ath9k Development <ath9k-devel@qca.qualcomm.com>,
	ath10k@lists.infradead.org, linux-block@vger.kernel.org,
	ath11k@lists.infradead.org, Kalle Valo <kvalo@codeaurora.org>
Subject: [Intel-gfx] [PATCH 1/6] relay: allow the use of const callback structs
Date: Wed, 18 Nov 2020 18:53:15 +0200	[thread overview]
Message-ID: <20201118165320.26829-1-jani.nikula@intel.com> (raw)

None of the relay users require the use of mutable structs for
callbacks, however the relay code does. Instead of assigning default
callbacks when there is none, add callback wrappers to conditionally
call the client callbacks if available, and fall back to default
behaviour (typically no-op) otherwise.

This lets all relay users make their struct rchan_callbacks const data.

Cc: linux-block@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Cc: ath11k@lists.infradead.org
Cc: ath10k@lists.infradead.org
Cc: Kalle Valo <kvalo@codeaurora.org>
Cc: linux-wireless@vger.kernel.org
Cc: QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
Cc: intel-gfx@lists.freedesktop.org
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 include/linux/relay.h |   4 +-
 kernel/relay.c        | 182 +++++++++++++++++++-----------------------
 2 files changed, 86 insertions(+), 100 deletions(-)

diff --git a/include/linux/relay.h b/include/linux/relay.h
index e13a333e7c37..7333909df65a 100644
--- a/include/linux/relay.h
+++ b/include/linux/relay.h
@@ -62,7 +62,7 @@ struct rchan
 	size_t subbuf_size;		/* sub-buffer size */
 	size_t n_subbufs;		/* number of sub-buffers per buffer */
 	size_t alloc_size;		/* total buffer size allocated */
-	struct rchan_callbacks *cb;	/* client callbacks */
+	const struct rchan_callbacks *cb; /* client callbacks, may be NULL */
 	struct kref kref;		/* channel refcount */
 	void *private_data;		/* for user-defined data */
 	size_t last_toobig;		/* tried to log event > subbuf size */
@@ -170,7 +170,7 @@ struct rchan *relay_open(const char *base_filename,
 			 struct dentry *parent,
 			 size_t subbuf_size,
 			 size_t n_subbufs,
-			 struct rchan_callbacks *cb,
+			 const struct rchan_callbacks *cb,
 			 void *private_data);
 extern int relay_late_setup_files(struct rchan *chan,
 				  const char *base_filename,
diff --git a/kernel/relay.c b/kernel/relay.c
index b08d936d5fa7..c53676f2d10f 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -27,13 +27,86 @@
 static DEFINE_MUTEX(relay_channels_mutex);
 static LIST_HEAD(relay_channels);
 
+/*
+ * rchan_callback wrappers. Call the callbacks if available, otherwise fall back
+ * to default behaviour.
+ */
+
+/*
+ * subbuf_start() callback.
+ */
+static int cb_subbuf_start(const struct rchan_callbacks *cb,
+			   struct rchan_buf *buf,
+			   void *subbuf,
+			   void *prev_subbuf,
+			   size_t prev_padding)
+{
+	if (cb && cb->subbuf_start)
+		return cb->subbuf_start(buf, subbuf, prev_subbuf, prev_padding);
+
+	if (relay_buf_full(buf))
+		return 0;
+
+	return 1;
+}
+
+/*
+ * buf_mapped() callback.
+ */
+static void cb_buf_mapped(const struct rchan_callbacks *cb,
+			  struct rchan_buf *buf,
+			  struct file *filp)
+{
+	if (cb && cb->buf_mapped)
+		cb->buf_mapped(buf, filp);
+}
+
+/*
+ * buf_unmapped() callback.
+ */
+static void cb_buf_unmapped(const struct rchan_callbacks *cb,
+			    struct rchan_buf *buf,
+			    struct file *filp)
+{
+	if (cb && cb->buf_unmapped)
+		cb->buf_unmapped(buf, filp);
+}
+
+/*
+ * create_buf_file_create() callback.
+ */
+static struct dentry *cb_create_buf_file(const struct rchan_callbacks *cb,
+					 const char *filename,
+					 struct dentry *parent,
+					 umode_t mode,
+					 struct rchan_buf *buf,
+					 int *is_global)
+{
+	if (cb && cb->create_buf_file)
+		return cb->create_buf_file(filename, parent, mode, buf, is_global);
+
+	return NULL;
+}
+
+/*
+ * remove_buf_file() callback.
+ */
+static int cb_remove_buf_file(const struct rchan_callbacks *cb,
+			      struct dentry *dentry)
+{
+	if (cb && cb->remove_buf_file)
+		return cb->remove_buf_file(dentry);
+
+	return -EINVAL;
+}
+
 /*
  * close() vm_op implementation for relay file mapping.
  */
 static void relay_file_mmap_close(struct vm_area_struct *vma)
 {
 	struct rchan_buf *buf = vma->vm_private_data;
-	buf->chan->cb->buf_unmapped(buf, vma->vm_file);
+	cb_buf_unmapped(buf->chan->cb, buf, vma->vm_file);
 }
 
 /*
@@ -107,7 +180,7 @@ static int relay_mmap_buf(struct rchan_buf *buf, struct vm_area_struct *vma)
 	vma->vm_ops = &relay_file_mmap_ops;
 	vma->vm_flags |= VM_DONTEXPAND;
 	vma->vm_private_data = buf;
-	buf->chan->cb->buf_mapped(buf, filp);
+	cb_buf_mapped(buf->chan->cb, buf, filp);
 
 	return 0;
 }
@@ -264,70 +337,6 @@ EXPORT_SYMBOL_GPL(relay_buf_full);
  * High-level relay kernel API and associated functions.
  */
 
-/*
- * rchan_callback implementations defining default channel behavior.  Used
- * in place of corresponding NULL values in client callback struct.
- */
-
-/*
- * subbuf_start() default callback.  Does nothing.
- */
-static int subbuf_start_default_callback (struct rchan_buf *buf,
-					  void *subbuf,
-					  void *prev_subbuf,
-					  size_t prev_padding)
-{
-	if (relay_buf_full(buf))
-		return 0;
-
-	return 1;
-}
-
-/*
- * buf_mapped() default callback.  Does nothing.
- */
-static void buf_mapped_default_callback(struct rchan_buf *buf,
-					struct file *filp)
-{
-}
-
-/*
- * buf_unmapped() default callback.  Does nothing.
- */
-static void buf_unmapped_default_callback(struct rchan_buf *buf,
-					  struct file *filp)
-{
-}
-
-/*
- * create_buf_file_create() default callback.  Does nothing.
- */
-static struct dentry *create_buf_file_default_callback(const char *filename,
-						       struct dentry *parent,
-						       umode_t mode,
-						       struct rchan_buf *buf,
-						       int *is_global)
-{
-	return NULL;
-}
-
-/*
- * remove_buf_file() default callback.  Does nothing.
- */
-static int remove_buf_file_default_callback(struct dentry *dentry)
-{
-	return -EINVAL;
-}
-
-/* relay channel default callbacks */
-static struct rchan_callbacks default_channel_callbacks = {
-	.subbuf_start = subbuf_start_default_callback,
-	.buf_mapped = buf_mapped_default_callback,
-	.buf_unmapped = buf_unmapped_default_callback,
-	.create_buf_file = create_buf_file_default_callback,
-	.remove_buf_file = remove_buf_file_default_callback,
-};
-
 /**
  *	wakeup_readers - wake up readers waiting on a channel
  *	@work: contains the channel buffer
@@ -371,7 +380,7 @@ static void __relay_reset(struct rchan_buf *buf, unsigned int init)
 	for (i = 0; i < buf->chan->n_subbufs; i++)
 		buf->padding[i] = 0;
 
-	buf->chan->cb->subbuf_start(buf, buf->data, NULL, 0);
+	cb_subbuf_start(buf->chan->cb, buf, buf->data, NULL, 0);
 }
 
 /**
@@ -426,9 +435,8 @@ static struct dentry *relay_create_buf_file(struct rchan *chan,
 	snprintf(tmpname, NAME_MAX, "%s%d", chan->base_filename, cpu);
 
 	/* Create file in fs */
-	dentry = chan->cb->create_buf_file(tmpname, chan->parent,
-					   S_IRUSR, buf,
-					   &chan->is_global);
+	dentry = cb_create_buf_file(chan->cb, tmpname, chan->parent,
+				    S_IRUSR, buf, &chan->is_global);
 	if (IS_ERR(dentry))
 		dentry = NULL;
 
@@ -461,9 +469,8 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan, unsigned int cpu)
 		relay_set_buf_dentry(buf, dentry);
 	} else {
 		/* Only retrieve global info, nothing more, nothing less */
-		dentry = chan->cb->create_buf_file(NULL, NULL,
-						   S_IRUSR, buf,
-						   &chan->is_global);
+		dentry = cb_create_buf_file(chan->cb, NULL, NULL,
+					    S_IRUSR, buf, &chan->is_global);
 		if (IS_ERR_OR_NULL(dentry))
 			goto free_buf;
 	}
@@ -495,31 +502,10 @@ static void relay_close_buf(struct rchan_buf *buf)
 {
 	buf->finalized = 1;
 	irq_work_sync(&buf->wakeup_work);
-	buf->chan->cb->remove_buf_file(buf->dentry);
+	cb_remove_buf_file(buf->chan->cb, buf->dentry);
 	kref_put(&buf->kref, relay_remove_buf);
 }
 
-static void setup_callbacks(struct rchan *chan,
-				   struct rchan_callbacks *cb)
-{
-	if (!cb) {
-		chan->cb = &default_channel_callbacks;
-		return;
-	}
-
-	if (!cb->subbuf_start)
-		cb->subbuf_start = subbuf_start_default_callback;
-	if (!cb->buf_mapped)
-		cb->buf_mapped = buf_mapped_default_callback;
-	if (!cb->buf_unmapped)
-		cb->buf_unmapped = buf_unmapped_default_callback;
-	if (!cb->create_buf_file)
-		cb->create_buf_file = create_buf_file_default_callback;
-	if (!cb->remove_buf_file)
-		cb->remove_buf_file = remove_buf_file_default_callback;
-	chan->cb = cb;
-}
-
 int relay_prepare_cpu(unsigned int cpu)
 {
 	struct rchan *chan;
@@ -565,7 +551,7 @@ struct rchan *relay_open(const char *base_filename,
 			 struct dentry *parent,
 			 size_t subbuf_size,
 			 size_t n_subbufs,
-			 struct rchan_callbacks *cb,
+			 const struct rchan_callbacks *cb,
 			 void *private_data)
 {
 	unsigned int i;
@@ -597,7 +583,7 @@ struct rchan *relay_open(const char *base_filename,
 		chan->has_base_filename = 1;
 		strlcpy(chan->base_filename, base_filename, NAME_MAX);
 	}
-	setup_callbacks(chan, cb);
+	chan->cb = cb;
 	kref_init(&chan->kref);
 
 	mutex_lock(&relay_channels_mutex);
@@ -780,7 +766,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
 	new_subbuf = buf->subbufs_produced % buf->chan->n_subbufs;
 	new = buf->start + new_subbuf * buf->chan->subbuf_size;
 	buf->offset = 0;
-	if (!buf->chan->cb->subbuf_start(buf, new, old, buf->prev_padding)) {
+	if (!cb_subbuf_start(buf->chan->cb, buf, new, old, buf->prev_padding)) {
 		buf->offset = buf->chan->subbuf_size + 1;
 		return 0;
 	}
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

             reply	other threads:[~2020-11-18 16:54 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-18 16:53 Jani Nikula [this message]
2020-11-18 16:53 ` [Intel-gfx] [PATCH 1/6] relay: allow the use of const callback structs Jani Nikula
2020-11-18 16:53 ` Jani Nikula
2020-11-18 16:53 ` Jani Nikula
2020-11-18 16:53 ` [PATCH 2/6] drm/i915: make relay callbacks const Jani Nikula
2020-11-18 16:53   ` [Intel-gfx] " Jani Nikula
2020-11-18 16:53 ` [PATCH 3/6] ath10k: " Jani Nikula
2020-11-18 16:53   ` [Intel-gfx] " Jani Nikula
2020-11-18 16:53   ` Jani Nikula
2020-11-18 17:13   ` Kalle Valo
2020-11-18 17:13     ` [Intel-gfx] " Kalle Valo
2020-11-18 17:13     ` Kalle Valo
2020-11-18 16:53 ` [PATCH 4/6] ath11k: " Jani Nikula
2020-11-18 16:53   ` [Intel-gfx] " Jani Nikula
2020-11-18 16:53   ` Jani Nikula
2020-11-19  9:31   ` Jani Nikula
2020-11-19  9:31     ` [Intel-gfx] " Jani Nikula
2020-11-19  9:31     ` Jani Nikula
2020-11-19 11:40     ` Kalle Valo
2020-11-19 11:40       ` [Intel-gfx] " Kalle Valo
2020-11-19 11:40       ` Kalle Valo
2020-11-18 16:53 ` [PATCH 5/6] ath9k: " Jani Nikula
2020-11-18 16:53   ` [Intel-gfx] " Jani Nikula
2020-11-18 17:03   ` Kalle Valo
2020-11-18 17:03     ` [Intel-gfx] " Kalle Valo
2020-11-18 17:15     ` Kalle Valo
2020-11-18 17:15       ` [Intel-gfx] " Kalle Valo
2020-11-18 16:53 ` [PATCH 6/6] blktrace: " Jani Nikula
2020-11-18 16:53   ` [Intel-gfx] " Jani Nikula
2020-11-18 18:43 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/6] relay: allow the use of const callback structs Patchwork
2020-11-18 18:45 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2020-11-18 19:13 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-11-19  4:08 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
2020-11-19  8:11 ` [PATCH 1/6] " Christoph Hellwig
2020-11-19  8:11   ` [Intel-gfx] " Christoph Hellwig
2020-11-19  8:11   ` Christoph Hellwig
2020-11-19  8:11   ` Christoph Hellwig
2020-11-19  8:11   ` Christoph Hellwig
2020-11-19  8:11     ` [Intel-gfx] " Christoph Hellwig
2020-11-19  8:11     ` Christoph Hellwig
2020-11-19  8:11     ` Christoph Hellwig
2020-11-23 18:01   ` Jani Nikula
2020-11-23 18:01     ` [Intel-gfx] " Jani Nikula
2020-11-23 18:01     ` Jani Nikula
2020-11-23 18:01     ` Jani Nikula

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201118165320.26829-1-jani.nikula@intel.com \
    --to=jani.nikula@intel.com \
    --cc=ath10k@lists.infradead.org \
    --cc=ath11k@lists.infradead.org \
    --cc=ath9k-devel@qca.qualcomm.com \
    --cc=axboe@kernel.dk \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=kvalo@codeaurora.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.