Unverified Commit 5f597f38 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!14682 CVE-2024-56701

Merge Pull Request from: @ci-robot 
 
PR sync from: Liao Chen <liaochen4@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/WJPA4CJMAEFL3UV2CCZCS3TLALAKEY4A/ 
fix CVE-2024-56701

Michael Ellerman (1):
  powerpc/pseries: Fix dtl_access_lock to be a rw_semaphore


-- 
2.34.1
 
https://gitee.com/src-openeuler/kernel/issues/IBEDPE 
 
Link:https://gitee.com/openeuler/kernel/pulls/14682

 

Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents b160ef62 e2c02b51
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
#ifndef _ASM_POWERPC_DTL_H
#define _ASM_POWERPC_DTL_H

#include <linux/rwsem.h>
#include <asm/lppaca.h>
#include <linux/spinlock_types.h>

/*
 * Layout of entries in the hypervisor's dispatch trace log buffer.
@@ -35,7 +35,7 @@ struct dtl_entry {
#define DTL_LOG_ALL		(DTL_LOG_CEDE | DTL_LOG_PREEMPT | DTL_LOG_FAULT)

extern struct kmem_cache *dtl_cache;
extern rwlock_t dtl_access_lock;
extern struct rw_semaphore dtl_access_lock;

extern void register_dtl_buffer(int cpu);
extern void alloc_dtl_buffers(unsigned long *time_limit);
+4 −4
Original line number Diff line number Diff line
@@ -191,7 +191,7 @@ static int dtl_enable(struct dtl *dtl)
		return -EBUSY;

	/* ensure there are no other conflicting dtl users */
	if (!read_trylock(&dtl_access_lock))
	if (!down_read_trylock(&dtl_access_lock))
		return -EBUSY;

	n_entries = dtl_buf_entries;
@@ -199,7 +199,7 @@ static int dtl_enable(struct dtl *dtl)
	if (!buf) {
		printk(KERN_WARNING "%s: buffer alloc failed for cpu %d\n",
				__func__, dtl->cpu);
		read_unlock(&dtl_access_lock);
		up_read(&dtl_access_lock);
		return -ENOMEM;
	}

@@ -217,7 +217,7 @@ static int dtl_enable(struct dtl *dtl)
	spin_unlock(&dtl->lock);

	if (rc) {
		read_unlock(&dtl_access_lock);
		up_read(&dtl_access_lock);
		kmem_cache_free(dtl_cache, buf);
	}

@@ -232,7 +232,7 @@ static void dtl_disable(struct dtl *dtl)
	dtl->buf = NULL;
	dtl->buf_entries = 0;
	spin_unlock(&dtl->lock);
	read_unlock(&dtl_access_lock);
	up_read(&dtl_access_lock);
}

/* file interface */
+4 −4
Original line number Diff line number Diff line
@@ -169,7 +169,7 @@ struct vcpu_dispatch_data {
 */
#define NR_CPUS_H	NR_CPUS

DEFINE_RWLOCK(dtl_access_lock);
DECLARE_RWSEM(dtl_access_lock);
static DEFINE_PER_CPU(struct vcpu_dispatch_data, vcpu_disp_data);
static DEFINE_PER_CPU(u64, dtl_entry_ridx);
static DEFINE_PER_CPU(struct dtl_worker, dtl_workers);
@@ -463,7 +463,7 @@ static int dtl_worker_enable(unsigned long *time_limit)
{
	int rc = 0, state;

	if (!write_trylock(&dtl_access_lock)) {
	if (!down_write_trylock(&dtl_access_lock)) {
		rc = -EBUSY;
		goto out;
	}
@@ -479,7 +479,7 @@ static int dtl_worker_enable(unsigned long *time_limit)
		pr_err("vcpudispatch_stats: unable to setup workqueue for DTL processing\n");
		free_dtl_buffers(time_limit);
		reset_global_dtl_mask();
		write_unlock(&dtl_access_lock);
		up_write(&dtl_access_lock);
		rc = -EINVAL;
		goto out;
	}
@@ -494,7 +494,7 @@ static void dtl_worker_disable(unsigned long *time_limit)
	cpuhp_remove_state(dtl_worker_state);
	free_dtl_buffers(time_limit);
	reset_global_dtl_mask();
	write_unlock(&dtl_access_lock);
	up_write(&dtl_access_lock);
}

static ssize_t vcpudispatch_stats_write(struct file *file, const char __user *p,