Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1250651 > unrolled thread
| Started by | Paul Osmialowski <p.osmialowsk@samsung.com> |
|---|---|
| First post | 2015-10-19 15:10 +0200 |
| Last post | 2015-10-19 15:30 +0200 |
| Articles | 6 — 4 participants |
Back to article view | Back to linux.kernel
[RFC v3 0/9] Additional kmsg devices Paul Osmialowski <p.osmialowsk@samsung.com> - 2015-10-19 15:10 +0200
[RFC v3 6/9] kmsg: add ioctl for adding and deleting kmsg* devices Paul Osmialowski <p.osmialowsk@samsung.com> - 2015-10-19 15:10 +0200
Re: [RFC v3 6/9] kmsg: add ioctl for adding and deleting kmsg* devices Arnd Bergmann <arnd@arndb.de> - 2015-10-19 15:20 +0200
[RFC v3 5/9] kmsg: add function for adding and deleting additional buffers Paul Osmialowski <p.osmialowsk@samsung.com> - 2015-10-19 15:20 +0200
Re: [RFC v3 5/9] kmsg: add function for adding and deleting additional buffers kbuild test robot <lkp@intel.com> - 2015-10-19 20:30 +0200
Re: [RFC v3 0/9] Additional kmsg devices Richard Weinberger <richard.weinberger@gmail.com> - 2015-10-19 15:30 +0200
| From | Paul Osmialowski <p.osmialowsk@samsung.com> |
|---|---|
| Date | 2015-10-19 15:10 +0200 |
| Subject | [RFC v3 0/9] Additional kmsg devices |
| Message-ID | <qlicF-4P7-7@gated-at.bofh.it> |
Dear All, This is the third iteration of Marcin Niesluchowski's serie of patches extending kmsg interface with ability to dynamically create (and destroy) kmsg-like devices which can be used by userspace for logging. In this iteration, following Joe Perches's suggestion, I've extracted kmsg related functions from printk.c to a new file, kmsg.c. Best regards, Paul Marcin Niesluchowski (7): printk: add one function for storing log in proper format kmsg: introduce additional kmsg devices support kmsg: add additional buffers support to memory class kmsg: add function for adding and deleting additional buffers kmsg: add ioctl for adding and deleting kmsg* devices kmsg: add ioctl for kmsg* devices operating on buffers kmsg: add predefined _PID, _TID, _COMM keywords to kmsg* log dict Paul Osmialowski (2): printk: extract kmsg-related routines from printk.c to kmsg.c kmsg: selftests Documentation/ioctl/ioctl-number.txt | 1 + drivers/char/mem.c | 27 +- fs/proc/kmsg.c | 4 +- include/linux/printk.h | 48 + include/uapi/linux/Kbuild | 1 + include/uapi/linux/kmsg_ioctl.h | 45 + kernel/printk/Makefile | 1 + kernel/printk/kmsg.c | 1054 +++++++++++++++++ kernel/printk/printk.c | 1250 +++++--------------- kernel/printk/printk.h | 247 ++++ samples/kmsg/kmsg-api.h | 44 + tools/testing/selftests/Makefile | 1 + tools/testing/selftests/kmsg/.gitignore | 1 + tools/testing/selftests/kmsg/Makefile | 30 + tools/testing/selftests/kmsg/kmsg-test.c | 329 ++++++ tools/testing/selftests/kmsg/kmsg-test.h | 34 + tools/testing/selftests/kmsg/test-buffer-add-del.c | 76 ++ .../kmsg/test-buffer-add-write-read-del.c | 161 +++ .../kmsg/test-buffer-buf-multithreaded-torture.c | 199 ++++ .../selftests/kmsg/test-buffer-buf-torture.c | 139 +++ 20 files changed, 2729 insertions(+), 963 deletions(-) create mode 100644 include/uapi/linux/kmsg_ioctl.h create mode 100644 kernel/printk/kmsg.c create mode 100644 kernel/printk/printk.h create mode 100644 samples/kmsg/kmsg-api.h create mode 100644 tools/testing/selftests/kmsg/.gitignore create mode 100644 tools/testing/selftests/kmsg/Makefile create mode 100644 tools/testing/selftests/kmsg/kmsg-test.c create mode 100644 tools/testing/selftests/kmsg/kmsg-test.h create mode 100644 tools/testing/selftests/kmsg/test-buffer-add-del.c create mode 100644 tools/testing/selftests/kmsg/test-buffer-add-write-read-del.c create mode 100644 tools/testing/selftests/kmsg/test-buffer-buf-multithreaded-torture.c create mode 100644 tools/testing/selftests/kmsg/test-buffer-buf-torture.c -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Paul Osmialowski <p.osmialowsk@samsung.com> |
|---|---|
| Date | 2015-10-19 15:10 +0200 |
| Subject | [RFC v3 6/9] kmsg: add ioctl for adding and deleting kmsg* devices |
| Message-ID | <qlimo-5hD-47@gated-at.bofh.it> |
| In reply to | #1250651 |
From: Marcin Niesluchowski <m.niesluchow@samsung.com>
There is no possibility to add/delete kmsg* buffers from userspace.
Adds following ioctl for main kmsg device adding and deleting
additional kmsg devices:
* KMSG_CMD_BUFFER_ADD
* KMSG_CMD_BUFFER_DEL
Signed-off-by: Marcin Niesluchowski <m.niesluchow@samsung.com>
Signed-off-by: Paul Osmialowski <p.osmialowsk@samsung.com>
---
Documentation/ioctl/ioctl-number.txt | 1 +
drivers/char/mem.c | 2 +-
include/linux/printk.h | 7 ++
include/uapi/linux/Kbuild | 1 +
include/uapi/linux/kmsg_ioctl.h | 30 +++++++++
kernel/printk/kmsg.c | 123 +++++++++++++++++++++++++++++++++++
6 files changed, 163 insertions(+), 1 deletion(-)
create mode 100644 include/uapi/linux/kmsg_ioctl.h
diff --git a/Documentation/ioctl/ioctl-number.txt b/Documentation/ioctl/ioctl-number.txt
index 43e6923..76dec8b 100644
--- a/Documentation/ioctl/ioctl-number.txt
+++ b/Documentation/ioctl/ioctl-number.txt
@@ -319,6 +319,7 @@ Code Seq#(hex) Include File Comments
<mailto:vgo@ratio.de>
0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca>
0xB3 00 linux/mmc/ioctl.h
+0xBB 00-02 uapi/linux/kmsg_ioctl.h
0xC0 00-0F linux/usb/iowarrior.h
0xCA 00-0F uapi/misc/cxl.h
0xCA 80-8F uapi/scsi/cxlflash_ioctl.h
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index 7d46234..ac824de 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -808,7 +808,7 @@ static int memory_open(struct inode *inode, struct file *filp)
minor = iminor(inode);
if (minor >= ARRAY_SIZE(devlist))
- return kmsg_memory_open(inode, filp);
+ return kmsg_memory_open_ext(inode, filp);
dev = &devlist[minor];
if (!dev->fops)
diff --git a/include/linux/printk.h b/include/linux/printk.h
index 35111e8..294adab 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -427,9 +427,11 @@ extern struct class *mem_class;
#define KMSG_MINOR 11
extern const struct file_operations kmsg_fops;
+extern const struct file_operations kmsg_fops_ext;
extern struct device *init_kmsg(int minor, umode_t mode);
extern int kmsg_memory_open(struct inode *inode, struct file *filp);
+extern int kmsg_memory_open_ext(struct inode *inode, struct file *filp);
extern int kmsg_mode(int minor, umode_t *mode);
extern int kmsg_sys_buffer_add(size_t size, umode_t mode);
extern void kmsg_sys_buffer_del(int minor);
@@ -446,6 +448,11 @@ static inline int kmsg_memory_open(struct inode *inode, struct file *filp)
return -ENXIO;
}
+static inline int kmsg_memory_open_ext(struct inode *inode, struct file *filp)
+{
+ return -ENXIO;
+}
+
static inline int kmsg_mode(int minor, umode_t *mode)
{
return -ENXIO;
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
index e777078..d998999 100644
--- a/include/uapi/linux/Kbuild
+++ b/include/uapi/linux/Kbuild
@@ -225,6 +225,7 @@ header-y += kernel-page-flags.h
header-y += kexec.h
header-y += keyboard.h
header-y += keyctl.h
+header-y += kmsg_ioctl.h
ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/kvm.h \
$(srctree)/arch/$(SRCARCH)/include/asm/kvm.h),)
diff --git a/include/uapi/linux/kmsg_ioctl.h b/include/uapi/linux/kmsg_ioctl.h
new file mode 100644
index 0000000..89c0c61
--- /dev/null
+++ b/include/uapi/linux/kmsg_ioctl.h
@@ -0,0 +1,30 @@
+/*
+ * This is ioctl include for kmsg* devices
+ */
+
+#ifndef _KMSG_IOCTL_H_
+#define _KMSG_IOCTL_H_
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+struct kmsg_cmd_buffer_add {
+ size_t size;
+ unsigned short mode;
+ int minor;
+} __attribute__((packed));
+
+#define KMSG_IOCTL_MAGIC 0xBB
+
+/*
+ * A ioctl interface for kmsg device.
+ *
+ * KMSG_CMD_BUFFER_ADD: Creates additional kmsg device based on its size
+ * and mode. Minor of created device is put.
+ * KMSG_CMD_BUFFER_DEL: Removes additional kmsg device based on its minor
+ */
+#define KMSG_CMD_BUFFER_ADD _IOWR(KMSG_IOCTL_MAGIC, 0x00, \
+ struct kmsg_cmd_buffer_add)
+#define KMSG_CMD_BUFFER_DEL _IOW(KMSG_IOCTL_MAGIC, 0x01, int)
+
+#endif
diff --git a/kernel/printk/kmsg.c b/kernel/printk/kmsg.c
index 184575b..f91a64a 100644
--- a/kernel/printk/kmsg.c
+++ b/kernel/printk/kmsg.c
@@ -22,8 +22,12 @@
#include <asm/uaccess.h>
+#include <uapi/linux/kmsg_ioctl.h>
+
#include "printk.h"
+#define KMSG_MAX_MINOR_LEN 20
+
/* /dev/kmsg - userspace message inject/listen interface */
struct devkmsg_user {
u64 seq;
@@ -407,6 +411,118 @@ const struct file_operations kmsg_fops = {
.release = devkmsg_release,
};
+static int kmsg_open_ext(struct inode *inode, struct file *file)
+{
+ return kmsg_fops.open(inode, file);
+}
+
+static ssize_t kmsg_write_iter_ext(struct kiocb *iocb, struct iov_iter *from)
+{
+ return kmsg_fops.write_iter(iocb, from);
+}
+
+static ssize_t kmsg_read_ext(struct file *file, char __user *buf,
+ size_t count, loff_t *ppos)
+{
+ return kmsg_fops.read(file, buf, count, ppos);
+}
+
+static loff_t kmsg_llseek_ext(struct file *file, loff_t offset, int whence)
+{
+ return kmsg_fops.llseek(file, offset, whence);
+}
+
+static unsigned int kmsg_poll_ext(struct file *file,
+ struct poll_table_struct *wait)
+{
+ return kmsg_fops.poll(file, wait);
+}
+
+static long kmsg_ioctl_buffers(struct file *file, unsigned int cmd,
+ unsigned long arg)
+{
+ void __user *argp = (void __user *)arg;
+ size_t size;
+ umode_t mode;
+ char name[4 + KMSG_MAX_MINOR_LEN + 1];
+ struct device *dev;
+ int minor;
+
+ if (iminor(file->f_inode) != log_buf.minor)
+ return -ENOTTY;
+
+ switch (cmd) {
+ case KMSG_CMD_BUFFER_ADD:
+ if (copy_from_user(&size, argp, sizeof(size)))
+ return -EFAULT;
+ argp += sizeof(size);
+ if (copy_from_user(&mode, argp, sizeof(mode)))
+ return -EFAULT;
+ argp += sizeof(mode);
+ minor = kmsg_sys_buffer_add(size, mode);
+ if (minor < 0)
+ return minor;
+ sprintf(name, "kmsg%d", minor);
+ dev = device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor),
+ NULL, name);
+ if (IS_ERR(dev)) {
+ kmsg_sys_buffer_del(minor);
+ return PTR_ERR(dev);
+ }
+ if (copy_to_user(argp, &minor, sizeof(minor))) {
+ device_destroy(mem_class, MKDEV(MEM_MAJOR, minor));
+ kmsg_sys_buffer_del(minor);
+ return -EFAULT;
+ }
+ return 0;
+ case KMSG_CMD_BUFFER_DEL:
+ if (copy_from_user(&minor, argp, sizeof(minor)))
+ return -EFAULT;
+ if (minor <= log_buf.minor)
+ return -EINVAL;
+ device_destroy(mem_class, MKDEV(MEM_MAJOR, minor));
+ kmsg_sys_buffer_del(minor);
+ return 0;
+ }
+ return -ENOTTY;
+}
+
+static long kmsg_unlocked_ioctl_ext(struct file *file, unsigned int cmd,
+ unsigned long arg)
+{
+ long ret = kmsg_ioctl_buffers(file, cmd, arg);
+
+ if (ret == -ENOTTY)
+ return kmsg_fops.unlocked_ioctl(file, cmd, arg);
+ return ret;
+}
+
+static long kmsg_compat_ioctl_ext(struct file *file, unsigned int cmd,
+ unsigned long arg)
+{
+ long ret = kmsg_ioctl_buffers(file, cmd, arg);
+
+ if (ret == -ENOTTY)
+ return kmsg_fops.compat_ioctl(file, cmd, arg);
+ return ret;
+}
+
+static int kmsg_release_ext(struct inode *inode, struct file *file)
+{
+ return kmsg_fops.release(inode, file);
+}
+
+const struct file_operations kmsg_fops_ext = {
+ .open = kmsg_open_ext,
+ .read = kmsg_read_ext,
+ .write_iter = kmsg_write_iter_ext,
+ .llseek = kmsg_llseek_ext,
+ .poll = kmsg_poll_ext,
+ .unlocked_ioctl = kmsg_unlocked_ioctl_ext,
+ .compat_ioctl = kmsg_compat_ioctl_ext,
+ .release = kmsg_release_ext,
+};
+
/* Should be used for device registration */
struct device *init_kmsg(int minor, umode_t mode)
{
@@ -423,6 +539,13 @@ int kmsg_memory_open(struct inode *inode, struct file *filp)
return kmsg_fops.open(inode, filp);
}
+int kmsg_memory_open_ext(struct inode *inode, struct file *filp)
+{
+ filp->f_op = &kmsg_fops_ext;
+
+ return kmsg_fops_ext.open(inode, filp);
+}
+
int kmsg_mode(int minor, umode_t *mode)
{
int ret = -ENXIO;
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Arnd Bergmann <arnd@arndb.de> |
|---|---|
| Date | 2015-10-19 15:20 +0200 |
| Subject | Re: [RFC v3 6/9] kmsg: add ioctl for adding and deleting kmsg* devices |
| Message-ID | <qliw3-5t5-23@gated-at.bofh.it> |
| In reply to | #1250655 |
On Monday 19 October 2015 14:58:20 Paul Osmialowski wrote:
> +
> +struct kmsg_cmd_buffer_add {
> + size_t size;
> + unsigned short mode;
> + int minor;
> +} __attribute__((packed));
> +
> +#define KMSG_IOCTL_MAGIC 0xBB
> +
> +/*
>
Try to avoid using packed unaligned data structures. Here I would
just use __u64 and __u32 members.
> + case KMSG_CMD_BUFFER_ADD:
> + if (copy_from_user(&size, argp, sizeof(size)))
> + return -EFAULT;
> + argp += sizeof(size);
> + if (copy_from_user(&mode, argp, sizeof(mode)))
> + return -EFAULT;
This is a rather unusual way to access the data. Just copy the
entire structure to the stack.
Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Paul Osmialowski <p.osmialowsk@samsung.com> |
|---|---|
| Date | 2015-10-19 15:20 +0200 |
| Subject | [RFC v3 5/9] kmsg: add function for adding and deleting additional buffers |
| Message-ID | <qliw2-5t5-7@gated-at.bofh.it> |
| In reply to | #1250651 |
From: Marcin Niesluchowski <m.niesluchow@samsung.com>
Additional kmsg buffers should be created and deleted dynamically.
Adding two functions
* kmsg_sys_buffer_add() creates additional kmsg buffer returning minor
* kmsg_sys_buffer_del() deletes one based on provided minor
Signed-off-by: Marcin Niesluchowski <m.niesluchow@samsung.com>
Signed-off-by: Paul Osmialowski <p.osmialowsk@samsung.com>
---
include/linux/printk.h | 9 +++++
kernel/printk/kmsg.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++--
kernel/printk/printk.c | 12 ++++++
kernel/printk/printk.h | 4 ++
4 files changed, 129 insertions(+), 3 deletions(-)
diff --git a/include/linux/printk.h b/include/linux/printk.h
index 67840e0..35111e8 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -431,6 +431,8 @@ extern const struct file_operations kmsg_fops;
extern struct device *init_kmsg(int minor, umode_t mode);
extern int kmsg_memory_open(struct inode *inode, struct file *filp);
extern int kmsg_mode(int minor, umode_t *mode);
+extern int kmsg_sys_buffer_add(size_t size, umode_t mode);
+extern void kmsg_sys_buffer_del(int minor);
#else
@@ -449,6 +451,13 @@ static inline int kmsg_mode(int minor, umode_t *mode)
return -ENXIO;
}
+static inline int kmsg_sys_buffer_add(size_t size, umode_t mode)
+{
+ return -ENXIO;
+}
+
+static inline void kmsg_sys_buffer_del(int minor) {}
+
#endif
enum {
diff --git a/kernel/printk/kmsg.c b/kernel/printk/kmsg.c
index 7fcd628..184575b 100644
--- a/kernel/printk/kmsg.c
+++ b/kernel/printk/kmsg.c
@@ -18,6 +18,7 @@
#include <linux/device.h>
#include <linux/major.h>
#include <linux/kdev_t.h>
+#include <linux/kref.h>
#include <asm/uaccess.h>
@@ -140,8 +141,20 @@ static ssize_t kmsg_read(struct log_buffer *log_b, struct file *file,
}
raw_spin_unlock_irq(&log_b->lock);
- ret = wait_event_interruptible(log_b->wait,
- user->seq != log_b->next_seq);
+ if (log_b == &log_buf) {
+ ret = wait_event_interruptible(log_b->wait,
+ user->seq != log_b->next_seq);
+ } else {
+ rcu_read_unlock();
+ kref_get(&log_b->refcount);
+ ret = wait_event_interruptible(log_b->wait,
+ user->seq != log_b->next_seq);
+ if (log_b->minor == -1)
+ ret = -ENXIO;
+ if (kref_put(&log_b->refcount, log_buf_release))
+ ret = -ENXIO;
+ rcu_read_lock();
+ }
if (ret)
goto out;
raw_spin_lock_irq(&log_b->lock);
@@ -310,8 +323,14 @@ static unsigned int devkmsg_poll(struct file *file, poll_table *wait)
rcu_read_lock();
list_for_each_entry_rcu(log_b, &log_buf.list, list) {
if (log_b->minor == minor) {
+ kref_get(&log_b->refcount);
+ rcu_read_unlock();
+
ret = kmsg_poll(log_b, file, wait);
- break;
+
+ if (kref_put(&log_b->refcount, log_buf_release))
+ return POLLERR|POLLNVAL;
+ return ret;
}
}
rcu_read_unlock();
@@ -427,6 +446,88 @@ int kmsg_mode(int minor, umode_t *mode)
return ret;
}
+static DEFINE_SPINLOCK(kmsg_sys_list_lock);
+
+int kmsg_sys_buffer_add(size_t size, umode_t mode)
+{
+ unsigned long flags;
+ int minor = log_buf.minor;
+ struct log_buffer *log_b;
+ struct log_buffer *log_b_new;
+
+ if (size < LOG_LINE_MAX + PREFIX_MAX)
+ return -EINVAL;
+
+ log_b_new = kzalloc(sizeof(struct log_buffer), GFP_KERNEL);
+ if (!log_b_new)
+ return -ENOMEM;
+
+ log_b_new->buf = kmalloc(size, GFP_KERNEL);
+ if (!log_b_new->buf) {
+ kfree(log_b_new);
+ return -ENOMEM;
+ }
+
+ log_b_new->len = size;
+ log_b_new->lock = __RAW_SPIN_LOCK_UNLOCKED(log_b_new->lock);
+ init_waitqueue_head(&log_b_new->wait);
+ kref_init(&log_b_new->refcount);
+ log_b_new->mode = mode;
+
+ kref_get(&log_b_new->refcount);
+
+ spin_lock_irqsave(&kmsg_sys_list_lock, flags);
+
+ list_for_each_entry(log_b, &log_buf.list, list) {
+ if (log_b->minor - minor > 1)
+ break;
+
+ minor = log_b->minor;
+ }
+
+ if (!(minor & MINORMASK)) {
+ kref_put(&log_b->refcount, log_buf_release);
+ spin_unlock_irqrestore(&kmsg_sys_list_lock, flags);
+ return -ERANGE;
+ }
+
+ minor += 1;
+ log_b_new->minor = minor;
+
+ list_add_tail_rcu(&log_b_new->list, &log_b->list);
+
+ spin_unlock_irqrestore(&kmsg_sys_list_lock, flags);
+
+ return minor;
+}
+
+void kmsg_sys_buffer_del(int minor)
+{
+ unsigned long flags;
+ struct log_buffer *log_b;
+
+ spin_lock_irqsave(&kmsg_sys_list_lock, flags);
+
+ list_for_each_entry(log_b, &log_buf.list, list) {
+ if (log_b->minor == minor)
+ break;
+ }
+
+ if (log_b == &log_buf) {
+ spin_unlock_irqrestore(&kmsg_sys_list_lock, flags);
+ return;
+ }
+
+ list_del_rcu(&log_b->list);
+
+ spin_unlock_irqrestore(&kmsg_sys_list_lock, flags);
+
+ log_b->minor = -1;
+ wake_up_interruptible(&log_b->wait);
+
+ kref_put(&log_b->refcount, log_buf_release);
+}
+
static DEFINE_SPINLOCK(dump_list_lock);
static LIST_HEAD(dump_list);
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index beabebb..cfedbe9 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -41,6 +41,8 @@
#include <linux/irq_work.h>
#include <linux/utsname.h>
#include <linux/ctype.h>
+#include <linux/kref.h>
+#include <linux/slab.h>
#include <asm/uaccess.h>
@@ -173,6 +175,7 @@ struct log_buffer log_buf = {
.len = __LOG_BUF_K_LEN,
.lock = __RAW_SPIN_LOCK_UNLOCKED(log_buf.lock),
.wait = __WAIT_QUEUE_HEAD_INITIALIZER(log_buf.wait),
+ .refcount = { .refcount = { .counter = 0 } },
.first_seq = 0,
.first_idx = 0,
.next_seq = 0,
@@ -218,6 +221,15 @@ u32 log_buf_len_get(void)
return log_buf.len;
}
+void log_buf_release(struct kref *ref)
+{
+ struct log_buffer *log_b = container_of(ref, struct log_buffer,
+ refcount);
+
+ kfree(log_b->buf);
+ kfree(log_b);
+}
+
/*
* Check whether there is enough free space for the given message.
*
diff --git a/kernel/printk/printk.h b/kernel/printk/printk.h
index 0755100..64f8878 100644
--- a/kernel/printk/printk.h
+++ b/kernel/printk/printk.h
@@ -5,6 +5,7 @@
#include <linux/spinlock_types.h>
#include <linux/types.h>
#include <linux/wait.h>
+#include <linux/kref.h>
#define PREFIX_MAX 32
#define LOG_LINE_MAX (1024 - PREFIX_MAX)
@@ -99,6 +100,7 @@ struct log_buffer {
char *buf; /* cyclic log buffer */
u32 len; /* buffer length */
wait_queue_head_t wait; /* wait queue for kmsg buffer */
+ struct kref refcount; /* refcount for kmsg_sys buffers */
#endif
/*
* The lock protects kmsg buffer, indices, counters. This can be taken within
@@ -127,6 +129,8 @@ struct log_buffer {
extern struct log_buffer log_buf;
+void log_buf_release(struct kref *ref);
+
ssize_t msg_print_ext_header(char *buf, size_t size,
struct printk_log *msg, u64 seq,
enum log_flags prev_flags);
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2015-10-19 20:30 +0200 |
| Subject | Re: [RFC v3 5/9] kmsg: add function for adding and deleting additional buffers |
| Message-ID | <qlnm2-46a-21@gated-at.bofh.it> |
| In reply to | #1250667 |
Hi Marcin,
[auto build test WARNING on next-20151016 -- if it's inappropriate base, please suggest rules for selecting the more suitable base]
url: https://github.com/0day-ci/linux/commits/Paul-Osmialowski/Additional-kmsg-devices/20151019-211509
reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__
sparse warnings: (new ones prefixed by >>)
>> include/linux/rcupdate.h:915:9: sparse: context imbalance in 'kmsg_read' - unexpected unlock
vim +/kmsg_read +915 include/linux/rcupdate.h
f27bc4873 Paul E. McKenney 2014-05-04 899 * that that preemption never happens within any RCU read-side critical
f27bc4873 Paul E. McKenney 2014-05-04 900 * section whose outermost rcu_read_unlock() is called with irqs disabled.
f27bc4873 Paul E. McKenney 2014-05-04 901 * This approach relies on the fact that rt_mutex_unlock() currently only
f27bc4873 Paul E. McKenney 2014-05-04 902 * acquires irq-disabled locks.
f27bc4873 Paul E. McKenney 2014-05-04 903 *
f27bc4873 Paul E. McKenney 2014-05-04 904 * The second of these two approaches is best in most situations,
f27bc4873 Paul E. McKenney 2014-05-04 905 * however, the first approach can also be useful, at least to those
f27bc4873 Paul E. McKenney 2014-05-04 906 * developers willing to keep abreast of the set of locks acquired by
f27bc4873 Paul E. McKenney 2014-05-04 907 * rt_mutex_unlock().
f27bc4873 Paul E. McKenney 2014-05-04 908 *
3d76c0829 Paul E. McKenney 2009-09-28 909 * See rcu_read_lock() for more information.
3d76c0829 Paul E. McKenney 2009-09-28 910 */
bc33f24bd Paul E. McKenney 2009-08-22 911 static inline void rcu_read_unlock(void)
bc33f24bd Paul E. McKenney 2009-08-22 912 {
f78f5b90c Paul E. McKenney 2015-06-18 913 RCU_LOCKDEP_WARN(!rcu_is_watching(),
bde23c689 Heiko Carstens 2012-02-01 914 "rcu_read_unlock() used illegally while idle");
bc33f24bd Paul E. McKenney 2009-08-22 @915 __release(RCU);
bc33f24bd Paul E. McKenney 2009-08-22 916 __rcu_read_unlock();
d24209bb6 Paul E. McKenney 2015-01-21 917 rcu_lock_release(&rcu_lock_map); /* Keep acq info for rls diags. */
bc33f24bd Paul E. McKenney 2009-08-22 918 }
^1da177e4 Linus Torvalds 2005-04-16 919
^1da177e4 Linus Torvalds 2005-04-16 920 /**
ca5ecddfa Paul E. McKenney 2010-04-28 921 * rcu_read_lock_bh() - mark the beginning of an RCU-bh critical section
^1da177e4 Linus Torvalds 2005-04-16 922 *
^1da177e4 Linus Torvalds 2005-04-16 923 * This is equivalent of rcu_read_lock(), but to be used when updates
:::::: The code at line 915 was first introduced by commit
:::::: bc33f24bdca8b6e97376e3a182ab69e6cdefa989 rcu: Consolidate sparse and lockdep declarations in include/linux/rcupdate.h
:::::: TO: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
:::::: CC: Ingo Molnar <mingo@elte.hu>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Richard Weinberger <richard.weinberger@gmail.com> |
|---|---|
| Date | 2015-10-19 15:30 +0200 |
| Message-ID | <qliFJ-5Ez-31@gated-at.bofh.it> |
| In reply to | #1250651 |
On Mon, Oct 19, 2015 at 2:58 PM, Paul Osmialowski <p.osmialowsk@samsung.com> wrote: > Dear All, > > This is the third iteration of Marcin Niesluchowski's serie of patches > extending kmsg interface with ability to dynamically create (and destroy) > kmsg-like devices which can be used by userspace for logging. > > In this iteration, following Joe Perches's suggestion, I've extracted > kmsg related functions from printk.c to a new file, kmsg.c. > > Best regards, > Paul > > Marcin Niesluchowski (7): > printk: add one function for storing log in proper format > kmsg: introduce additional kmsg devices support > kmsg: add additional buffers support to memory class > kmsg: add function for adding and deleting additional buffers > kmsg: add ioctl for adding and deleting kmsg* devices > kmsg: add ioctl for kmsg* devices operating on buffers > kmsg: add predefined _PID, _TID, _COMM keywords to kmsg* log dict > > Paul Osmialowski (2): > printk: extract kmsg-related routines from printk.c to kmsg.c > kmsg: selftests Not CC'ing critical voices it not very nice. 8-) As I replied to v1 of this series, IHMO we should not encourage userspace tools to use kmsg as their poor-man's syslog. Everything what this series does in kernel space can also be done in userspace. Just my two cents. -- Thanks, //richard -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web