mirror of
https://github.com/torvalds/linux.git
synced 2025-08-15 14:11:42 +02:00
more s390 updates for 6.17 merge window
- Support MMIO read/write tracing - Enable THP swapping and THP migration - Unmask SLCF bit ("stateless command filtering") introduced with CEX8 cards, so that user space applications like lszcrypt could evaluate and list this feature - Fix the value of high_memory variable, so it considers possible tailing offline memory blocks - Make vmem_pte_alloc() consistent and always allocate memory of PAGE_SIZE for page tables. This ensures a page table occupies the whole page, as the rest of the code assumes - Fix kernel image end address in the decompressor debug output - Fix a typo in debug_sprintf_format_fn() comment -----BEGIN PGP SIGNATURE----- iI0EABYKADUWIQQrtrZiYVkVzKQcYivNdxKlNrRb8AUCaJSgORccYWdvcmRlZXZA bGludXguaWJtLmNvbQAKCRDNdxKlNrRb8OccAQDfJpNc8OWiL2Vo6kaXCo8e/q7X p+k3Je7LQsaJjR2cPgD/Zhg8Uw2Z+HVdSF2uPioe0ftcwDFo8HJ+9hgyN848kQA= =YdPI -----END PGP SIGNATURE----- Merge tag 's390-6.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux Pull more s390 updates from Alexander Gordeev: - Support MMIO read/write tracing - Enable THP swapping and THP migration - Unmask SLCF bit ("stateless command filtering") introduced with CEX8 cards, so that user space applications like lszcrypt could evaluate and list this feature - Fix the value of high_memory variable, so it considers possible tailing offline memory blocks - Make vmem_pte_alloc() consistent and always allocate memory of PAGE_SIZE for page tables. This ensures a page table occupies the whole page, as the rest of the code assumes - Fix kernel image end address in the decompressor debug output - Fix a typo in debug_sprintf_format_fn() comment * tag 's390-6.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/debug: Fix typo in debug_sprintf_format_fn() comment s390/boot: Fix startup debugging log s390/mm: Allocate page table with PAGE_SIZE granularity s390/mm: Enable THP_SWAP and THP_MIGRATION s390: Support CONFIG_TRACE_MMIO_ACCESS s390/mm: Set high_memory at the end of the identity mapping s390/ap: Unmask SLCF bit in card and queue ap functions sysfs
This commit is contained in:
commit
bec077162b
8 changed files with 60 additions and 7 deletions
|
@ -74,6 +74,7 @@ config S390
|
|||
select ARCH_ENABLE_MEMORY_HOTPLUG if SPARSEMEM
|
||||
select ARCH_ENABLE_MEMORY_HOTREMOVE
|
||||
select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2
|
||||
select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT
|
||||
select ARCH_HAS_CURRENT_STACK_POINTER
|
||||
select ARCH_HAS_DEBUG_VIRTUAL
|
||||
|
@ -102,6 +103,7 @@ config S390
|
|||
select ARCH_HAS_UBSAN
|
||||
select ARCH_HAS_VDSO_TIME_DATA
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select ARCH_HAVE_TRACE_MMIO_ACCESS
|
||||
select ARCH_INLINE_READ_LOCK
|
||||
select ARCH_INLINE_READ_LOCK_BH
|
||||
select ARCH_INLINE_READ_LOCK_IRQ
|
||||
|
@ -150,6 +152,7 @@ config S390
|
|||
select ARCH_WANT_KERNEL_PMD_MKWRITE
|
||||
select ARCH_WANT_LD_ORPHAN_WARN
|
||||
select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP
|
||||
select ARCH_WANTS_THP_SWAP
|
||||
select BUILDTIME_TABLE_SORT
|
||||
select CLONE_BACKWARDS2
|
||||
select DCACHE_WORD_ACCESS if !KMSAN
|
||||
|
|
|
@ -384,7 +384,7 @@ static unsigned long setup_kernel_memory_layout(unsigned long kernel_size)
|
|||
kernel_start = round_down(kernel_end - kernel_size, THREAD_SIZE);
|
||||
boot_debug("Randomization range: 0x%016lx-0x%016lx\n", vmax - kaslr_len, vmax);
|
||||
boot_debug("kernel image: 0x%016lx-0x%016lx (kaslr)\n", kernel_start,
|
||||
kernel_size + kernel_size);
|
||||
kernel_start + kernel_size);
|
||||
} else if (vmax < __NO_KASLR_END_KERNEL || vsize > __NO_KASLR_END_KERNEL) {
|
||||
kernel_start = round_down(vmax - kernel_size, THREAD_SIZE);
|
||||
boot_debug("kernel image: 0x%016lx-0x%016lx (constrained)\n", kernel_start,
|
||||
|
|
|
@ -103,7 +103,7 @@ struct ap_tapq_hwinfo {
|
|||
unsigned int accel : 1; /* A */
|
||||
unsigned int ep11 : 1; /* X */
|
||||
unsigned int apxa : 1; /* APXA */
|
||||
unsigned int : 1;
|
||||
unsigned int slcf : 1; /* Cmd filtering avail. */
|
||||
unsigned int class : 8;
|
||||
unsigned int bs : 2; /* SE bind/assoc */
|
||||
unsigned int : 14;
|
||||
|
|
|
@ -963,6 +963,12 @@ static inline pmd_t pmd_clear_soft_dirty(pmd_t pmd)
|
|||
return clear_pmd_bit(pmd, __pgprot(_SEGMENT_ENTRY_SOFT_DIRTY));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
|
||||
#define pmd_swp_soft_dirty(pmd) pmd_soft_dirty(pmd)
|
||||
#define pmd_swp_mksoft_dirty(pmd) pmd_mksoft_dirty(pmd)
|
||||
#define pmd_swp_clear_soft_dirty(pmd) pmd_clear_soft_dirty(pmd)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* query functions pte_write/pte_dirty/pte_young only work if
|
||||
* pte_present() is true. Undefined behaviour if not..
|
||||
|
@ -1979,6 +1985,45 @@ static inline unsigned long __swp_offset_rste(swp_entry_t entry)
|
|||
|
||||
#define __rste_to_swp_entry(rste) ((swp_entry_t) { rste })
|
||||
|
||||
/*
|
||||
* s390 has different layout for PTE and region / segment table entries (RSTE).
|
||||
* This is also true for swap entries, and their swap type and offset encoding.
|
||||
* For hugetlbfs PTE_MARKER support, s390 has internal __swp_type_rste() and
|
||||
* __swp_offset_rste() helpers to correctly handle RSTE swap entries.
|
||||
*
|
||||
* But common swap code does not know about this difference, and only uses
|
||||
* __swp_type(), __swp_offset() and __swp_entry() helpers for conversion between
|
||||
* arch-dependent and arch-independent representation of swp_entry_t for all
|
||||
* pagetable levels. On s390, those helpers only work for PTE swap entries.
|
||||
*
|
||||
* Therefore, implement __pmd_to_swp_entry() to build a fake PTE swap entry
|
||||
* and return the arch-dependent representation of that. Correspondingly,
|
||||
* implement __swp_entry_to_pmd() to convert that into a proper PMD swap
|
||||
* entry again. With this, the arch-dependent swp_entry_t representation will
|
||||
* always look like a PTE swap entry in common code.
|
||||
*
|
||||
* This is somewhat similar to fake PTEs in hugetlbfs code for s390, but only
|
||||
* requires conversion of the swap type and offset, and not all the possible
|
||||
* PTE bits.
|
||||
*/
|
||||
static inline swp_entry_t __pmd_to_swp_entry(pmd_t pmd)
|
||||
{
|
||||
swp_entry_t arch_entry;
|
||||
pte_t pte;
|
||||
|
||||
arch_entry = __rste_to_swp_entry(pmd_val(pmd));
|
||||
pte = mk_swap_pte(__swp_type_rste(arch_entry), __swp_offset_rste(arch_entry));
|
||||
return __pte_to_swp_entry(pte);
|
||||
}
|
||||
|
||||
static inline pmd_t __swp_entry_to_pmd(swp_entry_t arch_entry)
|
||||
{
|
||||
pmd_t pmd;
|
||||
|
||||
pmd = __pmd(mk_swap_rste(__swp_type(arch_entry), __swp_offset(arch_entry)));
|
||||
return pmd;
|
||||
}
|
||||
|
||||
extern int vmem_add_mapping(unsigned long start, unsigned long size);
|
||||
extern void vmem_remove_mapping(unsigned long start, unsigned long size);
|
||||
extern int __vmem_map_4k_page(unsigned long addr, unsigned long phys, pgprot_t prot, bool alloc);
|
||||
|
|
|
@ -1677,7 +1677,7 @@ EXPORT_SYMBOL(debug_dflt_header_fn);
|
|||
|
||||
/*
|
||||
* prints debug data sprintf-formatted:
|
||||
* debug_sprinf_event/exception calls must be used together with this view
|
||||
* debug_sprintf_event/exception calls must be used together with this view
|
||||
*/
|
||||
|
||||
#define DEBUG_SPRINTF_MAX_ARGS 10
|
||||
|
|
|
@ -719,6 +719,11 @@ static void __init memblock_add_physmem_info(void)
|
|||
memblock_set_node(0, ULONG_MAX, &memblock.memory, 0);
|
||||
}
|
||||
|
||||
static void __init setup_high_memory(void)
|
||||
{
|
||||
high_memory = __va(ident_map_size);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reserve memory used for lowcore.
|
||||
*/
|
||||
|
@ -951,6 +956,7 @@ void __init setup_arch(char **cmdline_p)
|
|||
|
||||
free_physmem_info();
|
||||
setup_memory_end();
|
||||
setup_high_memory();
|
||||
memblock_dump_all();
|
||||
setup_memory();
|
||||
|
||||
|
|
|
@ -64,13 +64,12 @@ void *vmem_crst_alloc(unsigned long val)
|
|||
|
||||
pte_t __ref *vmem_pte_alloc(void)
|
||||
{
|
||||
unsigned long size = PTRS_PER_PTE * sizeof(pte_t);
|
||||
pte_t *pte;
|
||||
|
||||
if (slab_is_available())
|
||||
pte = (pte_t *) page_table_alloc(&init_mm);
|
||||
pte = (pte_t *)page_table_alloc(&init_mm);
|
||||
else
|
||||
pte = (pte_t *) memblock_alloc(size, size);
|
||||
pte = (pte_t *)memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
if (!pte)
|
||||
return NULL;
|
||||
memset64((u64 *)pte, _PAGE_INVALID, PTRS_PER_PTE);
|
||||
|
|
|
@ -180,7 +180,7 @@ struct ap_card {
|
|||
atomic64_t total_request_count; /* # requests ever for this AP device.*/
|
||||
};
|
||||
|
||||
#define TAPQ_CARD_HWINFO_MASK 0xFEFF0000FFFF0F0FUL
|
||||
#define TAPQ_CARD_HWINFO_MASK 0xFFFF0000FFFF0F0FUL
|
||||
#define ASSOC_IDX_INVALID 0x10000
|
||||
|
||||
#define to_ap_card(x) container_of((x), struct ap_card, ap_dev.device)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue