Merge tag 'LA.UM.9.12.c25-04100-SMxx50.QSSI13c28.0' of https://git.codelinaro.org/clo/la/kernel/msm-4.19 into android13-4.19-kona
"LA.UM.9.12.c25-04100-SMxx50.QSSI13c28.0" * tag 'LA.UM.9.12.c25-04100-SMxx50.QSSI13c28.0' of https://git.codelinaro.org/clo/la/kernel/msm-4.19: UPSTREAM: vsock: Do not allow binding to VMADDR_PORT_ANY kgsl: Add buffer overflow check for perfcounter dynamic list kgsl: Use the page compound order when freeing pages kgsl: Avoid use after free in kgsl_destroy_ion() kgsl: Prevent sign extension on alignments UPSTREAM: posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del() Conflicts: drivers/gpu/msm/kgsl_iommu.c Change-Id: I769cbb8dcdffef3cb3767b8252746235ee81c334
This commit is contained in:
7 files changed
+45
-25
No files matched your search
@@ -2659,6 +2659,8 @@ static int a6xx_perfcounter_update(struct adreno_device *adreno_dev,
|
||||
struct cpu_gpu_lock *lock = ptr;
|
||||
u32 *data = ptr + sizeof(*lock);
|
||||
int i, offset = 0;
|
||||
/* No of pairs to add: <reg,val> */
|
||||
u32 pending_pairs = adreno_is_a612(adreno_dev) ? 2 : 1;
|
||||
|
||||
if (cpu_gpu_lock(lock)) {
|
||||
cpu_gpu_unlock(lock);
|
||||
@@ -2679,6 +2681,13 @@ static int a6xx_perfcounter_update(struct adreno_device *adreno_dev,
|
||||
offset += 2;
|
||||
}
|
||||
|
||||
/* Ensure there is enough space in the reglist buffer for new pairs */
|
||||
if ((offset + (pending_pairs * 2)) >=
|
||||
(adreno_dev->pwrup_reglist.size / sizeof(u32))) {
|
||||
cpu_gpu_unlock(lock);
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
/*
|
||||
* For a612 targets A6XX_RBBM_PERFCTR_CNTL needs to be the last entry,
|
||||
* so overwrite the existing A6XX_RBBM_PERFCNTL_CTRL and add it back to
|
||||
@@ -2688,7 +2697,7 @@ static int a6xx_perfcounter_update(struct adreno_device *adreno_dev,
|
||||
data[offset - 2] = reg->select;
|
||||
data[offset - 1] = reg->countable;
|
||||
|
||||
data[offset] = A6XX_RBBM_PERFCTR_CNTL,
|
||||
data[offset] = A6XX_RBBM_PERFCTR_CNTL;
|
||||
data[offset + 1] = 1;
|
||||
} else {
|
||||
data[offset] = reg->select;
|
||||
|
||||
+17
-14
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2008-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <uapi/linux/sched/types.h>
|
||||
@@ -318,6 +318,7 @@ static void kgsl_destroy_ion(struct kgsl_memdesc *memdesc)
|
||||
* doesn't try to free it again
|
||||
*/
|
||||
memdesc->sgt = NULL;
|
||||
entry->priv_data = NULL;
|
||||
}
|
||||
|
||||
static struct kgsl_memdesc_ops kgsl_dmabuf_ops = {
|
||||
@@ -4942,27 +4943,29 @@ static unsigned long _search_range(struct kgsl_process_private *private,
|
||||
return result;
|
||||
}
|
||||
|
||||
unsigned long kgsl_get_align(struct kgsl_memdesc *memdesc)
|
||||
{
|
||||
u32 bit = kgsl_memdesc_get_align(memdesc);
|
||||
|
||||
if (bit >= ilog2(SZ_2M))
|
||||
return SZ_2M;
|
||||
else if (bit >= ilog2(SZ_1M))
|
||||
return SZ_1M;
|
||||
else if (bit >= ilog2(SZ_64K))
|
||||
return SZ_64K;
|
||||
|
||||
return PAGE_SIZE;
|
||||
}
|
||||
|
||||
static unsigned long _get_svm_area(struct kgsl_process_private *private,
|
||||
struct kgsl_mem_entry *entry, unsigned long hint,
|
||||
unsigned long len, unsigned long flags)
|
||||
{
|
||||
uint64_t start, end;
|
||||
int align_shift = kgsl_memdesc_get_align(&entry->memdesc);
|
||||
uint64_t align;
|
||||
unsigned long align = kgsl_get_align(&entry->memdesc);
|
||||
unsigned long result;
|
||||
unsigned long addr;
|
||||
|
||||
if (align_shift >= ilog2(SZ_2M))
|
||||
align = SZ_2M;
|
||||
else if (align_shift >= ilog2(SZ_1M))
|
||||
align = SZ_1M;
|
||||
else if (align_shift >= ilog2(SZ_64K))
|
||||
align = SZ_64K;
|
||||
else
|
||||
align = SZ_4K;
|
||||
|
||||
align = max_t(uint64_t, align, PAGE_SIZE);
|
||||
|
||||
/* get the GPU pagetable's SVM range */
|
||||
if (kgsl_mmu_svm_range(private->pagetable, &start, &end,
|
||||
entry->memdesc.flags))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2008-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
#ifndef __KGSL_H
|
||||
#define __KGSL_H
|
||||
@@ -489,6 +489,8 @@ void kgsl_mmu_remove_global(struct kgsl_device *device,
|
||||
struct kgsl_memdesc *memdesc);
|
||||
|
||||
/* Helper functions */
|
||||
unsigned long kgsl_get_align(struct kgsl_memdesc *memdesc);
|
||||
|
||||
int kgsl_request_irq(struct platform_device *pdev, const char *name,
|
||||
irq_handler_t handler, void *data);
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2002,2008-2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
@@ -106,7 +107,7 @@ static const char *memtype_str(int memtype)
|
||||
|
||||
static char get_alignflag(const struct kgsl_memdesc *m)
|
||||
{
|
||||
int align = kgsl_memdesc_get_align(m);
|
||||
u32 align = kgsl_memdesc_get_align(m);
|
||||
|
||||
if (align >= ilog2(SZ_1M))
|
||||
return 'L';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2011-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <linux/compat.h>
|
||||
@@ -2528,8 +2528,7 @@ static int kgsl_iommu_get_gpuaddr(struct kgsl_pagetable *pagetable,
|
||||
|
||||
size = kgsl_memdesc_footprint(memdesc);
|
||||
|
||||
align = max_t(uint64_t, 1 << kgsl_memdesc_get_align(memdesc),
|
||||
PAGE_SIZE);
|
||||
align = kgsl_get_align(memdesc);
|
||||
|
||||
if (memdesc->flags & KGSL_MEMFLAGS_FORCE_32BIT) {
|
||||
start = pt->compat_va_start;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2002,2007-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
@@ -960,11 +960,16 @@ static int kgsl_shmem_alloc_page(struct page **pages,
|
||||
|
||||
void kgsl_shmem_free_pages(struct kgsl_memdesc *memdesc)
|
||||
{
|
||||
int i;
|
||||
u32 i, n = 1;
|
||||
|
||||
for (i = 0; i < memdesc->page_count; i++)
|
||||
if (memdesc->pages[i])
|
||||
for (i = 0; i < memdesc->page_count; i += n) {
|
||||
n = 1;
|
||||
|
||||
if (memdesc->pages[i]) {
|
||||
n = 1 << compound_order(memdesc->pages[i]);
|
||||
put_page(memdesc->pages[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int kgsl_memdesc_file_setup(struct kgsl_memdesc *memdesc, uint64_t size)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2002, 2007-2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
#ifndef __KGSL_SHAREDMEM_H
|
||||
#define __KGSL_SHAREDMEM_H
|
||||
@@ -106,7 +107,7 @@ void kgsl_free_pages_from_sgt(struct kgsl_memdesc *memdesc);
|
||||
*
|
||||
* Returns the alignment requested, as power of 2 exponent.
|
||||
*/
|
||||
static inline int
|
||||
static inline u32
|
||||
kgsl_memdesc_get_align(const struct kgsl_memdesc *memdesc)
|
||||
{
|
||||
return MEMFLAGS(memdesc->flags, KGSL_MEMALIGN_MASK,
|
||||
|
||||
Reference in new issue
Block a user