Commit 5fd09ba6 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-5.2b-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen updates from Juergen Gross:

 - some minor cleanups

 - two small corrections for Xen on ARM

 - two fixes for Xen PVH guest support

 - a patch for a new command line option to tune virtual timer handling

* tag 'for-linus-5.2b-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xen/arm: Use p2m entry with lock protection
  xen/arm: Free p2m entry if fail to add it to RB tree
  xen/pvh: correctly setup the PV EFI interface for dom0
  xen/pvh: set xen_domain_type to HVM in xen_pvh_init
  xenbus: drop useless LIST_HEAD in xenbus_write_watch() and xenbus_file_write()
  xen-netfront: mark expected switch fall-through
  xen: xen-pciback: fix warning Using plain integer as NULL pointer
  x86/xen: Add "xen_timer_slop" command line option
parents 8a635ffb fe846979
...@@ -5260,6 +5260,13 @@ ...@@ -5260,6 +5260,13 @@
with /sys/devices/system/xen_memory/xen_memory0/scrub_pages. with /sys/devices/system/xen_memory/xen_memory0/scrub_pages.
Default value controlled with CONFIG_XEN_SCRUB_PAGES_DEFAULT. Default value controlled with CONFIG_XEN_SCRUB_PAGES_DEFAULT.
xen_timer_slop= [X86-64,XEN]
Set the timer slop (in nanoseconds) for the virtual Xen
timers (default is 100000). This adjusts the minimum
delta of virtualized Xen timers, where lower values
improve timer resolution at the expense of processing
more timer interrupts.
xirc2ps_cs= [NET,PCMCIA] xirc2ps_cs= [NET,PCMCIA]
Format: Format:
<irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]] <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
......
...@@ -70,8 +70,9 @@ unsigned long __pfn_to_mfn(unsigned long pfn) ...@@ -70,8 +70,9 @@ unsigned long __pfn_to_mfn(unsigned long pfn)
entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys);
if (entry->pfn <= pfn && if (entry->pfn <= pfn &&
entry->pfn + entry->nr_pages > pfn) { entry->pfn + entry->nr_pages > pfn) {
unsigned long mfn = entry->mfn + (pfn - entry->pfn);
read_unlock_irqrestore(&p2m_lock, irqflags); read_unlock_irqrestore(&p2m_lock, irqflags);
return entry->mfn + (pfn - entry->pfn); return mfn;
} }
if (pfn < entry->pfn) if (pfn < entry->pfn)
n = n->rb_left; n = n->rb_left;
...@@ -156,6 +157,7 @@ bool __set_phys_to_machine_multi(unsigned long pfn, ...@@ -156,6 +157,7 @@ bool __set_phys_to_machine_multi(unsigned long pfn,
rc = xen_add_phys_to_mach_entry(p2m_entry); rc = xen_add_phys_to_mach_entry(p2m_entry);
if (rc < 0) { if (rc < 0) {
write_unlock_irqrestore(&p2m_lock, irqflags); write_unlock_irqrestore(&p2m_lock, irqflags);
kfree(p2m_entry);
return false; return false;
} }
write_unlock_irqrestore(&p2m_lock, irqflags); write_unlock_irqrestore(&p2m_lock, irqflags);
......
...@@ -44,8 +44,6 @@ void __init __weak mem_map_via_hcall(struct boot_params *ptr __maybe_unused) ...@@ -44,8 +44,6 @@ void __init __weak mem_map_via_hcall(struct boot_params *ptr __maybe_unused)
static void __init init_pvh_bootparams(bool xen_guest) static void __init init_pvh_bootparams(bool xen_guest)
{ {
memset(&pvh_bootparams, 0, sizeof(pvh_bootparams));
if ((pvh_start_info.version > 0) && (pvh_start_info.memmap_entries)) { if ((pvh_start_info.version > 0) && (pvh_start_info.memmap_entries)) {
struct hvm_memmap_table_entry *ep; struct hvm_memmap_table_entry *ep;
int i; int i;
...@@ -103,7 +101,7 @@ static void __init init_pvh_bootparams(bool xen_guest) ...@@ -103,7 +101,7 @@ static void __init init_pvh_bootparams(bool xen_guest)
* If we are trying to boot a Xen PVH guest, it is expected that the kernel * If we are trying to boot a Xen PVH guest, it is expected that the kernel
* will have been configured to provide the required override for this routine. * will have been configured to provide the required override for this routine.
*/ */
void __init __weak xen_pvh_init(void) void __init __weak xen_pvh_init(struct boot_params *boot_params)
{ {
xen_raw_printk("Error: Missing xen PVH initialization\n"); xen_raw_printk("Error: Missing xen PVH initialization\n");
BUG(); BUG();
...@@ -112,7 +110,7 @@ void __init __weak xen_pvh_init(void) ...@@ -112,7 +110,7 @@ void __init __weak xen_pvh_init(void)
static void hypervisor_specific_init(bool xen_guest) static void hypervisor_specific_init(bool xen_guest)
{ {
if (xen_guest) if (xen_guest)
xen_pvh_init(); xen_pvh_init(&pvh_bootparams);
} }
/* /*
...@@ -131,6 +129,8 @@ void __init xen_prepare_pvh(void) ...@@ -131,6 +129,8 @@ void __init xen_prepare_pvh(void)
BUG(); BUG();
} }
memset(&pvh_bootparams, 0, sizeof(pvh_bootparams));
hypervisor_specific_init(xen_guest); hypervisor_specific_init(xen_guest);
init_pvh_bootparams(xen_guest); init_pvh_bootparams(xen_guest);
......
...@@ -158,7 +158,7 @@ static enum efi_secureboot_mode xen_efi_get_secureboot(void) ...@@ -158,7 +158,7 @@ static enum efi_secureboot_mode xen_efi_get_secureboot(void)
return efi_secureboot_mode_unknown; return efi_secureboot_mode_unknown;
} }
void __init xen_efi_init(void) void __init xen_efi_init(struct boot_params *boot_params)
{ {
efi_system_table_t *efi_systab_xen; efi_system_table_t *efi_systab_xen;
...@@ -167,12 +167,12 @@ void __init xen_efi_init(void) ...@@ -167,12 +167,12 @@ void __init xen_efi_init(void)
if (efi_systab_xen == NULL) if (efi_systab_xen == NULL)
return; return;
strncpy((char *)&boot_params.efi_info.efi_loader_signature, "Xen", strncpy((char *)&boot_params->efi_info.efi_loader_signature, "Xen",
sizeof(boot_params.efi_info.efi_loader_signature)); sizeof(boot_params->efi_info.efi_loader_signature));
boot_params.efi_info.efi_systab = (__u32)__pa(efi_systab_xen); boot_params->efi_info.efi_systab = (__u32)__pa(efi_systab_xen);
boot_params.efi_info.efi_systab_hi = (__u32)(__pa(efi_systab_xen) >> 32); boot_params->efi_info.efi_systab_hi = (__u32)(__pa(efi_systab_xen) >> 32);
boot_params.secure_boot = xen_efi_get_secureboot(); boot_params->secure_boot = xen_efi_get_secureboot();
set_bit(EFI_BOOT, &efi.flags); set_bit(EFI_BOOT, &efi.flags);
set_bit(EFI_PARAVIRT, &efi.flags); set_bit(EFI_PARAVIRT, &efi.flags);
......
...@@ -1403,7 +1403,7 @@ asmlinkage __visible void __init xen_start_kernel(void) ...@@ -1403,7 +1403,7 @@ asmlinkage __visible void __init xen_start_kernel(void)
/* We need this for printk timestamps */ /* We need this for printk timestamps */
xen_setup_runstate_info(0); xen_setup_runstate_info(0);
xen_efi_init(); xen_efi_init(&boot_params);
/* Start the world */ /* Start the world */
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <xen/interface/memory.h> #include <xen/interface/memory.h>
#include "xen-ops.h"
/* /*
* PVH variables. * PVH variables.
* *
...@@ -21,17 +23,20 @@ ...@@ -21,17 +23,20 @@
*/ */
bool xen_pvh __attribute__((section(".data"))) = 0; bool xen_pvh __attribute__((section(".data"))) = 0;
void __init xen_pvh_init(void) void __init xen_pvh_init(struct boot_params *boot_params)
{ {
u32 msr; u32 msr;
u64 pfn; u64 pfn;
xen_pvh = 1; xen_pvh = 1;
xen_domain_type = XEN_HVM_DOMAIN;
xen_start_flags = pvh_start_info.flags; xen_start_flags = pvh_start_info.flags;
msr = cpuid_ebx(xen_cpuid_base() + 2); msr = cpuid_ebx(xen_cpuid_base() + 2);
pfn = __pa(hypercall_page); pfn = __pa(hypercall_page);
wrmsr_safe(msr, (u32)pfn, (u32)(pfn >> 32)); wrmsr_safe(msr, (u32)pfn, (u32)(pfn >> 32));
xen_efi_init(boot_params);
} }
void __init mem_map_via_hcall(struct boot_params *boot_params_p) void __init mem_map_via_hcall(struct boot_params *boot_params_p)
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include "xen-ops.h" #include "xen-ops.h"
/* Xen may fire a timer up to this many ns early */ /* Minimum amount of time until next clock event fires */
#define TIMER_SLOP 100000 #define TIMER_SLOP 100000
static u64 xen_sched_clock_offset __read_mostly; static u64 xen_sched_clock_offset __read_mostly;
...@@ -212,7 +212,7 @@ static int xen_timerop_set_next_event(unsigned long delta, ...@@ -212,7 +212,7 @@ static int xen_timerop_set_next_event(unsigned long delta,
return 0; return 0;
} }
static const struct clock_event_device xen_timerop_clockevent = { static struct clock_event_device xen_timerop_clockevent __ro_after_init = {
.name = "xen", .name = "xen",
.features = CLOCK_EVT_FEAT_ONESHOT, .features = CLOCK_EVT_FEAT_ONESHOT,
...@@ -273,7 +273,7 @@ static int xen_vcpuop_set_next_event(unsigned long delta, ...@@ -273,7 +273,7 @@ static int xen_vcpuop_set_next_event(unsigned long delta,
return ret; return ret;
} }
static const struct clock_event_device xen_vcpuop_clockevent = { static struct clock_event_device xen_vcpuop_clockevent __ro_after_init = {
.name = "xen", .name = "xen",
.features = CLOCK_EVT_FEAT_ONESHOT, .features = CLOCK_EVT_FEAT_ONESHOT,
...@@ -570,3 +570,17 @@ void __init xen_hvm_init_time_ops(void) ...@@ -570,3 +570,17 @@ void __init xen_hvm_init_time_ops(void)
x86_platform.set_wallclock = xen_set_wallclock; x86_platform.set_wallclock = xen_set_wallclock;
} }
#endif #endif
/* Kernel parameter to specify Xen timer slop */
static int __init parse_xen_timer_slop(char *ptr)
{
unsigned long slop = memparse(ptr, NULL);
xen_timerop_clockevent.min_delta_ns = slop;
xen_timerop_clockevent.min_delta_ticks = slop;
xen_vcpuop_clockevent.min_delta_ns = slop;
xen_vcpuop_clockevent.min_delta_ticks = slop;
return 0;
}
early_param("xen_timer_slop", parse_xen_timer_slop);
...@@ -122,9 +122,9 @@ static inline void __init xen_init_vga(const struct dom0_vga_console_info *info, ...@@ -122,9 +122,9 @@ static inline void __init xen_init_vga(const struct dom0_vga_console_info *info,
void __init xen_init_apic(void); void __init xen_init_apic(void);
#ifdef CONFIG_XEN_EFI #ifdef CONFIG_XEN_EFI
extern void xen_efi_init(void); extern void xen_efi_init(struct boot_params *boot_params);
#else #else
static inline void __init xen_efi_init(void) static inline void __init xen_efi_init(struct boot_params *boot_params)
{ {
} }
#endif #endif
......
...@@ -697,7 +697,7 @@ static int xen_pcibk_xenbus_probe(struct xenbus_device *dev, ...@@ -697,7 +697,7 @@ static int xen_pcibk_xenbus_probe(struct xenbus_device *dev,
/* We need to force a call to our callback here in case /* We need to force a call to our callback here in case
* xend already configured us! * xend already configured us!
*/ */
xen_pcibk_be_watch(&pdev->be_watch, NULL, 0); xen_pcibk_be_watch(&pdev->be_watch, NULL, NULL);
out: out:
return err; return err;
......
...@@ -465,7 +465,6 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u) ...@@ -465,7 +465,6 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u)
struct watch_adapter *watch; struct watch_adapter *watch;
char *path, *token; char *path, *token;
int err, rc; int err, rc;
LIST_HEAD(staging_q);
path = u->u.buffer + sizeof(u->u.msg); path = u->u.buffer + sizeof(u->u.msg);
token = memchr(path, 0, u->u.msg.len); token = memchr(path, 0, u->u.msg.len);
...@@ -523,7 +522,6 @@ static ssize_t xenbus_file_write(struct file *filp, ...@@ -523,7 +522,6 @@ static ssize_t xenbus_file_write(struct file *filp,
uint32_t msg_type; uint32_t msg_type;
int rc = len; int rc = len;
int ret; int ret;
LIST_HEAD(staging_q);
/* /*
* We're expecting usermode to be writing properly formed * We're expecting usermode to be writing properly formed
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment