Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 72aafdf0 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 updates from Martin Schwidefsky:

 - Add the CPU id for the new z13s machine

 - Add a s390 specific XOR template for RAID-5 checksumming based on the
   XC instruction.  Remove all other alternatives, XC is always faster

 - The merge of our four different stack tracers into a single one

 - Tidy up the code related to page tables, several large inline
   functions are now out-of-line.  Bloat-o-meter reports ~11K text size
   reduction

 - A binary interface for the priviledged CLP instruction to retrieve
   the hardware view of the installed PCI functions

 - Improvements for the dasd format code

 - Bug fixes and cleanups

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (31 commits)
  s390/pci: enforce fmb page boundary rule
  s390: fix floating pointer register corruption (again)
  s390/cpumf: add missing lpp magic initialization
  s390: Fix misspellings in comments
  s390/mm: split arch/s390/mm/pgtable.c
  s390/mm: uninline pmdp_xxx functions from pgtable.h
  s390/mm: uninline ptep_xxx functions from pgtable.h
  s390/pci: add ioctl interface for CLP
  s390: Use pr_warn instead of pr_warning
  s390/dasd: remove casts to dasd_*_private
  s390/dasd: Refactor dasd format functions
  s390/dasd: Simplify code in format logic
  s390/dasd: Improve dasd format code
  s390/percpu: remove this_cpu_cmpxchg_double_4
  s390/cpumf: Improve guest detection heuristics
  s390/fault: merge report_user_fault implementations
  s390/dis: use correct escape sequence for '%' character
  s390/kvm: simplify set_guest_storage_key
  s390/oprofile: add z13/z13s model numbers
  s390: add z13s model number to z13 elf platform
  ...
parents 1c8e85b1 80c544de
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -254,12 +254,12 @@ config MARCH_ZEC12
	  older machines.

config MARCH_Z13
	bool "IBM z13"
	bool "IBM z13s and z13"
	select HAVE_MARCH_Z13_FEATURES
	help
	  Select this to enable optimizations for IBM z13 (2964 series).
	  The kernel will be slightly faster but will not work on older
	  machines.
	  Select this to enable optimizations for IBM z13s and z13 (2965 and
	  2964 series). The kernel will be slightly faster but will not work on
	  older machines.

endchoice

+27 −0
Original line number Diff line number Diff line
@@ -4,14 +4,23 @@
/* CLP common request & response block size */
#define CLP_BLK_SIZE			PAGE_SIZE

#define CLP_LPS_BASE	0
#define CLP_LPS_PCI	2

struct clp_req_hdr {
	u16 len;
	u16 cmd;
	u32 fmt		: 4;
	u32 reserved1	: 28;
	u64 reserved2;
} __packed;

struct clp_rsp_hdr {
	u16 len;
	u16 rsp;
	u32 fmt		: 4;
	u32 reserved1	: 28;
	u64 reserved2;
} __packed;

/* CLP Response Codes */
@@ -25,4 +34,22 @@ struct clp_rsp_hdr {
#define CLP_RC_NODATA			0x0080	/* No data available */
#define CLP_RC_FC_UNKNOWN		0x0100	/* Function code not recognized */

/* Store logical-processor characteristics request */
struct clp_req_slpc {
	struct clp_req_hdr hdr;
} __packed;

struct clp_rsp_slpc {
	struct clp_rsp_hdr hdr;
	u32 reserved2[4];
	u32 lpif[8];
	u32 reserved3[8];
	u32 lpic[8];
} __packed;

struct clp_req_rsp_slpc {
	struct clp_req_slpc request;
	struct clp_rsp_slpc response;
} __packed;

#endif
+64 −0
Original line number Diff line number Diff line
/*
 *  KVM guest address space mapping code
 *
 *    Copyright IBM Corp. 2007, 2016
 *    Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
 */

#ifndef _ASM_S390_GMAP_H
#define _ASM_S390_GMAP_H

/**
 * struct gmap_struct - guest address space
 * @crst_list: list of all crst tables used in the guest address space
 * @mm: pointer to the parent mm_struct
 * @guest_to_host: radix tree with guest to host address translation
 * @host_to_guest: radix tree with pointer to segment table entries
 * @guest_table_lock: spinlock to protect all entries in the guest page table
 * @table: pointer to the page directory
 * @asce: address space control element for gmap page table
 * @pfault_enabled: defines if pfaults are applicable for the guest
 */
struct gmap {
	struct list_head list;
	struct list_head crst_list;
	struct mm_struct *mm;
	struct radix_tree_root guest_to_host;
	struct radix_tree_root host_to_guest;
	spinlock_t guest_table_lock;
	unsigned long *table;
	unsigned long asce;
	unsigned long asce_end;
	void *private;
	bool pfault_enabled;
};

/**
 * struct gmap_notifier - notify function block for page invalidation
 * @notifier_call: address of callback function
 */
struct gmap_notifier {
	struct list_head list;
	void (*notifier_call)(struct gmap *gmap, unsigned long gaddr);
};

struct gmap *gmap_alloc(struct mm_struct *mm, unsigned long limit);
void gmap_free(struct gmap *gmap);
void gmap_enable(struct gmap *gmap);
void gmap_disable(struct gmap *gmap);
int gmap_map_segment(struct gmap *gmap, unsigned long from,
		     unsigned long to, unsigned long len);
int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len);
unsigned long __gmap_translate(struct gmap *, unsigned long gaddr);
unsigned long gmap_translate(struct gmap *, unsigned long gaddr);
int __gmap_link(struct gmap *gmap, unsigned long gaddr, unsigned long vmaddr);
int gmap_fault(struct gmap *, unsigned long gaddr, unsigned int fault_flags);
void gmap_discard(struct gmap *, unsigned long from, unsigned long to);
void __gmap_zap(struct gmap *, unsigned long gaddr);
void gmap_unlink(struct mm_struct *, unsigned long *table, unsigned long vmaddr);

void gmap_register_ipte_notifier(struct gmap_notifier *);
void gmap_unregister_ipte_notifier(struct gmap_notifier *);
int gmap_ipte_notify(struct gmap *, unsigned long start, unsigned long len);

#endif /* _ASM_S390_GMAP_H */
+2 −3
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ struct zpci_fmb {
	u64 rpcit_ops;
	u64 dma_rbytes;
	u64 dma_wbytes;
} __packed __aligned(16);
} __packed __aligned(64);

enum zpci_state {
	ZPCI_FN_STATE_RESERVED,
@@ -66,7 +66,6 @@ struct s390_domain;

/* Private data per function */
struct zpci_dev {
	struct pci_dev	*pdev;
	struct pci_bus	*bus;
	struct list_head entry;		/* list of all zpci_devices, needed for hotplug, etc. */

@@ -192,7 +191,7 @@ int zpci_fmb_disable_device(struct zpci_dev *);
/* Debug */
int zpci_debug_init(void);
void zpci_debug_exit(void);
void zpci_debug_init_device(struct zpci_dev *);
void zpci_debug_init_device(struct zpci_dev *, const char *);
void zpci_debug_exit_device(struct zpci_dev *);
void zpci_debug_info(struct zpci_dev *, struct seq_file *);

+3 −27
Original line number Diff line number Diff line
@@ -49,9 +49,6 @@ struct clp_fh_list_entry {
/* List PCI functions request */
struct clp_req_list_pci {
	struct clp_req_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u64 reserved1;
	u64 resume_token;
	u64 reserved2;
} __packed;
@@ -59,9 +56,6 @@ struct clp_req_list_pci {
/* List PCI functions response */
struct clp_rsp_list_pci {
	struct clp_rsp_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u64 reserved1;
	u64 resume_token;
	u32 reserved2;
	u16 max_fn;
@@ -73,9 +67,6 @@ struct clp_rsp_list_pci {
/* Query PCI function request */
struct clp_req_query_pci {
	struct clp_req_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u64 reserved1;
	u32 fh;				/* function handle */
	u32 reserved2;
	u64 reserved3;
@@ -84,9 +75,6 @@ struct clp_req_query_pci {
/* Query PCI function response */
struct clp_rsp_query_pci {
	struct clp_rsp_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u64			: 64;
	u16 vfn;			/* virtual fn number */
	u16			:  7;
	u16 util_str_avail	:  1;	/* utility string available? */
@@ -108,21 +96,15 @@ struct clp_rsp_query_pci {
/* Query PCI function group request */
struct clp_req_query_pci_grp {
	struct clp_req_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u64 reserved1;
	u32			: 24;
	u32 reserved2		: 24;
	u32 pfgid		:  8;	/* function group id */
	u32 reserved2;
	u64 reserved3;
	u32 reserved3;
	u64 reserved4;
} __packed;

/* Query PCI function group response */
struct clp_rsp_query_pci_grp {
	struct clp_rsp_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u64 reserved1;
	u16			:  4;
	u16 noi			: 12;	/* number of interrupts */
	u8 version;
@@ -141,9 +123,6 @@ struct clp_rsp_query_pci_grp {
/* Set PCI function request */
struct clp_req_set_pci {
	struct clp_req_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u64 reserved1;
	u32 fh;				/* function handle */
	u16 reserved2;
	u8 oc;				/* operation controls */
@@ -154,9 +133,6 @@ struct clp_req_set_pci {
/* Set PCI function response */
struct clp_rsp_set_pci {
	struct clp_rsp_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u64 reserved1;
	u32 fh;				/* function handle */
	u32 reserved3;
	u64 reserved4;
Loading