diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 10:06:00 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 10:06:00 +0000 |
commit | b15a952c52a6825376d3e7f6c1bf5c886c6d8b74 (patch) | |
tree | 1500f2f8f276908a36d8126cb632c0d6b1276764 /debian/patches-rt/0088-printk-use-atomic64_t-for-devkmsg_user.seq.patch | |
parent | Adding upstream version 5.10.209. (diff) | |
download | linux-debian.tar.xz linux-debian.zip |
Adding debian version 5.10.209-2.debian/5.10.209-2debian
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'debian/patches-rt/0088-printk-use-atomic64_t-for-devkmsg_user.seq.patch')
-rw-r--r-- | debian/patches-rt/0088-printk-use-atomic64_t-for-devkmsg_user.seq.patch | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/debian/patches-rt/0088-printk-use-atomic64_t-for-devkmsg_user.seq.patch b/debian/patches-rt/0088-printk-use-atomic64_t-for-devkmsg_user.seq.patch new file mode 100644 index 000000000..d5c3de71c --- /dev/null +++ b/debian/patches-rt/0088-printk-use-atomic64_t-for-devkmsg_user.seq.patch @@ -0,0 +1,112 @@ +From ccc444abbce9df5f0747db8dd10bd39388d58836 Mon Sep 17 00:00:00 2001 +From: John Ogness <john.ogness@linutronix.de> +Date: Thu, 10 Dec 2020 15:33:40 +0106 +Subject: [PATCH 088/323] printk: use atomic64_t for devkmsg_user.seq +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.204-rt100.tar.xz + +@user->seq is indirectly protected by @logbuf_lock. Once @logbuf_lock +is removed, @user->seq will be no longer safe from an atomicity point +of view. + +In preparation for the removal of @logbuf_lock, change it to +atomic64_t to provide this safety. + +Signed-off-by: John Ogness <john.ogness@linutronix.de> +--- + kernel/printk/printk.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index 4444b3e292d5..a351ed400c04 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -664,7 +664,7 @@ static ssize_t msg_print_ext_body(char *buf, size_t size, + + /* /dev/kmsg - userspace message inject/listen interface */ + struct devkmsg_user { +- u64 seq; ++ atomic64_t seq; + struct ratelimit_state rs; + struct mutex lock; + char buf[CONSOLE_EXT_LOG_MAX]; +@@ -766,7 +766,7 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf, + return ret; + + logbuf_lock_irq(); +- if (!prb_read_valid(prb, user->seq, r)) { ++ if (!prb_read_valid(prb, atomic64_read(&user->seq), r)) { + if (file->f_flags & O_NONBLOCK) { + ret = -EAGAIN; + logbuf_unlock_irq(); +@@ -775,15 +775,15 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf, + + logbuf_unlock_irq(); + ret = wait_event_interruptible(log_wait, +- prb_read_valid(prb, user->seq, r)); ++ prb_read_valid(prb, atomic64_read(&user->seq), r)); + if (ret) + goto out; + logbuf_lock_irq(); + } + +- if (r->info->seq != user->seq) { ++ if (r->info->seq != atomic64_read(&user->seq)) { + /* our last seen message is gone, return error and reset */ +- user->seq = r->info->seq; ++ atomic64_set(&user->seq, r->info->seq); + ret = -EPIPE; + logbuf_unlock_irq(); + goto out; +@@ -794,7 +794,7 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf, + &r->text_buf[0], r->info->text_len, + &r->info->dev_info); + +- user->seq = r->info->seq + 1; ++ atomic64_set(&user->seq, r->info->seq + 1); + logbuf_unlock_irq(); + + if (len > count) { +@@ -834,7 +834,7 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) + switch (whence) { + case SEEK_SET: + /* the first record */ +- user->seq = prb_first_valid_seq(prb); ++ atomic64_set(&user->seq, prb_first_valid_seq(prb)); + break; + case SEEK_DATA: + /* +@@ -842,11 +842,11 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) + * like issued by 'dmesg -c'. Reading /dev/kmsg itself + * changes no global state, and does not clear anything. + */ +- user->seq = latched_seq_read_nolock(&clear_seq); ++ atomic64_set(&user->seq, latched_seq_read_nolock(&clear_seq)); + break; + case SEEK_END: + /* after the last record */ +- user->seq = prb_next_seq(prb); ++ atomic64_set(&user->seq, prb_next_seq(prb)); + break; + default: + ret = -EINVAL; +@@ -869,7 +869,7 @@ static __poll_t devkmsg_poll(struct file *file, poll_table *wait) + logbuf_lock_irq(); + if (prb_read_valid_info(prb, user->seq, &info, NULL)) { + /* return error when data has vanished underneath us */ +- if (info.seq != user->seq) ++ if (info.seq != atomic64_read(&user->seq)) + ret = EPOLLIN|EPOLLRDNORM|EPOLLERR|EPOLLPRI; + else + ret = EPOLLIN|EPOLLRDNORM; +@@ -908,7 +908,7 @@ static int devkmsg_open(struct inode *inode, struct file *file) + &user->text_buf[0], sizeof(user->text_buf)); + + logbuf_lock_irq(); +- user->seq = prb_first_valid_seq(prb); ++ atomic64_set(&user->seq, prb_first_valid_seq(prb)); + logbuf_unlock_irq(); + + file->private_data = user; +-- +2.43.0 + |