Merge tag 'timers-vdso-2024-11-18' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull vdso data page handling updates from Thomas Gleixner:
"First steps of consolidating the VDSO data page handling.
The VDSO data page handling is architecture specific for historical
reasons, but there is no real technical reason to do so.
Aside of that VDSO data has become a dump ground for various
mechanisms and fail to provide a clear separation of the
functionalities.
Clean this up by:
- consolidating the VDSO page data by getting rid of architecture
specific warts especially in x86 and PowerPC.
- removing the last includes of header files which are pulling in
other headers outside of the VDSO namespace.
- seperating timekeeping and other VDSO data accordingly.
Further consolidation of the VDSO page handling is done in subsequent
changes scheduled for the next merge window.
This also lays the ground for expanding the VDSO time getters for
independent PTP clocks in a generic way without making every
architecture add support seperately"
* tag 'timers-vdso-2024-11-18' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (42 commits)
x86/vdso: Add missing brackets in switch case
vdso: Rename struct arch_vdso_data to arch_vdso_time_data
powerpc: Split systemcfg struct definitions out from vdso
powerpc: Split systemcfg data out of vdso data page
powerpc: Add kconfig option for the systemcfg page
powerpc/pseries/lparcfg: Use num_possible_cpus() for potential processors
powerpc/pseries/lparcfg: Fix printing of system_active_processors
powerpc/procfs: Propagate error of remap_pfn_range()
powerpc/vdso: Remove offset comment from 32bit vdso_arch_data
x86/vdso: Split virtual clock pages into dedicated mapping
x86/vdso: Delete vvar.h
x86/vdso: Access vdso data without vvar.h
x86/vdso: Move the rng offset to vsyscall.h
x86/vdso: Access rng vdso data without vvar.h
x86/vdso: Access timens vdso data without vvar.h
x86/vdso: Allocate vvar page from C code
x86/vdso: Access rng data from kernel without vvar
x86/vdso: Place vdso_data at beginning of vvar page
x86/vdso: Use __arch_get_vdso_data() to access vdso data
x86/mm/mmap: Remove arch_vma_name()
...
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -12,9 +13,10 @@
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifdef CONFIG_PPC64_PROC_SYSTEMCFG
|
||||
|
||||
static loff_t page_map_seek(struct file *file, loff_t off, int whence)
|
||||
{
|
||||
@@ -33,10 +35,9 @@ static int page_map_mmap( struct file *file, struct vm_area_struct *vma )
|
||||
if ((vma->vm_end - vma->vm_start) > PAGE_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
remap_pfn_range(vma, vma->vm_start,
|
||||
__pa(pde_data(file_inode(file))) >> PAGE_SHIFT,
|
||||
PAGE_SIZE, vma->vm_page_prot);
|
||||
return 0;
|
||||
return remap_pfn_range(vma, vma->vm_start,
|
||||
__pa(pde_data(file_inode(file))) >> PAGE_SHIFT,
|
||||
PAGE_SIZE, vma->vm_page_prot);
|
||||
}
|
||||
|
||||
static const struct proc_ops page_map_proc_ops = {
|
||||
@@ -45,13 +46,35 @@ static const struct proc_ops page_map_proc_ops = {
|
||||
.proc_mmap = page_map_mmap,
|
||||
};
|
||||
|
||||
static union {
|
||||
struct systemcfg data;
|
||||
u8 page[PAGE_SIZE];
|
||||
} systemcfg_data_store __page_aligned_data;
|
||||
struct systemcfg *systemcfg = &systemcfg_data_store.data;
|
||||
|
||||
static int __init proc_ppc64_init(void)
|
||||
{
|
||||
struct proc_dir_entry *pde;
|
||||
|
||||
strcpy((char *)systemcfg->eye_catcher, "SYSTEMCFG:PPC64");
|
||||
systemcfg->version.major = SYSTEMCFG_MAJOR;
|
||||
systemcfg->version.minor = SYSTEMCFG_MINOR;
|
||||
systemcfg->processor = mfspr(SPRN_PVR);
|
||||
/*
|
||||
* Fake the old platform number for pSeries and add
|
||||
* in LPAR bit if necessary
|
||||
*/
|
||||
systemcfg->platform = 0x100;
|
||||
if (firmware_has_feature(FW_FEATURE_LPAR))
|
||||
systemcfg->platform |= 1;
|
||||
systemcfg->physicalMemorySize = memblock_phys_mem_size();
|
||||
systemcfg->dcache_size = ppc64_caches.l1d.size;
|
||||
systemcfg->dcache_line_size = ppc64_caches.l1d.line_size;
|
||||
systemcfg->icache_size = ppc64_caches.l1i.size;
|
||||
systemcfg->icache_line_size = ppc64_caches.l1i.line_size;
|
||||
|
||||
pde = proc_create_data("powerpc/systemcfg", S_IFREG | 0444, NULL,
|
||||
&page_map_proc_ops, vdso_data);
|
||||
&page_map_proc_ops, systemcfg);
|
||||
if (!pde)
|
||||
return 1;
|
||||
proc_set_size(pde, PAGE_SIZE);
|
||||
@@ -60,7 +83,7 @@ static int __init proc_ppc64_init(void)
|
||||
}
|
||||
__initcall(proc_ppc64_init);
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
#endif /* CONFIG_PPC64_PROC_SYSTEMCFG */
|
||||
|
||||
/*
|
||||
* Create the ppc64 and ppc64/rtas directories early. This allows us to
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
#include <asm/cpu_has_feature.h>
|
||||
#include <asm/kasan.h>
|
||||
#include <asm/mce.h>
|
||||
#include <asm/systemcfg.h>
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
@@ -560,7 +561,9 @@ void __init smp_setup_cpu_maps(void)
|
||||
out:
|
||||
of_node_put(dn);
|
||||
}
|
||||
vdso_data->processorCount = num_present_cpus();
|
||||
#endif
|
||||
#ifdef CONFIG_PPC64_PROC_SYSTEMCFG
|
||||
systemcfg->processorCount = num_present_cpus();
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
/* Initialize CPU <=> thread mapping/
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/kup.h>
|
||||
#include <asm/fadump.h>
|
||||
#include <asm/systemcfg.h>
|
||||
|
||||
#include <trace/events/ipi.h>
|
||||
|
||||
@@ -1186,8 +1187,8 @@ int generic_cpu_disable(void)
|
||||
return -EBUSY;
|
||||
|
||||
set_cpu_online(cpu, false);
|
||||
#ifdef CONFIG_PPC64
|
||||
vdso_data->processorCount--;
|
||||
#ifdef CONFIG_PPC64_PROC_SYSTEMCFG
|
||||
systemcfg->processorCount--;
|
||||
#endif
|
||||
/* Update affinity of all IRQs previously aimed at this CPU */
|
||||
irq_migrate_all_off_this_cpu();
|
||||
@@ -1642,10 +1643,12 @@ void start_secondary(void *unused)
|
||||
|
||||
secondary_cpu_time_init();
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifdef CONFIG_PPC64_PROC_SYSTEMCFG
|
||||
if (system_state == SYSTEM_RUNNING)
|
||||
vdso_data->processorCount++;
|
||||
systemcfg->processorCount++;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
vdso_getcpu_init();
|
||||
#endif
|
||||
set_numa_node(numa_cpu_lookup_table[cpu]);
|
||||
|
||||
@@ -71,11 +71,11 @@
|
||||
#include <asm/vdso_datapage.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/mce.h>
|
||||
#include <asm/systemcfg.h>
|
||||
|
||||
/* powerpc clocksource/clockevent code */
|
||||
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/timekeeper_internal.h>
|
||||
|
||||
static u64 timebase_read(struct clocksource *);
|
||||
static struct clocksource clocksource_timebase = {
|
||||
@@ -951,6 +951,9 @@ void __init time_init(void)
|
||||
}
|
||||
|
||||
vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
#ifdef CONFIG_PPC64_PROC_SYSTEMCFG
|
||||
systemcfg->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
#endif
|
||||
|
||||
/* initialise and enable the large decrementer (if we have one) */
|
||||
set_decrementer_max();
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include <linux/user.h>
|
||||
#include <linux/elf.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/time_namespace.h>
|
||||
#include <vdso/datapage.h>
|
||||
@@ -349,25 +348,6 @@ static struct page ** __init vdso_setup_pages(void *start, void *end)
|
||||
static int __init vdso_init(void)
|
||||
{
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* Fill up the "systemcfg" stuff for backward compatibility
|
||||
*/
|
||||
strcpy((char *)vdso_data->eye_catcher, "SYSTEMCFG:PPC64");
|
||||
vdso_data->version.major = SYSTEMCFG_MAJOR;
|
||||
vdso_data->version.minor = SYSTEMCFG_MINOR;
|
||||
vdso_data->processor = mfspr(SPRN_PVR);
|
||||
/*
|
||||
* Fake the old platform number for pSeries and add
|
||||
* in LPAR bit if necessary
|
||||
*/
|
||||
vdso_data->platform = 0x100;
|
||||
if (firmware_has_feature(FW_FEATURE_LPAR))
|
||||
vdso_data->platform |= 1;
|
||||
vdso_data->physicalMemorySize = memblock_phys_mem_size();
|
||||
vdso_data->dcache_size = ppc64_caches.l1d.size;
|
||||
vdso_data->dcache_line_size = ppc64_caches.l1d.line_size;
|
||||
vdso_data->icache_size = ppc64_caches.l1i.size;
|
||||
vdso_data->icache_line_size = ppc64_caches.l1i.line_size;
|
||||
vdso_data->dcache_block_size = ppc64_caches.l1d.block_size;
|
||||
vdso_data->icache_block_size = ppc64_caches.l1i.block_size;
|
||||
vdso_data->dcache_log_block_size = ppc64_caches.l1d.log_block_size;
|
||||
|
||||
Reference in New Issue
Block a user