mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 10:46:42 +07:00
perf/core fixes and improvements.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJPMEQJAAoJENZQFvNTUqpAPhsP+wRxyE/nsIo1nZGx+sWMJqbm xjgqgPdLUR+Ud8/Du7CKSLl23PNqf+GsMPQqY6n8mezowtwpHPigDQjbYaCgD5Le P6f8JAXnKXGdw9H/aDoIbuSHWb6JS7EhHTntpHIRfuikTsoB+n9CA6UNnv20gJ2o NQQ6xTSxjKZutQQpzDPmz05nmQJ750MnROfSI6/4xCWlXJU29CadOkU0S6EQ83QA iSbOhZ5Am2OxkD/ICxgail/AuEmNe9DElcNHUHle6hgiJSCSOMzb94fYCzSvRXyP QaZGqDlHyV9ZFC3qKkmtCCfqRdezFkMFYE+NTdlRwtEQ7CVxhvJ2/kWw8T66MZOT lO2vj89wQMjaVldxMojLerVKFhn72WA5h8j7UDXCiECusmm4ObERtDGeKDLWngB7 mNqNvqeKs+honVJEqp7vkxb11QQv0J7KPWppUrOuPY9UQlhZRzec0jUdNUN2MBVO GdqguwtD9lXsnbBR+tz6eHJLZAhl6hyAL/+h58cPDPwm6kdMC9ar3RfWvxWAT/8S AHxdkAELWGq1obYvbTLp4kgRNr+hyYgKS+6y3TmrnFvV8zw5lKV8hxj0YYezlTvQ wIa5Vih553hPcMidbiNqeBCieiZTt6aoYzzx3UsTEPEpjXrvsffx7NQj3N/J58En mTOSQpPoP/AfwEvK37qh =Ib1W -----END PGP SIGNATURE----- Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core perf/core fixes and improvements. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
52fce956a7
@ -102,9 +102,12 @@ X!Iinclude/linux/kobject.h
|
||||
!Iinclude/linux/device.h
|
||||
</sect1>
|
||||
<sect1><title>Device Drivers Base</title>
|
||||
!Idrivers/base/init.c
|
||||
!Edrivers/base/driver.c
|
||||
!Edrivers/base/core.c
|
||||
!Edrivers/base/syscore.c
|
||||
!Edrivers/base/class.c
|
||||
!Idrivers/base/node.c
|
||||
!Edrivers/base/firmware_class.c
|
||||
!Edrivers/base/transport_class.c
|
||||
<!-- Cannot be included, because
|
||||
@ -113,13 +116,18 @@ X!Iinclude/linux/kobject.h
|
||||
exceed allowed 44 characters maximum
|
||||
X!Edrivers/base/attribute_container.c
|
||||
-->
|
||||
!Edrivers/base/sys.c
|
||||
!Edrivers/base/dd.c
|
||||
<!--
|
||||
X!Edrivers/base/interface.c
|
||||
-->
|
||||
!Iinclude/linux/platform_device.h
|
||||
!Edrivers/base/platform.c
|
||||
!Edrivers/base/bus.c
|
||||
</sect1>
|
||||
<sect1><title>Device Drivers DMA Management</title>
|
||||
!Edrivers/base/dma-buf.c
|
||||
!Edrivers/base/dma-coherent.c
|
||||
!Edrivers/base/dma-mapping.c
|
||||
</sect1>
|
||||
<sect1><title>Device Drivers Power Management</title>
|
||||
!Edrivers/base/power/main.c
|
||||
@ -219,7 +227,7 @@ X!Isound/sound_firmware.c
|
||||
<chapter id="uart16x50">
|
||||
<title>16x50 UART Driver</title>
|
||||
!Edrivers/tty/serial/serial_core.c
|
||||
!Edrivers/tty/serial/8250.c
|
||||
!Edrivers/tty/serial/8250/8250.c
|
||||
</chapter>
|
||||
|
||||
<chapter id="fbdev">
|
||||
|
29
MAINTAINERS
29
MAINTAINERS
@ -159,7 +159,7 @@ S: Maintained
|
||||
F: drivers/net/ethernet/realtek/r8169.c
|
||||
|
||||
8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-serial@vger.kernel.org
|
||||
W: http://serial.sourceforge.net
|
||||
S: Maintained
|
||||
@ -1783,9 +1783,9 @@ X: net/wireless/wext*
|
||||
|
||||
CHAR and MISC DRIVERS
|
||||
M: Arnd Bergmann <arnd@arndb.de>
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
||||
S: Maintained
|
||||
S: Supported
|
||||
F: drivers/char/*
|
||||
F: drivers/misc/*
|
||||
|
||||
@ -2320,7 +2320,7 @@ F: lib/lru_cache.c
|
||||
F: Documentation/blockdev/drbd/
|
||||
|
||||
DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git
|
||||
S: Supported
|
||||
F: Documentation/kobject.txt
|
||||
@ -6276,15 +6276,15 @@ S: Maintained
|
||||
F: arch/alpha/kernel/srm_env.c
|
||||
|
||||
STABLE BRANCH
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: stable@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Supported
|
||||
|
||||
STAGING SUBSYSTEM
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
|
||||
L: devel@driverdev.osuosl.org
|
||||
S: Maintained
|
||||
S: Supported
|
||||
F: drivers/staging/
|
||||
|
||||
STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS
|
||||
@ -6669,8 +6669,8 @@ S: Maintained
|
||||
K: ^Subject:.*(?i)trivial
|
||||
|
||||
TTY LAYER
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
S: Maintained
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git
|
||||
F: drivers/tty/
|
||||
F: drivers/tty/serial/serial_core.c
|
||||
@ -6958,7 +6958,7 @@ S: Maintained
|
||||
F: drivers/usb/serial/digi_acceleport.c
|
||||
|
||||
USB SERIAL DRIVER
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/usb/usb-serial.txt
|
||||
@ -6973,9 +6973,8 @@ S: Maintained
|
||||
F: drivers/usb/serial/empeg.c
|
||||
|
||||
USB SERIAL KEYSPAN DRIVER
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
W: http://www.kroah.com/linux/
|
||||
S: Maintained
|
||||
F: drivers/usb/serial/*keyspan*
|
||||
|
||||
@ -7003,7 +7002,7 @@ F: Documentation/video4linux/sn9c102.txt
|
||||
F: drivers/media/video/sn9c102/
|
||||
|
||||
USB SUBSYSTEM
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
W: http://www.linux-usb.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git
|
||||
@ -7090,7 +7089,7 @@ F: fs/hppfs/
|
||||
|
||||
USERSPACE I/O (UIO)
|
||||
M: "Hans J. Koch" <hjk@hansjkoch.de>
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
S: Maintained
|
||||
F: Documentation/DocBook/uio-howto.tmpl
|
||||
F: drivers/uio/
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include <linux/cache.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/entry.h>
|
||||
#include <asm/cpuinfo.h>
|
||||
@ -227,23 +226,5 @@ static int __init setup_bus_notifier(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(setup_bus_notifier);
|
||||
|
||||
static DEFINE_PER_CPU(struct cpu, cpu_devices);
|
||||
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
for_each_present_cpu(i) {
|
||||
struct cpu *c = &per_cpu(cpu_devices, i);
|
||||
|
||||
ret = register_cpu(c, i);
|
||||
if (ret)
|
||||
printk(KERN_WARNING "topology_init: register_cpu %d "
|
||||
"failed (%d)\n", i, ret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(topology_init);
|
||||
|
@ -33,6 +33,7 @@ config SPARC
|
||||
config SPARC32
|
||||
def_bool !64BIT
|
||||
select GENERIC_ATOMIC64
|
||||
select CLZ_TAB
|
||||
|
||||
config SPARC64
|
||||
def_bool 64BIT
|
||||
|
@ -17,23 +17,9 @@ along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
.data
|
||||
.align 8
|
||||
.globl __clz_tab
|
||||
__clz_tab:
|
||||
.byte 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
|
||||
.byte 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
|
||||
.byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
||||
.byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
||||
.byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
.byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
.byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
.byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
.size __clz_tab,256
|
||||
.global .udiv
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.global .udiv
|
||||
.globl __divdi3
|
||||
__divdi3:
|
||||
save %sp,-104,%sp
|
||||
|
@ -145,13 +145,13 @@ extern void __add_wrong_size(void)
|
||||
|
||||
#ifdef __HAVE_ARCH_CMPXCHG
|
||||
#define cmpxchg(ptr, old, new) \
|
||||
__cmpxchg((ptr), (old), (new), sizeof(*ptr))
|
||||
__cmpxchg(ptr, old, new, sizeof(*(ptr)))
|
||||
|
||||
#define sync_cmpxchg(ptr, old, new) \
|
||||
__sync_cmpxchg((ptr), (old), (new), sizeof(*ptr))
|
||||
__sync_cmpxchg(ptr, old, new, sizeof(*(ptr)))
|
||||
|
||||
#define cmpxchg_local(ptr, old, new) \
|
||||
__cmpxchg_local((ptr), (old), (new), sizeof(*ptr))
|
||||
__cmpxchg_local(ptr, old, new, sizeof(*(ptr)))
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -988,9 +988,6 @@ static void x86_pmu_start(struct perf_event *event, int flags)
|
||||
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
|
||||
int idx = event->hw.idx;
|
||||
|
||||
if (WARN_ON_ONCE(!(event->hw.state & PERF_HES_STOPPED)))
|
||||
return;
|
||||
|
||||
if (WARN_ON_ONCE(idx == -1))
|
||||
return;
|
||||
|
||||
|
@ -439,7 +439,6 @@ void intel_pmu_pebs_enable(struct perf_event *event)
|
||||
hwc->config &= ~ARCH_PERFMON_EVENTSEL_INT;
|
||||
|
||||
cpuc->pebs_enabled |= 1ULL << hwc->idx;
|
||||
WARN_ON_ONCE(cpuc->enabled);
|
||||
|
||||
if (x86_pmu.intel_cap.pebs_trap && event->attr.precise_ip > 1)
|
||||
intel_pmu_lbr_enable(event);
|
||||
|
@ -72,8 +72,6 @@ void intel_pmu_lbr_enable(struct perf_event *event)
|
||||
if (!x86_pmu.lbr_nr)
|
||||
return;
|
||||
|
||||
WARN_ON_ONCE(cpuc->enabled);
|
||||
|
||||
/*
|
||||
* Reset the LBR stack if we changed task context to
|
||||
* avoid data leaks.
|
||||
|
@ -252,7 +252,8 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
|
||||
unsigned short ss;
|
||||
unsigned long sp;
|
||||
#endif
|
||||
printk(KERN_EMERG "%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter);
|
||||
printk(KERN_DEFAULT
|
||||
"%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter);
|
||||
#ifdef CONFIG_PREEMPT
|
||||
printk("PREEMPT ");
|
||||
#endif
|
||||
|
@ -269,11 +269,11 @@ void show_registers(struct pt_regs *regs)
|
||||
unsigned char c;
|
||||
u8 *ip;
|
||||
|
||||
printk(KERN_EMERG "Stack:\n");
|
||||
printk(KERN_DEFAULT "Stack:\n");
|
||||
show_stack_log_lvl(NULL, regs, (unsigned long *)sp,
|
||||
0, KERN_EMERG);
|
||||
0, KERN_DEFAULT);
|
||||
|
||||
printk(KERN_EMERG "Code: ");
|
||||
printk(KERN_DEFAULT "Code: ");
|
||||
|
||||
ip = (u8 *)regs->ip - code_prologue;
|
||||
if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {
|
||||
|
@ -39,6 +39,14 @@ static int reboot_mode;
|
||||
enum reboot_type reboot_type = BOOT_ACPI;
|
||||
int reboot_force;
|
||||
|
||||
/* This variable is used privately to keep track of whether or not
|
||||
* reboot_type is still set to its default value (i.e., reboot= hasn't
|
||||
* been set on the command line). This is needed so that we can
|
||||
* suppress DMI scanning for reboot quirks. Without it, it's
|
||||
* impossible to override a faulty reboot quirk without recompiling.
|
||||
*/
|
||||
static int reboot_default = 1;
|
||||
|
||||
#if defined(CONFIG_X86_32) && defined(CONFIG_SMP)
|
||||
static int reboot_cpu = -1;
|
||||
#endif
|
||||
@ -67,6 +75,12 @@ bool port_cf9_safe = false;
|
||||
static int __init reboot_setup(char *str)
|
||||
{
|
||||
for (;;) {
|
||||
/* Having anything passed on the command line via
|
||||
* reboot= will cause us to disable DMI checking
|
||||
* below.
|
||||
*/
|
||||
reboot_default = 0;
|
||||
|
||||
switch (*str) {
|
||||
case 'w':
|
||||
reboot_mode = 0x1234;
|
||||
@ -295,14 +309,6 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "P4S800"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on VersaLogic Menlow boards */
|
||||
.callback = set_bios_reboot,
|
||||
.ident = "VersaLogic Menlow based board",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "VersaLogic Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"),
|
||||
},
|
||||
},
|
||||
{ /* Handle reboot issue on Acer Aspire one */
|
||||
.callback = set_kbd_reboot,
|
||||
.ident = "Acer Aspire One A110",
|
||||
@ -316,7 +322,12 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||
|
||||
static int __init reboot_init(void)
|
||||
{
|
||||
dmi_check_system(reboot_dmi_table);
|
||||
/* Only do the DMI check if reboot_type hasn't been overridden
|
||||
* on the command line
|
||||
*/
|
||||
if (reboot_default) {
|
||||
dmi_check_system(reboot_dmi_table);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
core_initcall(reboot_init);
|
||||
@ -465,7 +476,12 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
|
||||
|
||||
static int __init pci_reboot_init(void)
|
||||
{
|
||||
dmi_check_system(pci_reboot_dmi_table);
|
||||
/* Only do the DMI check if reboot_type hasn't been overridden
|
||||
* on the command line
|
||||
*/
|
||||
if (reboot_default) {
|
||||
dmi_check_system(pci_reboot_dmi_table);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
core_initcall(pci_reboot_init);
|
||||
|
@ -673,7 +673,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
|
||||
|
||||
stackend = end_of_stack(tsk);
|
||||
if (tsk != &init_task && *stackend != STACK_END_MAGIC)
|
||||
printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
|
||||
printk(KERN_EMERG "Thread overran stack, or stack corrupted\n");
|
||||
|
||||
tsk->thread.cr2 = address;
|
||||
tsk->thread.trap_no = 14;
|
||||
@ -684,7 +684,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
|
||||
sig = 0;
|
||||
|
||||
/* Executive summary in case the body of the oops scrolled away */
|
||||
printk(KERN_EMERG "CR2: %016lx\n", address);
|
||||
printk(KERN_DEFAULT "CR2: %016lx\n", address);
|
||||
|
||||
oops_end(flags, regs, sig);
|
||||
}
|
||||
|
@ -380,6 +380,7 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
|
||||
rbdc = __rbd_client_find(opt);
|
||||
if (rbdc) {
|
||||
ceph_destroy_options(opt);
|
||||
kfree(rbd_opts);
|
||||
|
||||
/* using an existing client */
|
||||
kref_get(&rbdc->kref);
|
||||
@ -406,15 +407,15 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
|
||||
|
||||
/*
|
||||
* Destroy ceph client
|
||||
*
|
||||
* Caller must hold node_lock.
|
||||
*/
|
||||
static void rbd_client_release(struct kref *kref)
|
||||
{
|
||||
struct rbd_client *rbdc = container_of(kref, struct rbd_client, kref);
|
||||
|
||||
dout("rbd_release_client %p\n", rbdc);
|
||||
spin_lock(&node_lock);
|
||||
list_del(&rbdc->node);
|
||||
spin_unlock(&node_lock);
|
||||
|
||||
ceph_destroy_client(rbdc->client);
|
||||
kfree(rbdc->rbd_opts);
|
||||
@ -427,7 +428,9 @@ static void rbd_client_release(struct kref *kref)
|
||||
*/
|
||||
static void rbd_put_client(struct rbd_device *rbd_dev)
|
||||
{
|
||||
spin_lock(&node_lock);
|
||||
kref_put(&rbd_dev->rbd_client->kref, rbd_client_release);
|
||||
spin_unlock(&node_lock);
|
||||
rbd_dev->rbd_client = NULL;
|
||||
rbd_dev->client = NULL;
|
||||
}
|
||||
|
@ -263,6 +263,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card)
|
||||
static char ohci_driver_name[] = KBUILD_MODNAME;
|
||||
|
||||
#define PCI_DEVICE_ID_AGERE_FW643 0x5901
|
||||
#define PCI_DEVICE_ID_CREATIVE_SB1394 0x4001
|
||||
#define PCI_DEVICE_ID_JMICRON_JMB38X_FW 0x2380
|
||||
#define PCI_DEVICE_ID_TI_TSB12LV22 0x8009
|
||||
#define PCI_DEVICE_ID_TI_TSB12LV26 0x8020
|
||||
@ -289,6 +290,9 @@ static const struct {
|
||||
{PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6,
|
||||
QUIRK_NO_MSI},
|
||||
|
||||
{PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_SB1394, PCI_ANY_ID,
|
||||
QUIRK_RESET_PACKET},
|
||||
|
||||
{PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_FW, PCI_ANY_ID,
|
||||
QUIRK_NO_MSI},
|
||||
|
||||
@ -299,7 +303,7 @@ static const struct {
|
||||
QUIRK_NO_MSI},
|
||||
|
||||
{PCI_VENDOR_ID_RICOH, PCI_ANY_ID, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER},
|
||||
QUIRK_CYCLE_TIMER | QUIRK_NO_MSI},
|
||||
|
||||
{PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB12LV22, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER | QUIRK_RESET_PACKET | QUIRK_NO_1394A},
|
||||
|
@ -54,9 +54,10 @@ struct bit_entry {
|
||||
int bit_table(struct drm_device *, u8 id, struct bit_entry *);
|
||||
|
||||
enum dcb_gpio_tag {
|
||||
DCB_GPIO_TVDAC0 = 0xc,
|
||||
DCB_GPIO_PANEL_POWER = 0x01,
|
||||
DCB_GPIO_TVDAC0 = 0x0c,
|
||||
DCB_GPIO_TVDAC1 = 0x2d,
|
||||
DCB_GPIO_PWM_FAN = 0x9,
|
||||
DCB_GPIO_PWM_FAN = 0x09,
|
||||
DCB_GPIO_FAN_SENSE = 0x3d,
|
||||
DCB_GPIO_UNUSED = 0xff
|
||||
};
|
||||
|
@ -219,6 +219,16 @@ nouveau_display_init(struct drm_device *dev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* power on internal panel if it's not already. the init tables of
|
||||
* some vbios default this to off for some reason, causing the
|
||||
* panel to not work after resume
|
||||
*/
|
||||
if (nouveau_gpio_func_get(dev, DCB_GPIO_PANEL_POWER) == 0) {
|
||||
nouveau_gpio_func_set(dev, DCB_GPIO_PANEL_POWER, true);
|
||||
msleep(300);
|
||||
}
|
||||
|
||||
/* enable polling for external displays */
|
||||
drm_kms_helper_poll_enable(dev);
|
||||
|
||||
/* enable hotplug interrupts */
|
||||
|
@ -124,7 +124,7 @@ MODULE_PARM_DESC(ctxfw, "Use external HUB/GPC ucode (fermi)\n");
|
||||
int nouveau_ctxfw;
|
||||
module_param_named(ctxfw, nouveau_ctxfw, int, 0400);
|
||||
|
||||
MODULE_PARM_DESC(ctxfw, "Santise DCB table according to MXM-SIS\n");
|
||||
MODULE_PARM_DESC(mxmdcb, "Santise DCB table according to MXM-SIS\n");
|
||||
int nouveau_mxmdcb = 1;
|
||||
module_param_named(mxmdcb, nouveau_mxmdcb, int, 0400);
|
||||
|
||||
|
@ -379,6 +379,25 @@ validate_init(struct nouveau_channel *chan, struct drm_file *file_priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
validate_sync(struct nouveau_channel *chan, struct nouveau_bo *nvbo)
|
||||
{
|
||||
struct nouveau_fence *fence = NULL;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock(&nvbo->bo.bdev->fence_lock);
|
||||
if (nvbo->bo.sync_obj)
|
||||
fence = nouveau_fence_ref(nvbo->bo.sync_obj);
|
||||
spin_unlock(&nvbo->bo.bdev->fence_lock);
|
||||
|
||||
if (fence) {
|
||||
ret = nouveau_fence_sync(fence, chan);
|
||||
nouveau_fence_unref(&fence);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||
struct drm_nouveau_gem_pushbuf_bo *pbbo, uint64_t user_pbbo_ptr)
|
||||
@ -393,7 +412,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||
list_for_each_entry(nvbo, list, entry) {
|
||||
struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index];
|
||||
|
||||
ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan);
|
||||
ret = validate_sync(chan, nvbo);
|
||||
if (unlikely(ret)) {
|
||||
NV_ERROR(dev, "fail pre-validate sync\n");
|
||||
return ret;
|
||||
@ -416,7 +435,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan);
|
||||
ret = validate_sync(chan, nvbo);
|
||||
if (unlikely(ret)) {
|
||||
NV_ERROR(dev, "fail post-validate sync\n");
|
||||
return ret;
|
||||
|
@ -656,7 +656,16 @@ nouveau_mxm_init(struct drm_device *dev)
|
||||
|
||||
if (mxm_shadow(dev, mxm[0])) {
|
||||
MXM_MSG(dev, "failed to locate valid SIS\n");
|
||||
#if 0
|
||||
/* we should, perhaps, fall back to some kind of limited
|
||||
* mode here if the x86 vbios hasn't already done the
|
||||
* work for us (so we prevent loading with completely
|
||||
* whacked vbios tables).
|
||||
*/
|
||||
return -EINVAL;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
MXM_MSG(dev, "MXMS Version %d.%d\n",
|
||||
|
@ -495,9 +495,9 @@ nv50_pm_clocks_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl)
|
||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
struct nv50_pm_state *info;
|
||||
struct pll_lims pll;
|
||||
int ret = -EINVAL;
|
||||
int clk, ret = -EINVAL;
|
||||
int N, M, P1, P2;
|
||||
u32 clk, out;
|
||||
u32 out;
|
||||
|
||||
if (dev_priv->chipset == 0xaa ||
|
||||
dev_priv->chipset == 0xac)
|
||||
|
@ -1184,7 +1184,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
|
||||
|
||||
WREG32(EVERGREEN_DESKTOP_HEIGHT + radeon_crtc->crtc_offset,
|
||||
crtc->mode.vdisplay);
|
||||
target_fb->height);
|
||||
x &= ~3;
|
||||
y &= ~1;
|
||||
WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset,
|
||||
@ -1353,7 +1353,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
|
||||
|
||||
WREG32(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset,
|
||||
crtc->mode.vdisplay);
|
||||
target_fb->height);
|
||||
x &= ~3;
|
||||
y &= ~1;
|
||||
WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset,
|
||||
|
@ -564,9 +564,21 @@ int radeon_dp_get_panel_mode(struct drm_encoder *encoder,
|
||||
ENCODER_OBJECT_ID_NUTMEG)
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
|
||||
else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) ==
|
||||
ENCODER_OBJECT_ID_TRAVIS)
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
||||
else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
|
||||
ENCODER_OBJECT_ID_TRAVIS) {
|
||||
u8 id[6];
|
||||
int i;
|
||||
for (i = 0; i < 6; i++)
|
||||
id[i] = radeon_read_dpcd_reg(radeon_connector, 0x503 + i);
|
||||
if (id[0] == 0x73 &&
|
||||
id[1] == 0x69 &&
|
||||
id[2] == 0x76 &&
|
||||
id[3] == 0x61 &&
|
||||
id[4] == 0x72 &&
|
||||
id[5] == 0x54)
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
|
||||
else
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
||||
} else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
|
||||
u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP);
|
||||
if (tmp & 1)
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
||||
|
@ -468,27 +468,42 @@ set_default_state(struct radeon_device *rdev)
|
||||
radeon_ring_write(ring, sq_stack_resource_mgmt_2);
|
||||
}
|
||||
|
||||
#define I2F_MAX_BITS 15
|
||||
#define I2F_MAX_INPUT ((1 << I2F_MAX_BITS) - 1)
|
||||
#define I2F_SHIFT (24 - I2F_MAX_BITS)
|
||||
|
||||
/*
|
||||
* Converts unsigned integer into 32-bit IEEE floating point representation.
|
||||
* Conversion is not universal and only works for the range from 0
|
||||
* to 2^I2F_MAX_BITS-1. Currently we only use it with inputs between
|
||||
* 0 and 16384 (inclusive), so I2F_MAX_BITS=15 is enough. If necessary,
|
||||
* I2F_MAX_BITS can be increased, but that will add to the loop iterations
|
||||
* and slow us down. Conversion is done by shifting the input and counting
|
||||
* down until the first 1 reaches bit position 23. The resulting counter
|
||||
* and the shifted input are, respectively, the exponent and the fraction.
|
||||
* The sign is always zero.
|
||||
*/
|
||||
static uint32_t i2f(uint32_t input)
|
||||
{
|
||||
u32 result, i, exponent, fraction;
|
||||
|
||||
if ((input & 0x3fff) == 0)
|
||||
result = 0; /* 0 is a special case */
|
||||
WARN_ON_ONCE(input > I2F_MAX_INPUT);
|
||||
|
||||
if ((input & I2F_MAX_INPUT) == 0)
|
||||
result = 0;
|
||||
else {
|
||||
exponent = 140; /* exponent biased by 127; */
|
||||
fraction = (input & 0x3fff) << 10; /* cheat and only
|
||||
handle numbers below 2^^15 */
|
||||
for (i = 0; i < 14; i++) {
|
||||
exponent = 126 + I2F_MAX_BITS;
|
||||
fraction = (input & I2F_MAX_INPUT) << I2F_SHIFT;
|
||||
|
||||
for (i = 0; i < I2F_MAX_BITS; i++) {
|
||||
if (fraction & 0x800000)
|
||||
break;
|
||||
else {
|
||||
fraction = fraction << 1; /* keep
|
||||
shifting left until top bit = 1 */
|
||||
fraction = fraction << 1;
|
||||
exponent = exponent - 1;
|
||||
}
|
||||
}
|
||||
result = exponent << 23 | (fraction & 0x7fffff); /* mask
|
||||
off top bit; assumed 1 */
|
||||
result = exponent << 23 | (fraction & 0x7fffff);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -59,8 +59,9 @@ static int radeon_atrm_call(acpi_handle atrm_handle, uint8_t *bios,
|
||||
|
||||
obj = (union acpi_object *)buffer.pointer;
|
||||
memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length);
|
||||
len = obj->buffer.length;
|
||||
kfree(buffer.pointer);
|
||||
return obj->buffer.length;
|
||||
return len;
|
||||
}
|
||||
|
||||
bool radeon_atrm_supported(struct pci_dev *pdev)
|
||||
|
@ -883,6 +883,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
|
||||
if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
|
||||
return 0;
|
||||
|
||||
drm_kms_helper_poll_disable(dev);
|
||||
|
||||
/* turn off display hw */
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
|
||||
@ -972,6 +974,8 @@ int radeon_resume_kms(struct drm_device *dev)
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
|
||||
}
|
||||
|
||||
drm_kms_helper_poll_enable(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -958,6 +958,7 @@ struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev,
|
||||
i2c->rec = *rec;
|
||||
i2c->adapter.owner = THIS_MODULE;
|
||||
i2c->adapter.class = I2C_CLASS_DDC;
|
||||
i2c->adapter.dev.parent = &dev->pdev->dev;
|
||||
i2c->dev = dev;
|
||||
snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
|
||||
"Radeon aux bus %s", name);
|
||||
|
@ -808,9 +808,12 @@ static ssize_t ucma_accept(struct ucma_file *file, const char __user *inbuf,
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
if (cmd.conn_param.valid) {
|
||||
ctx->uid = cmd.uid;
|
||||
ucma_copy_conn_param(&conn_param, &cmd.conn_param);
|
||||
mutex_lock(&file->mut);
|
||||
ret = rdma_accept(ctx->cm_id, &conn_param);
|
||||
if (!ret)
|
||||
ctx->uid = cmd.uid;
|
||||
mutex_unlock(&file->mut);
|
||||
} else
|
||||
ret = rdma_accept(ctx->cm_id, NULL);
|
||||
|
||||
|
@ -1485,6 +1485,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
|
||||
qp->event_handler = attr.event_handler;
|
||||
qp->qp_context = attr.qp_context;
|
||||
qp->qp_type = attr.qp_type;
|
||||
atomic_set(&qp->usecnt, 0);
|
||||
atomic_inc(&pd->usecnt);
|
||||
atomic_inc(&attr.send_cq->usecnt);
|
||||
if (attr.recv_cq)
|
||||
|
@ -421,6 +421,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
|
||||
qp->uobject = NULL;
|
||||
qp->qp_type = qp_init_attr->qp_type;
|
||||
|
||||
atomic_set(&qp->usecnt, 0);
|
||||
if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
|
||||
qp->event_handler = __ib_shared_qp_event_handler;
|
||||
qp->qp_context = qp;
|
||||
@ -430,7 +431,6 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
|
||||
qp->xrcd = qp_init_attr->xrcd;
|
||||
atomic_inc(&qp_init_attr->xrcd->usecnt);
|
||||
INIT_LIST_HEAD(&qp->open_list);
|
||||
atomic_set(&qp->usecnt, 0);
|
||||
|
||||
real_qp = qp;
|
||||
qp = __ib_open_qp(real_qp, qp_init_attr->event_handler,
|
||||
|
@ -89,7 +89,7 @@ static int create_file(const char *name, umode_t mode,
|
||||
error = ipathfs_mknod(parent->d_inode, *dentry,
|
||||
mode, fops, data);
|
||||
else
|
||||
error = PTR_ERR(dentry);
|
||||
error = PTR_ERR(*dentry);
|
||||
mutex_unlock(&parent->d_inode->i_mutex);
|
||||
|
||||
return error;
|
||||
|
@ -257,12 +257,9 @@ static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
|
||||
return IB_MAD_RESULT_SUCCESS;
|
||||
|
||||
/*
|
||||
* Don't process SMInfo queries or vendor-specific
|
||||
* MADs -- the SMA can't handle them.
|
||||
* Don't process SMInfo queries -- the SMA can't handle them.
|
||||
*/
|
||||
if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO ||
|
||||
((in_mad->mad_hdr.attr_id & IB_SMP_ATTR_VENDOR_MASK) ==
|
||||
IB_SMP_ATTR_VENDOR_MASK))
|
||||
if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO)
|
||||
return IB_MAD_RESULT_SUCCESS;
|
||||
} else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT ||
|
||||
in_mad->mad_hdr.mgmt_class == MLX4_IB_VENDOR_CLASS1 ||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@ -233,6 +233,7 @@ static int send_mpa_reject(struct nes_cm_node *cm_node)
|
||||
u8 *start_ptr = &start_addr;
|
||||
u8 **start_buff = &start_ptr;
|
||||
u16 buff_len = 0;
|
||||
struct ietf_mpa_v1 *mpa_frame;
|
||||
|
||||
skb = dev_alloc_skb(MAX_CM_BUFFER);
|
||||
if (!skb) {
|
||||
@ -242,6 +243,8 @@ static int send_mpa_reject(struct nes_cm_node *cm_node)
|
||||
|
||||
/* send an MPA reject frame */
|
||||
cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REPLY);
|
||||
mpa_frame = (struct ietf_mpa_v1 *)*start_buff;
|
||||
mpa_frame->flags |= IETF_MPA_FLAGS_REJECT;
|
||||
form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK | SET_FIN);
|
||||
|
||||
cm_node->state = NES_CM_STATE_FIN_WAIT1;
|
||||
@ -1360,8 +1363,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
|
||||
if (!memcmp(nesadapter->arp_table[arpindex].mac_addr,
|
||||
neigh->ha, ETH_ALEN)) {
|
||||
/* Mac address same as in nes_arp_table */
|
||||
ip_rt_put(rt);
|
||||
return rc;
|
||||
goto out;
|
||||
}
|
||||
|
||||
nes_manage_arp_cache(nesvnic->netdev,
|
||||
@ -1377,6 +1379,8 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
|
||||
neigh_event_send(neigh, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
ip_rt_put(rt);
|
||||
return rc;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel-NE, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel-NE, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Topspin Communications. All rights reserved.
|
||||
* Copyright (c) 2005 Cisco Systems. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@ -3427,6 +3427,8 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
|
||||
set_wqe_32bit_value(wqe->wqe_words,
|
||||
NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX,
|
||||
ib_wr->wr.fast_reg.length);
|
||||
set_wqe_32bit_value(wqe->wqe_words,
|
||||
NES_IWARP_SQ_FMR_WQE_LENGTH_HIGH_IDX, 0);
|
||||
set_wqe_32bit_value(wqe->wqe_words,
|
||||
NES_IWARP_SQ_FMR_WQE_MR_STAG_IDX,
|
||||
ib_wr->wr.fast_reg.rkey);
|
||||
@ -3724,7 +3726,7 @@ static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
|
||||
entry->opcode = IB_WC_SEND;
|
||||
break;
|
||||
case NES_IWARP_SQ_OP_LOCINV:
|
||||
entry->opcode = IB_WR_LOCAL_INV;
|
||||
entry->opcode = IB_WC_LOCAL_INV;
|
||||
break;
|
||||
case NES_IWARP_SQ_OP_FAST_REG:
|
||||
entry->opcode = IB_WC_FAST_REG_MR;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
|
@ -2105,7 +2105,7 @@ static void alloc_dummy_hdrq(struct qib_devdata *dd)
|
||||
dd->cspec->dummy_hdrq = dma_alloc_coherent(&dd->pcidev->dev,
|
||||
dd->rcd[0]->rcvhdrq_size,
|
||||
&dd->cspec->dummy_hdrq_phys,
|
||||
GFP_KERNEL | __GFP_COMP);
|
||||
GFP_ATOMIC | __GFP_COMP);
|
||||
if (!dd->cspec->dummy_hdrq) {
|
||||
qib_devinfo(dd->pcidev, "Couldn't allocate dummy hdrq\n");
|
||||
/* fallback to just 0'ing */
|
||||
|
@ -560,7 +560,7 @@ static int qib_tune_pcie_coalesce(struct qib_devdata *dd)
|
||||
* BIOS may not set PCIe bus-utilization parameters for best performance.
|
||||
* Check and optionally adjust them to maximize our throughput.
|
||||
*/
|
||||
static int qib_pcie_caps = 0x51;
|
||||
static int qib_pcie_caps;
|
||||
module_param_named(pcie_caps, qib_pcie_caps, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(pcie_caps, "Max PCIe tuning: Payload (0..3), ReadReq (4..7)");
|
||||
|
||||
|
@ -1279,3 +1279,4 @@ static struct usb_driver go7007_usb_driver = {
|
||||
};
|
||||
|
||||
module_usb_driver(go7007_usb_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -641,10 +641,10 @@ static int __cap_is_valid(struct ceph_cap *cap)
|
||||
unsigned long ttl;
|
||||
u32 gen;
|
||||
|
||||
spin_lock(&cap->session->s_cap_lock);
|
||||
spin_lock(&cap->session->s_gen_ttl_lock);
|
||||
gen = cap->session->s_cap_gen;
|
||||
ttl = cap->session->s_cap_ttl;
|
||||
spin_unlock(&cap->session->s_cap_lock);
|
||||
spin_unlock(&cap->session->s_gen_ttl_lock);
|
||||
|
||||
if (cap->cap_gen < gen || time_after_eq(jiffies, ttl)) {
|
||||
dout("__cap_is_valid %p cap %p issued %s "
|
||||
|
@ -975,10 +975,10 @@ static int dentry_lease_is_valid(struct dentry *dentry)
|
||||
di = ceph_dentry(dentry);
|
||||
if (di->lease_session) {
|
||||
s = di->lease_session;
|
||||
spin_lock(&s->s_cap_lock);
|
||||
spin_lock(&s->s_gen_ttl_lock);
|
||||
gen = s->s_cap_gen;
|
||||
ttl = s->s_cap_ttl;
|
||||
spin_unlock(&s->s_cap_lock);
|
||||
spin_unlock(&s->s_gen_ttl_lock);
|
||||
|
||||
if (di->lease_gen == gen &&
|
||||
time_before(jiffies, dentry->d_time) &&
|
||||
|
@ -262,6 +262,7 @@ static int parse_reply_info(struct ceph_msg *msg,
|
||||
/* trace */
|
||||
ceph_decode_32_safe(&p, end, len, bad);
|
||||
if (len > 0) {
|
||||
ceph_decode_need(&p, end, len, bad);
|
||||
err = parse_reply_info_trace(&p, p+len, info, features);
|
||||
if (err < 0)
|
||||
goto out_bad;
|
||||
@ -270,6 +271,7 @@ static int parse_reply_info(struct ceph_msg *msg,
|
||||
/* extra */
|
||||
ceph_decode_32_safe(&p, end, len, bad);
|
||||
if (len > 0) {
|
||||
ceph_decode_need(&p, end, len, bad);
|
||||
err = parse_reply_info_extra(&p, p+len, info, features);
|
||||
if (err < 0)
|
||||
goto out_bad;
|
||||
@ -398,9 +400,11 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
|
||||
s->s_con.peer_name.type = CEPH_ENTITY_TYPE_MDS;
|
||||
s->s_con.peer_name.num = cpu_to_le64(mds);
|
||||
|
||||
spin_lock_init(&s->s_cap_lock);
|
||||
spin_lock_init(&s->s_gen_ttl_lock);
|
||||
s->s_cap_gen = 0;
|
||||
s->s_cap_ttl = 0;
|
||||
|
||||
spin_lock_init(&s->s_cap_lock);
|
||||
s->s_renew_requested = 0;
|
||||
s->s_renew_seq = 0;
|
||||
INIT_LIST_HEAD(&s->s_caps);
|
||||
@ -2326,10 +2330,10 @@ static void handle_session(struct ceph_mds_session *session,
|
||||
case CEPH_SESSION_STALE:
|
||||
pr_info("mds%d caps went stale, renewing\n",
|
||||
session->s_mds);
|
||||
spin_lock(&session->s_cap_lock);
|
||||
spin_lock(&session->s_gen_ttl_lock);
|
||||
session->s_cap_gen++;
|
||||
session->s_cap_ttl = 0;
|
||||
spin_unlock(&session->s_cap_lock);
|
||||
spin_unlock(&session->s_gen_ttl_lock);
|
||||
send_renew_caps(mdsc, session);
|
||||
break;
|
||||
|
||||
|
@ -117,10 +117,13 @@ struct ceph_mds_session {
|
||||
void *s_authorizer_buf, *s_authorizer_reply_buf;
|
||||
size_t s_authorizer_buf_len, s_authorizer_reply_buf_len;
|
||||
|
||||
/* protected by s_cap_lock */
|
||||
spinlock_t s_cap_lock;
|
||||
/* protected by s_gen_ttl_lock */
|
||||
spinlock_t s_gen_ttl_lock;
|
||||
u32 s_cap_gen; /* inc each time we get mds stale msg */
|
||||
unsigned long s_cap_ttl; /* when session caps expire */
|
||||
|
||||
/* protected by s_cap_lock */
|
||||
spinlock_t s_cap_lock;
|
||||
struct list_head s_caps; /* all caps issued by this session */
|
||||
int s_nr_caps, s_trim_caps;
|
||||
int s_num_cap_releases;
|
||||
|
@ -111,8 +111,10 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val,
|
||||
}
|
||||
|
||||
static struct ceph_vxattr_cb ceph_file_vxattrs[] = {
|
||||
{ true, "ceph.file.layout", ceph_vxattrcb_layout},
|
||||
/* The following extended attribute name is deprecated */
|
||||
{ true, "ceph.layout", ceph_vxattrcb_layout},
|
||||
{ NULL, NULL }
|
||||
{ true, NULL, NULL }
|
||||
};
|
||||
|
||||
static struct ceph_vxattr_cb *ceph_inode_vxattrs(struct inode *inode)
|
||||
|
@ -152,9 +152,6 @@ static struct page *logfs_mtd_find_first_sb(struct super_block *sb, u64 *ofs)
|
||||
filler_t *filler = logfs_mtd_readpage;
|
||||
struct mtd_info *mtd = super->s_mtd;
|
||||
|
||||
if (!mtd_can_have_bb(mtd))
|
||||
return NULL;
|
||||
|
||||
*ofs = 0;
|
||||
while (mtd_block_isbad(mtd, *ofs)) {
|
||||
*ofs += mtd->erasesize;
|
||||
@ -172,9 +169,6 @@ static struct page *logfs_mtd_find_last_sb(struct super_block *sb, u64 *ofs)
|
||||
filler_t *filler = logfs_mtd_readpage;
|
||||
struct mtd_info *mtd = super->s_mtd;
|
||||
|
||||
if (!mtd_can_have_bb(mtd))
|
||||
return NULL;
|
||||
|
||||
*ofs = mtd->size - mtd->erasesize;
|
||||
while (mtd_block_isbad(mtd, *ofs)) {
|
||||
*ofs -= mtd->erasesize;
|
||||
|
130
fs/proc/base.c
130
fs/proc/base.c
@ -198,26 +198,6 @@ static int proc_root_link(struct dentry *dentry, struct path *path)
|
||||
return result;
|
||||
}
|
||||
|
||||
static struct mm_struct *mm_access(struct task_struct *task, unsigned int mode)
|
||||
{
|
||||
struct mm_struct *mm;
|
||||
int err;
|
||||
|
||||
err = mutex_lock_killable(&task->signal->cred_guard_mutex);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
mm = get_task_mm(task);
|
||||
if (mm && mm != current->mm &&
|
||||
!ptrace_may_access(task, mode)) {
|
||||
mmput(mm);
|
||||
mm = ERR_PTR(-EACCES);
|
||||
}
|
||||
mutex_unlock(&task->signal->cred_guard_mutex);
|
||||
|
||||
return mm;
|
||||
}
|
||||
|
||||
struct mm_struct *mm_for_maps(struct task_struct *task)
|
||||
{
|
||||
return mm_access(task, PTRACE_MODE_READ);
|
||||
@ -711,6 +691,13 @@ static int mem_open(struct inode* inode, struct file* file)
|
||||
if (IS_ERR(mm))
|
||||
return PTR_ERR(mm);
|
||||
|
||||
if (mm) {
|
||||
/* ensure this mm_struct can't be freed */
|
||||
atomic_inc(&mm->mm_count);
|
||||
/* but do not pin its memory */
|
||||
mmput(mm);
|
||||
}
|
||||
|
||||
/* OK to pass negative loff_t, we can catch out-of-range */
|
||||
file->f_mode |= FMODE_UNSIGNED_OFFSET;
|
||||
file->private_data = mm;
|
||||
@ -718,57 +705,13 @@ static int mem_open(struct inode* inode, struct file* file)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t mem_read(struct file * file, char __user * buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static ssize_t mem_rw(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos, int write)
|
||||
{
|
||||
int ret;
|
||||
char *page;
|
||||
unsigned long src = *ppos;
|
||||
struct mm_struct *mm = file->private_data;
|
||||
|
||||
if (!mm)
|
||||
return 0;
|
||||
|
||||
page = (char *)__get_free_page(GFP_TEMPORARY);
|
||||
if (!page)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = 0;
|
||||
|
||||
while (count > 0) {
|
||||
int this_len, retval;
|
||||
|
||||
this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
|
||||
retval = access_remote_vm(mm, src, page, this_len, 0);
|
||||
if (!retval) {
|
||||
if (!ret)
|
||||
ret = -EIO;
|
||||
break;
|
||||
}
|
||||
|
||||
if (copy_to_user(buf, page, retval)) {
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
ret += retval;
|
||||
src += retval;
|
||||
buf += retval;
|
||||
count -= retval;
|
||||
}
|
||||
*ppos = src;
|
||||
|
||||
free_page((unsigned long) page);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t mem_write(struct file * file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
int copied;
|
||||
unsigned long addr = *ppos;
|
||||
ssize_t copied;
|
||||
char *page;
|
||||
unsigned long dst = *ppos;
|
||||
struct mm_struct *mm = file->private_data;
|
||||
|
||||
if (!mm)
|
||||
return 0;
|
||||
@ -778,31 +721,54 @@ static ssize_t mem_write(struct file * file, const char __user *buf,
|
||||
return -ENOMEM;
|
||||
|
||||
copied = 0;
|
||||
while (count > 0) {
|
||||
int this_len, retval;
|
||||
if (!atomic_inc_not_zero(&mm->mm_users))
|
||||
goto free;
|
||||
|
||||
this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
|
||||
if (copy_from_user(page, buf, this_len)) {
|
||||
while (count > 0) {
|
||||
int this_len = min_t(int, count, PAGE_SIZE);
|
||||
|
||||
if (write && copy_from_user(page, buf, this_len)) {
|
||||
copied = -EFAULT;
|
||||
break;
|
||||
}
|
||||
retval = access_remote_vm(mm, dst, page, this_len, 1);
|
||||
if (!retval) {
|
||||
|
||||
this_len = access_remote_vm(mm, addr, page, this_len, write);
|
||||
if (!this_len) {
|
||||
if (!copied)
|
||||
copied = -EIO;
|
||||
break;
|
||||
}
|
||||
copied += retval;
|
||||
buf += retval;
|
||||
dst += retval;
|
||||
count -= retval;
|
||||
}
|
||||
*ppos = dst;
|
||||
|
||||
if (!write && copy_to_user(buf, page, this_len)) {
|
||||
copied = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
buf += this_len;
|
||||
addr += this_len;
|
||||
copied += this_len;
|
||||
count -= this_len;
|
||||
}
|
||||
*ppos = addr;
|
||||
|
||||
mmput(mm);
|
||||
free:
|
||||
free_page((unsigned long) page);
|
||||
return copied;
|
||||
}
|
||||
|
||||
static ssize_t mem_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
return mem_rw(file, buf, count, ppos, 0);
|
||||
}
|
||||
|
||||
static ssize_t mem_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
return mem_rw(file, (char __user*)buf, count, ppos, 1);
|
||||
}
|
||||
|
||||
loff_t mem_lseek(struct file *file, loff_t offset, int orig)
|
||||
{
|
||||
switch (orig) {
|
||||
@ -822,8 +788,8 @@ loff_t mem_lseek(struct file *file, loff_t offset, int orig)
|
||||
static int mem_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct mm_struct *mm = file->private_data;
|
||||
|
||||
mmput(mm);
|
||||
if (mm)
|
||||
mmdrop(mm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
0
include/linux/lp8727.h
Executable file → Normal file
0
include/linux/lp8727.h
Executable file → Normal file
@ -57,8 +57,6 @@ struct gcry_mpi {
|
||||
|
||||
typedef struct gcry_mpi *MPI;
|
||||
|
||||
#define MPI_NULL NULL
|
||||
|
||||
#define mpi_get_nlimbs(a) ((a)->nlimbs)
|
||||
#define mpi_is_neg(a) ((a)->sign)
|
||||
|
||||
|
@ -489,7 +489,7 @@ static inline int mtd_has_oob(const struct mtd_info *mtd)
|
||||
|
||||
static inline int mtd_can_have_bb(const struct mtd_info *mtd)
|
||||
{
|
||||
return 0;
|
||||
return !!mtd->block_isbad;
|
||||
}
|
||||
|
||||
/* Kernel-side ioctl definitions */
|
||||
|
@ -2259,6 +2259,12 @@ static inline void mmdrop(struct mm_struct * mm)
|
||||
extern void mmput(struct mm_struct *);
|
||||
/* Grab a reference to a task's mm, if it is not already going away */
|
||||
extern struct mm_struct *get_task_mm(struct task_struct *task);
|
||||
/*
|
||||
* Grab a reference to a task's mm, if it is not already going away
|
||||
* and ptrace_may_access with the mode parameter passed to it
|
||||
* succeeds.
|
||||
*/
|
||||
extern struct mm_struct *mm_access(struct task_struct *task, unsigned int mode);
|
||||
/* Remove the current tasks stale references to the old mm_struct */
|
||||
extern void mm_release(struct task_struct *, struct mm_struct *);
|
||||
/* Allocate a new mm structure and copy contents from tsk->mm */
|
||||
|
@ -1038,6 +1038,22 @@ void do_exit(long code)
|
||||
if (tsk->nr_dirtied)
|
||||
__this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied);
|
||||
exit_rcu();
|
||||
|
||||
/*
|
||||
* The setting of TASK_RUNNING by try_to_wake_up() may be delayed
|
||||
* when the following two conditions become true.
|
||||
* - There is race condition of mmap_sem (It is acquired by
|
||||
* exit_mm()), and
|
||||
* - SMI occurs before setting TASK_RUNINNG.
|
||||
* (or hypervisor of virtual machine switches to other guest)
|
||||
* As a result, we may become TASK_RUNNING after becoming TASK_DEAD
|
||||
*
|
||||
* To avoid it, we have to wait for releasing tsk->pi_lock which
|
||||
* is held by try_to_wake_up()
|
||||
*/
|
||||
smp_mb();
|
||||
raw_spin_unlock_wait(&tsk->pi_lock);
|
||||
|
||||
/* causes final put_task_struct in finish_task_switch(). */
|
||||
tsk->state = TASK_DEAD;
|
||||
tsk->flags |= PF_NOFREEZE; /* tell freezer to ignore us */
|
||||
|
@ -647,6 +647,26 @@ struct mm_struct *get_task_mm(struct task_struct *task)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_task_mm);
|
||||
|
||||
struct mm_struct *mm_access(struct task_struct *task, unsigned int mode)
|
||||
{
|
||||
struct mm_struct *mm;
|
||||
int err;
|
||||
|
||||
err = mutex_lock_killable(&task->signal->cred_guard_mutex);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
mm = get_task_mm(task);
|
||||
if (mm && mm != current->mm &&
|
||||
!ptrace_may_access(task, mode)) {
|
||||
mmput(mm);
|
||||
mm = ERR_PTR(-EACCES);
|
||||
}
|
||||
mutex_unlock(&task->signal->cred_guard_mutex);
|
||||
|
||||
return mm;
|
||||
}
|
||||
|
||||
/* Please note the differences between mmput and mm_release.
|
||||
* mmput is called whenever we stop holding onto a mm_struct,
|
||||
* error success whatever.
|
||||
|
@ -74,6 +74,7 @@
|
||||
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/irq_regs.h>
|
||||
#include <asm/mutex.h>
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
#include <asm/paravirt.h>
|
||||
#endif
|
||||
@ -723,9 +724,6 @@ static void dequeue_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
p->sched_class->dequeue_task(rq, p, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* activate_task - move a task to the runqueue.
|
||||
*/
|
||||
void activate_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
{
|
||||
if (task_contributes_to_load(p))
|
||||
@ -734,9 +732,6 @@ void activate_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
enqueue_task(rq, p, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* deactivate_task - remove a task from the runqueue.
|
||||
*/
|
||||
void deactivate_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
{
|
||||
if (task_contributes_to_load(p))
|
||||
@ -4134,7 +4129,7 @@ static int __sched_setscheduler(struct task_struct *p, int policy,
|
||||
on_rq = p->on_rq;
|
||||
running = task_current(rq, p);
|
||||
if (on_rq)
|
||||
deactivate_task(rq, p, 0);
|
||||
dequeue_task(rq, p, 0);
|
||||
if (running)
|
||||
p->sched_class->put_prev_task(rq, p);
|
||||
|
||||
@ -4147,7 +4142,7 @@ static int __sched_setscheduler(struct task_struct *p, int policy,
|
||||
if (running)
|
||||
p->sched_class->set_curr_task(rq);
|
||||
if (on_rq)
|
||||
activate_task(rq, p, 0);
|
||||
enqueue_task(rq, p, 0);
|
||||
|
||||
check_class_changed(rq, p, prev_class, oldprio);
|
||||
task_rq_unlock(rq, p, &flags);
|
||||
@ -4998,9 +4993,9 @@ static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu)
|
||||
* placed properly.
|
||||
*/
|
||||
if (p->on_rq) {
|
||||
deactivate_task(rq_src, p, 0);
|
||||
dequeue_task(rq_src, p, 0);
|
||||
set_task_cpu(p, dest_cpu);
|
||||
activate_task(rq_dest, p, 0);
|
||||
enqueue_task(rq_dest, p, 0);
|
||||
check_preempt_curr(rq_dest, p, 0);
|
||||
}
|
||||
done:
|
||||
@ -7032,10 +7027,10 @@ static void normalize_task(struct rq *rq, struct task_struct *p)
|
||||
|
||||
on_rq = p->on_rq;
|
||||
if (on_rq)
|
||||
deactivate_task(rq, p, 0);
|
||||
dequeue_task(rq, p, 0);
|
||||
__setscheduler(rq, p, SCHED_NORMAL, 0);
|
||||
if (on_rq) {
|
||||
activate_task(rq, p, 0);
|
||||
enqueue_task(rq, p, 0);
|
||||
resched_task(rq->curr);
|
||||
}
|
||||
|
||||
|
@ -4866,6 +4866,15 @@ static void nohz_balancer_kick(int cpu)
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void clear_nohz_tick_stopped(int cpu)
|
||||
{
|
||||
if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) {
|
||||
cpumask_clear_cpu(cpu, nohz.idle_cpus_mask);
|
||||
atomic_dec(&nohz.nr_cpus);
|
||||
clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu));
|
||||
}
|
||||
}
|
||||
|
||||
static inline void set_cpu_sd_state_busy(void)
|
||||
{
|
||||
struct sched_domain *sd;
|
||||
@ -4904,6 +4913,12 @@ void select_nohz_load_balancer(int stop_tick)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
/*
|
||||
* If this cpu is going down, then nothing needs to be done.
|
||||
*/
|
||||
if (!cpu_active(cpu))
|
||||
return;
|
||||
|
||||
if (stop_tick) {
|
||||
if (test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))
|
||||
return;
|
||||
@ -4914,6 +4929,18 @@ void select_nohz_load_balancer(int stop_tick)
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static int __cpuinit sched_ilb_notifier(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
switch (action & ~CPU_TASKS_FROZEN) {
|
||||
case CPU_DYING:
|
||||
clear_nohz_tick_stopped(smp_processor_id());
|
||||
return NOTIFY_OK;
|
||||
default:
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static DEFINE_SPINLOCK(balancing);
|
||||
@ -5070,11 +5097,7 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
|
||||
* busy tick after returning from idle, we will update the busy stats.
|
||||
*/
|
||||
set_cpu_sd_state_busy();
|
||||
if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) {
|
||||
clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu));
|
||||
cpumask_clear_cpu(cpu, nohz.idle_cpus_mask);
|
||||
atomic_dec(&nohz.nr_cpus);
|
||||
}
|
||||
clear_nohz_tick_stopped(cpu);
|
||||
|
||||
/*
|
||||
* None are in tickless mode and hence no need for NOHZ idle load
|
||||
@ -5590,6 +5613,7 @@ __init void init_sched_fair_class(void)
|
||||
|
||||
#ifdef CONFIG_NO_HZ
|
||||
zalloc_cpumask_var(&nohz.idle_cpus_mask, GFP_NOWAIT);
|
||||
cpu_notifier(sched_ilb_notifier, 0);
|
||||
#endif
|
||||
#endif /* SMP */
|
||||
|
||||
|
@ -1587,6 +1587,11 @@ static int push_rt_task(struct rq *rq)
|
||||
if (!next_task)
|
||||
return 0;
|
||||
|
||||
#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
|
||||
if (unlikely(task_running(rq, next_task)))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
retry:
|
||||
if (unlikely(next_task == rq->curr)) {
|
||||
WARN_ON(1);
|
||||
|
@ -296,7 +296,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
|
||||
if (__this_cpu_read(soft_watchdog_warn) == true)
|
||||
return HRTIMER_RESTART;
|
||||
|
||||
printk(KERN_ERR "BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",
|
||||
printk(KERN_EMERG "BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",
|
||||
smp_processor_id(), duration,
|
||||
current->comm, task_pid_nr(current));
|
||||
print_modules();
|
||||
|
@ -279,6 +279,9 @@ config AVERAGE
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config CLZ_TAB
|
||||
bool
|
||||
|
||||
config CORDIC
|
||||
tristate "CORDIC algorithm"
|
||||
help
|
||||
@ -287,6 +290,7 @@ config CORDIC
|
||||
|
||||
config MPILIB
|
||||
tristate
|
||||
select CLZ_TAB
|
||||
help
|
||||
Multiprecision maths library from GnuPG.
|
||||
It is used to implement RSA digital signature verification,
|
||||
|
@ -121,6 +121,8 @@ obj-$(CONFIG_DQL) += dynamic_queue_limits.o
|
||||
obj-$(CONFIG_MPILIB) += mpi/
|
||||
obj-$(CONFIG_SIGNATURE) += digsig.o
|
||||
|
||||
obj-$(CONFIG_CLZ_TAB) += clz_tab.o
|
||||
|
||||
hostprogs-y := gen_crc32table
|
||||
clean-files := crc32table.h
|
||||
|
||||
|
@ -169,7 +169,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
|
||||
return BUG_TRAP_TYPE_WARN;
|
||||
}
|
||||
|
||||
printk(KERN_EMERG "------------[ cut here ]------------\n");
|
||||
printk(KERN_DEFAULT "------------[ cut here ]------------\n");
|
||||
|
||||
if (file)
|
||||
printk(KERN_CRIT "kernel BUG at %s:%u!\n",
|
||||
|
18
lib/clz_tab.c
Normal file
18
lib/clz_tab.c
Normal file
@ -0,0 +1,18 @@
|
||||
const unsigned char __clz_tab[] = {
|
||||
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
};
|
52
lib/digsig.c
52
lib/digsig.c
@ -34,14 +34,9 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,
|
||||
unsigned long msglen,
|
||||
unsigned long modulus_bitlen,
|
||||
unsigned char *out,
|
||||
unsigned long *outlen,
|
||||
int *is_valid)
|
||||
unsigned long *outlen)
|
||||
{
|
||||
unsigned long modulus_len, ps_len, i;
|
||||
int result;
|
||||
|
||||
/* default to invalid packet */
|
||||
*is_valid = 0;
|
||||
|
||||
modulus_len = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0);
|
||||
|
||||
@ -50,39 +45,30 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,
|
||||
return -EINVAL;
|
||||
|
||||
/* separate encoded message */
|
||||
if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) {
|
||||
result = -EINVAL;
|
||||
goto bail;
|
||||
}
|
||||
if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 2; i < modulus_len - 1; i++)
|
||||
if (msg[i] != 0xFF)
|
||||
break;
|
||||
|
||||
/* separator check */
|
||||
if (msg[i] != 0) {
|
||||
if (msg[i] != 0)
|
||||
/* There was no octet with hexadecimal value 0x00
|
||||
to separate ps from m. */
|
||||
result = -EINVAL;
|
||||
goto bail;
|
||||
}
|
||||
return -EINVAL;
|
||||
|
||||
ps_len = i - 2;
|
||||
|
||||
if (*outlen < (msglen - (2 + ps_len + 1))) {
|
||||
*outlen = msglen - (2 + ps_len + 1);
|
||||
result = -EOVERFLOW;
|
||||
goto bail;
|
||||
return -EOVERFLOW;
|
||||
}
|
||||
|
||||
*outlen = (msglen - (2 + ps_len + 1));
|
||||
memcpy(out, &msg[2 + ps_len + 1], *outlen);
|
||||
|
||||
/* valid packet */
|
||||
*is_valid = 1;
|
||||
result = 0;
|
||||
bail:
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -96,7 +82,7 @@ static int digsig_verify_rsa(struct key *key,
|
||||
unsigned long len;
|
||||
unsigned long mlen, mblen;
|
||||
unsigned nret, l;
|
||||
int valid, head, i;
|
||||
int head, i;
|
||||
unsigned char *out1 = NULL, *out2 = NULL;
|
||||
MPI in = NULL, res = NULL, pkey[2];
|
||||
uint8_t *p, *datap, *endp;
|
||||
@ -105,6 +91,10 @@ static int digsig_verify_rsa(struct key *key,
|
||||
|
||||
down_read(&key->sem);
|
||||
ukp = key->payload.data;
|
||||
|
||||
if (ukp->datalen < sizeof(*pkh))
|
||||
goto err1;
|
||||
|
||||
pkh = (struct pubkey_hdr *)ukp->data;
|
||||
|
||||
if (pkh->version != 1)
|
||||
@ -117,18 +107,23 @@ static int digsig_verify_rsa(struct key *key,
|
||||
goto err1;
|
||||
|
||||
datap = pkh->mpi;
|
||||
endp = datap + ukp->datalen;
|
||||
endp = ukp->data + ukp->datalen;
|
||||
|
||||
err = -ENOMEM;
|
||||
|
||||
for (i = 0; i < pkh->nmpi; i++) {
|
||||
unsigned int remaining = endp - datap;
|
||||
pkey[i] = mpi_read_from_buffer(datap, &remaining);
|
||||
if (!pkey[i])
|
||||
goto err;
|
||||
datap += remaining;
|
||||
}
|
||||
|
||||
mblen = mpi_get_nbits(pkey[0]);
|
||||
mlen = (mblen + 7)/8;
|
||||
|
||||
err = -ENOMEM;
|
||||
if (mlen == 0)
|
||||
goto err;
|
||||
|
||||
out1 = kzalloc(mlen, GFP_KERNEL);
|
||||
if (!out1)
|
||||
@ -167,10 +162,9 @@ static int digsig_verify_rsa(struct key *key,
|
||||
memset(out1, 0, head);
|
||||
memcpy(out1 + head, p, l);
|
||||
|
||||
err = -EINVAL;
|
||||
pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len, &valid);
|
||||
err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len);
|
||||
|
||||
if (valid && len == hlen)
|
||||
if (!err && len == hlen)
|
||||
err = memcmp(out2, h, hlen);
|
||||
|
||||
err:
|
||||
@ -178,8 +172,8 @@ static int digsig_verify_rsa(struct key *key,
|
||||
mpi_free(res);
|
||||
kfree(out1);
|
||||
kfree(out2);
|
||||
mpi_free(pkey[0]);
|
||||
mpi_free(pkey[1]);
|
||||
while (--i >= 0)
|
||||
mpi_free(pkey[i]);
|
||||
err1:
|
||||
up_read(&key->sem);
|
||||
|
||||
|
@ -1200,18 +1200,40 @@ do { \
|
||||
"r" ((USItype)(v)) \
|
||||
: "%g1", "%g2" __AND_CLOBBER_CC)
|
||||
#define UMUL_TIME 39 /* 39 instructions */
|
||||
#endif
|
||||
#ifndef udiv_qrnnd
|
||||
#ifndef LONGLONG_STANDALONE
|
||||
/* It's quite necessary to add this much assembler for the sparc.
|
||||
The default udiv_qrnnd (in C) is more than 10 times slower! */
|
||||
#define udiv_qrnnd(q, r, n1, n0, d) \
|
||||
do { USItype __r; \
|
||||
(q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \
|
||||
(r) = __r; \
|
||||
} while (0)
|
||||
extern USItype __udiv_qrnnd();
|
||||
#define UDIV_TIME 140
|
||||
#endif /* LONGLONG_STANDALONE */
|
||||
#endif /* udiv_qrnnd */
|
||||
__asm__ ("! Inlined udiv_qrnnd\n\t" \
|
||||
"mov 32,%%g1\n\t" \
|
||||
"subcc %1,%2,%%g0\n\t" \
|
||||
"1: bcs 5f\n\t" \
|
||||
"addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \
|
||||
"sub %1,%2,%1 ! this kills msb of n\n\t" \
|
||||
"addx %1,%1,%1 ! so this can't give carry\n\t" \
|
||||
"subcc %%g1,1,%%g1\n\t" \
|
||||
"2: bne 1b\n\t" \
|
||||
"subcc %1,%2,%%g0\n\t" \
|
||||
"bcs 3f\n\t" \
|
||||
"addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \
|
||||
"b 3f\n\t" \
|
||||
"sub %1,%2,%1 ! this kills msb of n\n\t" \
|
||||
"4: sub %1,%2,%1\n\t" \
|
||||
"5: addxcc %1,%1,%1\n\t" \
|
||||
"bcc 2b\n\t" \
|
||||
"subcc %%g1,1,%%g1\n\t" \
|
||||
"! Got carry from n. Subtract next step to cancel this carry.\n\t" \
|
||||
"bne 4b\n\t" \
|
||||
"addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n\t" \
|
||||
"sub %1,%2,%1\n\t" \
|
||||
"3: xnor %0,0,%0\n\t" \
|
||||
"! End of inline udiv_qrnnd\n" \
|
||||
: "=&r" ((USItype)(q)), \
|
||||
"=&r" ((USItype)(r)) \
|
||||
: "r" ((USItype)(d)), \
|
||||
"1" ((USItype)(n1)), \
|
||||
"0" ((USItype)(n0)) : "%g1", "cc")
|
||||
#define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */
|
||||
#endif
|
||||
#endif /* __sparc__ */
|
||||
|
||||
/***************************************
|
||||
|
@ -21,25 +21,6 @@
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
const unsigned char __clz_tab[] = {
|
||||
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
};
|
||||
|
||||
#define A_LIMB_1 ((mpi_limb_t) 1)
|
||||
|
||||
/****************
|
||||
|
@ -149,6 +149,9 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den)
|
||||
mpi_ptr_t marker[5];
|
||||
int markidx = 0;
|
||||
|
||||
if (!dsize)
|
||||
return -EINVAL;
|
||||
|
||||
memset(marker, 0, sizeof(marker));
|
||||
|
||||
/* Ensure space is enough for quotient and remainder.
|
||||
@ -207,6 +210,8 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den)
|
||||
* numerator would be gradually overwritten by the quotient limbs. */
|
||||
if (qp == np) { /* Copy NP object to temporary space. */
|
||||
np = marker[markidx++] = mpi_alloc_limb_space(nsize);
|
||||
if (!np)
|
||||
goto nomem;
|
||||
MPN_COPY(np, qp, nsize);
|
||||
}
|
||||
} else /* Put quotient at top of remainder. */
|
||||
|
@ -59,7 +59,7 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
|
||||
ep = exp->d;
|
||||
|
||||
if (!msize)
|
||||
msize = 1 / msize; /* provoke a signal */
|
||||
return -EINVAL;
|
||||
|
||||
if (!esize) {
|
||||
/* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0
|
||||
|
@ -20,78 +20,15 @@
|
||||
|
||||
#include "mpi-internal.h"
|
||||
|
||||
#define DIM(v) (sizeof(v)/sizeof((v)[0]))
|
||||
#define MAX_EXTERN_MPI_BITS 16384
|
||||
|
||||
static uint8_t asn[15] = /* Object ID is 1.3.14.3.2.26 */
|
||||
{ 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03,
|
||||
0x02, 0x1a, 0x05, 0x00, 0x04, 0x14
|
||||
};
|
||||
|
||||
MPI do_encode_md(const void *sha_buffer, unsigned nbits)
|
||||
{
|
||||
int nframe = (nbits + 7) / 8;
|
||||
uint8_t *frame, *fr_pt;
|
||||
int i = 0, n;
|
||||
size_t asnlen = DIM(asn);
|
||||
MPI a = MPI_NULL;
|
||||
|
||||
if (SHA1_DIGEST_LENGTH + asnlen + 4 > nframe)
|
||||
pr_info("MPI: can't encode a %d bit MD into a %d bits frame\n",
|
||||
(int)(SHA1_DIGEST_LENGTH * 8), (int)nbits);
|
||||
|
||||
/* We encode the MD in this way:
|
||||
*
|
||||
* 0 A PAD(n bytes) 0 ASN(asnlen bytes) MD(len bytes)
|
||||
*
|
||||
* PAD consists of FF bytes.
|
||||
*/
|
||||
frame = kmalloc(nframe, GFP_KERNEL);
|
||||
if (!frame)
|
||||
return MPI_NULL;
|
||||
n = 0;
|
||||
frame[n++] = 0;
|
||||
frame[n++] = 1; /* block type */
|
||||
i = nframe - SHA1_DIGEST_LENGTH - asnlen - 3;
|
||||
|
||||
if (i <= 1) {
|
||||
pr_info("MPI: message digest encoding failed\n");
|
||||
kfree(frame);
|
||||
return a;
|
||||
}
|
||||
|
||||
memset(frame + n, 0xff, i);
|
||||
n += i;
|
||||
frame[n++] = 0;
|
||||
memcpy(frame + n, &asn, asnlen);
|
||||
n += asnlen;
|
||||
memcpy(frame + n, sha_buffer, SHA1_DIGEST_LENGTH);
|
||||
n += SHA1_DIGEST_LENGTH;
|
||||
|
||||
i = nframe;
|
||||
fr_pt = frame;
|
||||
|
||||
if (n != nframe) {
|
||||
printk
|
||||
("MPI: message digest encoding failed, frame length is wrong\n");
|
||||
kfree(frame);
|
||||
return a;
|
||||
}
|
||||
|
||||
a = mpi_alloc((nframe + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB);
|
||||
mpi_set_buffer(a, frame, nframe, 0);
|
||||
kfree(frame);
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
|
||||
{
|
||||
const uint8_t *buffer = xbuffer;
|
||||
int i, j;
|
||||
unsigned nbits, nbytes, nlimbs, nread = 0;
|
||||
mpi_limb_t a;
|
||||
MPI val = MPI_NULL;
|
||||
MPI val = NULL;
|
||||
|
||||
if (*ret_nread < 2)
|
||||
goto leave;
|
||||
@ -108,7 +45,7 @@ MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
|
||||
nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB;
|
||||
val = mpi_alloc(nlimbs);
|
||||
if (!val)
|
||||
return MPI_NULL;
|
||||
return NULL;
|
||||
i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
|
||||
i %= BYTES_PER_MPI_LIMB;
|
||||
val->nbits = nbits;
|
||||
@ -211,30 +148,6 @@ int mpi_fromstr(MPI val, const char *str)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mpi_fromstr);
|
||||
|
||||
/****************
|
||||
* Special function to get the low 8 bytes from an mpi.
|
||||
* This can be used as a keyid; KEYID is an 2 element array.
|
||||
* Return the low 4 bytes.
|
||||
*/
|
||||
u32 mpi_get_keyid(const MPI a, u32 *keyid)
|
||||
{
|
||||
#if BYTES_PER_MPI_LIMB == 4
|
||||
if (keyid) {
|
||||
keyid[0] = a->nlimbs >= 2 ? a->d[1] : 0;
|
||||
keyid[1] = a->nlimbs >= 1 ? a->d[0] : 0;
|
||||
}
|
||||
return a->nlimbs >= 1 ? a->d[0] : 0;
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
if (keyid) {
|
||||
keyid[0] = a->nlimbs ? (u32) (a->d[0] >> 32) : 0;
|
||||
keyid[1] = a->nlimbs ? (u32) (a->d[0] & 0xffffffff) : 0;
|
||||
}
|
||||
return a->nlimbs ? (u32) (a->d[0] & 0xffffffff) : 0;
|
||||
#else
|
||||
#error Make this function work with other LIMB sizes
|
||||
#endif
|
||||
}
|
||||
|
||||
/****************
|
||||
* Return an allocated buffer with the MPI (msb first).
|
||||
* NBYTES receives the length of this buffer. Caller must free the
|
||||
|
@ -217,6 +217,10 @@ mpihelp_divrem(mpi_ptr_t qp, mpi_size_t qextra_limbs,
|
||||
case 0:
|
||||
/* We are asked to divide by zero, so go ahead and do it! (To make
|
||||
the compiler not remove this statement, return the value.) */
|
||||
/*
|
||||
* existing clients of this function have been modified
|
||||
* not to call it with dsize == 0, so this should not happen
|
||||
*/
|
||||
return 1 / dsize;
|
||||
|
||||
case 1:
|
||||
|
@ -58,6 +58,9 @@ mpi_ptr_t mpi_alloc_limb_space(unsigned nlimbs)
|
||||
{
|
||||
size_t len = nlimbs * sizeof(mpi_limb_t);
|
||||
|
||||
if (!len)
|
||||
return NULL;
|
||||
|
||||
return kmalloc(len, GFP_KERNEL);
|
||||
}
|
||||
|
||||
@ -135,7 +138,7 @@ int mpi_copy(MPI *copied, const MPI a)
|
||||
size_t i;
|
||||
MPI b;
|
||||
|
||||
*copied = MPI_NULL;
|
||||
*copied = NULL;
|
||||
|
||||
if (a) {
|
||||
b = mpi_alloc(a->nlimbs);
|
||||
|
@ -298,22 +298,17 @@ static ssize_t process_vm_rw_core(pid_t pid, const struct iovec *lvec,
|
||||
goto free_proc_pages;
|
||||
}
|
||||
|
||||
task_lock(task);
|
||||
if (__ptrace_may_access(task, PTRACE_MODE_ATTACH)) {
|
||||
task_unlock(task);
|
||||
rc = -EPERM;
|
||||
mm = mm_access(task, PTRACE_MODE_ATTACH);
|
||||
if (!mm || IS_ERR(mm)) {
|
||||
rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH;
|
||||
/*
|
||||
* Explicitly map EACCES to EPERM as EPERM is a more a
|
||||
* appropriate error code for process_vw_readv/writev
|
||||
*/
|
||||
if (rc == -EACCES)
|
||||
rc = -EPERM;
|
||||
goto put_task_struct;
|
||||
}
|
||||
mm = task->mm;
|
||||
|
||||
if (!mm || (task->flags & PF_KTHREAD)) {
|
||||
task_unlock(task);
|
||||
rc = -EINVAL;
|
||||
goto put_task_struct;
|
||||
}
|
||||
|
||||
atomic_inc(&mm->mm_users);
|
||||
task_unlock(task);
|
||||
|
||||
for (i = 0; i < riovcnt && iov_l_curr_idx < liovcnt; i++) {
|
||||
rc = process_vm_rw_single_vec(
|
||||
|
@ -85,8 +85,6 @@ int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid)
|
||||
} else {
|
||||
pr_info("client%lld fsid %pU\n", ceph_client_id(client), fsid);
|
||||
memcpy(&client->fsid, fsid, sizeof(*fsid));
|
||||
ceph_debugfs_client_init(client);
|
||||
client->have_fsid = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -8,8 +8,8 @@
|
||||
|
||||
#include <linux/ceph/mon_client.h>
|
||||
#include <linux/ceph/libceph.h>
|
||||
#include <linux/ceph/debugfs.h>
|
||||
#include <linux/ceph/decode.h>
|
||||
|
||||
#include <linux/ceph/auth.h>
|
||||
|
||||
/*
|
||||
@ -340,8 +340,19 @@ static void ceph_monc_handle_map(struct ceph_mon_client *monc,
|
||||
client->monc.monmap = monmap;
|
||||
kfree(old);
|
||||
|
||||
if (!client->have_fsid) {
|
||||
client->have_fsid = true;
|
||||
mutex_unlock(&monc->mutex);
|
||||
/*
|
||||
* do debugfs initialization without mutex to avoid
|
||||
* creating a locking dependency
|
||||
*/
|
||||
ceph_debugfs_client_init(client);
|
||||
goto out_unlocked;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&monc->mutex);
|
||||
out_unlocked:
|
||||
wake_up_all(&client->auth_wq);
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,10 @@
|
||||
OUTPUT := ./
|
||||
ifeq ("$(origin O)", "command line")
|
||||
ifneq ($(O),)
|
||||
OUTPUT := $(O)/
|
||||
endif
|
||||
endif
|
||||
|
||||
MAN1_TXT= \
|
||||
$(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
|
||||
$(wildcard perf-*.txt)) \
|
||||
@ -6,10 +13,11 @@ MAN5_TXT=
|
||||
MAN7_TXT=
|
||||
|
||||
MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT)
|
||||
MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT))
|
||||
MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT))
|
||||
_MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT))
|
||||
_MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT))
|
||||
|
||||
DOC_HTML=$(MAN_HTML)
|
||||
MAN_XML=$(addprefix $(OUTPUT),$(_MAN_XML))
|
||||
MAN_HTML=$(addprefix $(OUTPUT),$(_MAN_HTML))
|
||||
|
||||
ARTICLES =
|
||||
# with their own formatting rules.
|
||||
@ -18,11 +26,17 @@ API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technica
|
||||
SP_ARTICLES += $(API_DOCS)
|
||||
SP_ARTICLES += technical/api-index
|
||||
|
||||
DOC_HTML += $(patsubst %,%.html,$(ARTICLES) $(SP_ARTICLES))
|
||||
_DOC_HTML = $(_MAN_HTML)
|
||||
_DOC_HTML+=$(patsubst %,%.html,$(ARTICLES) $(SP_ARTICLES))
|
||||
DOC_HTML=$(addprefix $(OUTPUT),$(_DOC_HTML))
|
||||
|
||||
DOC_MAN1=$(patsubst %.txt,%.1,$(MAN1_TXT))
|
||||
DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT))
|
||||
DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT))
|
||||
_DOC_MAN1=$(patsubst %.txt,%.1,$(MAN1_TXT))
|
||||
_DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT))
|
||||
_DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT))
|
||||
|
||||
DOC_MAN1=$(addprefix $(OUTPUT),$(_DOC_MAN1))
|
||||
DOC_MAN5=$(addprefix $(OUTPUT),$(_DOC_MAN5))
|
||||
DOC_MAN7=$(addprefix $(OUTPUT),$(_DOC_MAN7))
|
||||
|
||||
# Make the path relative to DESTDIR, not prefix
|
||||
ifndef DESTDIR
|
||||
@ -150,9 +164,9 @@ man1: $(DOC_MAN1)
|
||||
man5: $(DOC_MAN5)
|
||||
man7: $(DOC_MAN7)
|
||||
|
||||
info: perf.info perfman.info
|
||||
info: $(OUTPUT)perf.info $(OUTPUT)perfman.info
|
||||
|
||||
pdf: user-manual.pdf
|
||||
pdf: $(OUTPUT)user-manual.pdf
|
||||
|
||||
install: install-man
|
||||
|
||||
@ -166,7 +180,7 @@ install-man: man
|
||||
|
||||
install-info: info
|
||||
$(INSTALL) -d -m 755 $(DESTDIR)$(infodir)
|
||||
$(INSTALL) -m 644 perf.info perfman.info $(DESTDIR)$(infodir)
|
||||
$(INSTALL) -m 644 $(OUTPUT)perf.info $(OUTPUT)perfman.info $(DESTDIR)$(infodir)
|
||||
if test -r $(DESTDIR)$(infodir)/dir; then \
|
||||
$(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perf.info ;\
|
||||
$(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perfman.info ;\
|
||||
@ -176,7 +190,7 @@ install-info: info
|
||||
|
||||
install-pdf: pdf
|
||||
$(INSTALL) -d -m 755 $(DESTDIR)$(pdfdir)
|
||||
$(INSTALL) -m 644 user-manual.pdf $(DESTDIR)$(pdfdir)
|
||||
$(INSTALL) -m 644 $(OUTPUT)user-manual.pdf $(DESTDIR)$(pdfdir)
|
||||
|
||||
#install-html: html
|
||||
# '$(SHELL_PATH_SQ)' ./install-webdoc.sh $(DESTDIR)$(htmldir)
|
||||
@ -189,14 +203,14 @@ install-pdf: pdf
|
||||
#
|
||||
# Determine "include::" file references in asciidoc files.
|
||||
#
|
||||
doc.dep : $(wildcard *.txt) build-docdep.perl
|
||||
$(OUTPUT)doc.dep : $(wildcard *.txt) build-docdep.perl
|
||||
$(QUIET_GEN)$(RM) $@+ $@ && \
|
||||
$(PERL_PATH) ./build-docdep.perl >$@+ $(QUIET_STDERR) && \
|
||||
mv $@+ $@
|
||||
|
||||
-include doc.dep
|
||||
-include $(OUPTUT)doc.dep
|
||||
|
||||
cmds_txt = cmds-ancillaryinterrogators.txt \
|
||||
_cmds_txt = cmds-ancillaryinterrogators.txt \
|
||||
cmds-ancillarymanipulators.txt \
|
||||
cmds-mainporcelain.txt \
|
||||
cmds-plumbinginterrogators.txt \
|
||||
@ -205,32 +219,36 @@ cmds_txt = cmds-ancillaryinterrogators.txt \
|
||||
cmds-synchelpers.txt \
|
||||
cmds-purehelpers.txt \
|
||||
cmds-foreignscminterface.txt
|
||||
cmds_txt=$(addprefix $(OUTPUT),$(_cmds_txt))
|
||||
|
||||
$(cmds_txt): cmd-list.made
|
||||
$(cmds_txt): $(OUTPUT)cmd-list.made
|
||||
|
||||
cmd-list.made: cmd-list.perl ../command-list.txt $(MAN1_TXT)
|
||||
$(OUTPUT)cmd-list.made: cmd-list.perl ../command-list.txt $(MAN1_TXT)
|
||||
$(QUIET_GEN)$(RM) $@ && \
|
||||
$(PERL_PATH) ./cmd-list.perl ../command-list.txt $(QUIET_STDERR) && \
|
||||
date >$@
|
||||
|
||||
clean:
|
||||
$(RM) *.xml *.xml+ *.html *.html+ *.1 *.5 *.7
|
||||
$(RM) *.texi *.texi+ *.texi++ perf.info perfman.info
|
||||
$(RM) howto-index.txt howto/*.html doc.dep
|
||||
$(RM) technical/api-*.html technical/api-index.txt
|
||||
$(RM) $(cmds_txt) *.made
|
||||
$(RM) $(MAN_XML) $(addsuffix +,$(MAN_XML))
|
||||
$(RM) $(MAN_HTML) $(addsuffix +,$(MAN_HTML))
|
||||
$(RM) $(DOC_HTML) $(DOC_MAN1) $(DOC_MAN5) $(DOC_MAN7)
|
||||
$(RM) $(OUTPUT)*.texi $(OUTPUT)*.texi+ $(OUTPUT)*.texi++
|
||||
$(RM) $(OUTPUT)perf.info $(OUTPUT)perfman.info
|
||||
$(RM) $(OUTPUT)howto-index.txt $(OUTPUT)howto/*.html $(OUTPUT)doc.dep
|
||||
$(RM) $(OUTPUT)technical/api-*.html $(OUTPUT)technical/api-index.txt
|
||||
$(RM) $(cmds_txt) $(OUTPUT)*.made
|
||||
|
||||
$(MAN_HTML): %.html : %.txt
|
||||
$(MAN_HTML): $(OUTPUT)%.html : %.txt
|
||||
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
|
||||
$(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf \
|
||||
$(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \
|
||||
mv $@+ $@
|
||||
|
||||
%.1 %.5 %.7 : %.xml
|
||||
$(OUTPUT)%.1 $(OUTPUT)%.5 $(OUTPUT)%.7 : $(OUTPUT)%.xml
|
||||
$(QUIET_XMLTO)$(RM) $@ && \
|
||||
xmlto -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
|
||||
xmlto -o $(OUTPUT) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
|
||||
|
||||
%.xml : %.txt
|
||||
$(OUTPUT)%.xml : %.txt
|
||||
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
|
||||
$(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \
|
||||
$(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \
|
||||
@ -239,25 +257,25 @@ $(MAN_HTML): %.html : %.txt
|
||||
XSLT = docbook.xsl
|
||||
XSLTOPTS = --xinclude --stringparam html.stylesheet docbook-xsl.css
|
||||
|
||||
user-manual.html: user-manual.xml
|
||||
$(OUTPUT)user-manual.html: $(OUTPUT)user-manual.xml
|
||||
$(QUIET_XSLTPROC)xsltproc $(XSLTOPTS) -o $@ $(XSLT) $<
|
||||
|
||||
perf.info: user-manual.texi
|
||||
$(QUIET_MAKEINFO)$(MAKEINFO) --no-split -o $@ user-manual.texi
|
||||
$(OUTPUT)perf.info: $(OUTPUT)user-manual.texi
|
||||
$(QUIET_MAKEINFO)$(MAKEINFO) --no-split -o $@ $(OUTPUT)user-manual.texi
|
||||
|
||||
user-manual.texi: user-manual.xml
|
||||
$(OUTPUT)user-manual.texi: $(OUTPUT)user-manual.xml
|
||||
$(QUIET_DB2TEXI)$(RM) $@+ $@ && \
|
||||
$(DOCBOOK2X_TEXI) user-manual.xml --encoding=UTF-8 --to-stdout >$@++ && \
|
||||
$(DOCBOOK2X_TEXI) $(OUTPUT)user-manual.xml --encoding=UTF-8 --to-stdout >$@++ && \
|
||||
$(PERL_PATH) fix-texi.perl <$@++ >$@+ && \
|
||||
rm $@++ && \
|
||||
mv $@+ $@
|
||||
|
||||
user-manual.pdf: user-manual.xml
|
||||
$(OUTPUT)user-manual.pdf: $(OUTPUT)user-manual.xml
|
||||
$(QUIET_DBLATEX)$(RM) $@+ $@ && \
|
||||
$(DBLATEX) -o $@+ -p /etc/asciidoc/dblatex/asciidoc-dblatex.xsl -s /etc/asciidoc/dblatex/asciidoc-dblatex.sty $< && \
|
||||
mv $@+ $@
|
||||
|
||||
perfman.texi: $(MAN_XML) cat-texi.perl
|
||||
$(OUTPUT)perfman.texi: $(MAN_XML) cat-texi.perl
|
||||
$(QUIET_DB2TEXI)$(RM) $@+ $@ && \
|
||||
($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --encoding=UTF-8 \
|
||||
--to-stdout $(xml) &&) true) > $@++ && \
|
||||
@ -265,7 +283,7 @@ perfman.texi: $(MAN_XML) cat-texi.perl
|
||||
rm $@++ && \
|
||||
mv $@+ $@
|
||||
|
||||
perfman.info: perfman.texi
|
||||
$(OUTPUT)perfman.info: $(OUTPUT)perfman.texi
|
||||
$(QUIET_MAKEINFO)$(MAKEINFO) --no-split --no-validate $*.texi
|
||||
|
||||
$(patsubst %.txt,%.texi,$(MAN_TXT)): %.texi : %.xml
|
||||
|
@ -794,7 +794,6 @@ help:
|
||||
@echo ' quick-install-html - install the html documentation quickly'
|
||||
@echo ''
|
||||
@echo 'Perf maintainer targets:'
|
||||
@echo ' distclean - alias to clean'
|
||||
@echo ' clean - clean all binary objects and build output'
|
||||
|
||||
doc:
|
||||
|
@ -4,3 +4,9 @@
|
||||
#define Lmemcpy_c globl memcpy_c; memcpy_c
|
||||
#define Lmemcpy_c_e globl memcpy_c_e; memcpy_c_e
|
||||
#include "../../../arch/x86/lib/memcpy_64.S"
|
||||
/*
|
||||
* We need to provide note.GNU-stack section, saying that we want
|
||||
* NOT executable stack. Otherwise the final linking will assume that
|
||||
* the ELF stack should not be restricted at all and set it RWX.
|
||||
*/
|
||||
.section .note.GNU-stack,"",@progbits
|
||||
|
@ -4,3 +4,10 @@
|
||||
#define Lmemset_c globl memset_c; memset_c
|
||||
#define Lmemset_c_e globl memset_c_e; memset_c_e
|
||||
#include "../../../arch/x86/lib/memset_64.S"
|
||||
|
||||
/*
|
||||
* We need to provide note.GNU-stack section, saying that we want
|
||||
* NOT executable stack. Otherwise the final linking will assume that
|
||||
* the ELF stack should not be restricted at all and set it RWX.
|
||||
*/
|
||||
.section .note.GNU-stack,"",@progbits
|
||||
|
@ -58,7 +58,7 @@ static struct {
|
||||
struct perf_probe_event events[MAX_PROBES];
|
||||
struct strlist *dellist;
|
||||
struct line_range line_range;
|
||||
const char *target_module;
|
||||
const char *target;
|
||||
int max_probe_points;
|
||||
struct strfilter *filter;
|
||||
} params;
|
||||
@ -246,7 +246,7 @@ static const struct option options[] = {
|
||||
"file", "vmlinux pathname"),
|
||||
OPT_STRING('s', "source", &symbol_conf.source_prefix,
|
||||
"directory", "path to kernel source"),
|
||||
OPT_STRING('m', "module", ¶ms.target_module,
|
||||
OPT_STRING('m', "module", ¶ms.target,
|
||||
"modname|path",
|
||||
"target module name (for online) or path (for offline)"),
|
||||
#endif
|
||||
@ -333,7 +333,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
|
||||
if (!params.filter)
|
||||
params.filter = strfilter__new(DEFAULT_FUNC_FILTER,
|
||||
NULL);
|
||||
ret = show_available_funcs(params.target_module,
|
||||
ret = show_available_funcs(params.target,
|
||||
params.filter);
|
||||
strfilter__delete(params.filter);
|
||||
if (ret < 0)
|
||||
@ -354,7 +354,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
|
||||
usage_with_options(probe_usage, options);
|
||||
}
|
||||
|
||||
ret = show_line_range(¶ms.line_range, params.target_module);
|
||||
ret = show_line_range(¶ms.line_range, params.target);
|
||||
if (ret < 0)
|
||||
pr_err(" Error: Failed to show lines. (%d)\n", ret);
|
||||
return ret;
|
||||
@ -371,7 +371,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
|
||||
|
||||
ret = show_available_vars(params.events, params.nevents,
|
||||
params.max_probe_points,
|
||||
params.target_module,
|
||||
params.target,
|
||||
params.filter,
|
||||
params.show_ext_vars);
|
||||
strfilter__delete(params.filter);
|
||||
@ -393,7 +393,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
|
||||
if (params.nevents) {
|
||||
ret = add_perf_probe_events(params.events, params.nevents,
|
||||
params.max_probe_points,
|
||||
params.target_module,
|
||||
params.target,
|
||||
params.force_add);
|
||||
if (ret < 0) {
|
||||
pr_err(" Error: Failed to add events. (%d)\n", ret);
|
||||
|
@ -386,7 +386,7 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
|
||||
{
|
||||
struct stat st;
|
||||
int flags;
|
||||
int err, output;
|
||||
int err, output, feat;
|
||||
unsigned long waking = 0;
|
||||
const bool forks = argc > 0;
|
||||
struct machine *machine;
|
||||
@ -453,8 +453,14 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
|
||||
|
||||
rec->session = session;
|
||||
|
||||
if (!rec->no_buildid)
|
||||
perf_header__set_feat(&session->header, HEADER_BUILD_ID);
|
||||
for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++)
|
||||
perf_header__set_feat(&session->header, feat);
|
||||
|
||||
if (rec->no_buildid)
|
||||
perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
|
||||
|
||||
if (!have_tracepoints(&evsel_list->entries))
|
||||
perf_header__clear_feat(&session->header, HEADER_TRACE_INFO);
|
||||
|
||||
if (!rec->file_new) {
|
||||
err = perf_session__read_header(session, output);
|
||||
@ -462,22 +468,6 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
|
||||
goto out_delete_session;
|
||||
}
|
||||
|
||||
if (have_tracepoints(&evsel_list->entries))
|
||||
perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
|
||||
|
||||
perf_header__set_feat(&session->header, HEADER_HOSTNAME);
|
||||
perf_header__set_feat(&session->header, HEADER_OSRELEASE);
|
||||
perf_header__set_feat(&session->header, HEADER_ARCH);
|
||||
perf_header__set_feat(&session->header, HEADER_CPUDESC);
|
||||
perf_header__set_feat(&session->header, HEADER_NRCPUS);
|
||||
perf_header__set_feat(&session->header, HEADER_EVENT_DESC);
|
||||
perf_header__set_feat(&session->header, HEADER_CMDLINE);
|
||||
perf_header__set_feat(&session->header, HEADER_VERSION);
|
||||
perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY);
|
||||
perf_header__set_feat(&session->header, HEADER_TOTAL_MEM);
|
||||
perf_header__set_feat(&session->header, HEADER_NUMA_TOPOLOGY);
|
||||
perf_header__set_feat(&session->header, HEADER_CPUID);
|
||||
|
||||
if (forks) {
|
||||
err = perf_evlist__prepare_workload(evsel_list, opts, argv);
|
||||
if (err < 0) {
|
||||
|
@ -576,6 +576,8 @@ static void nsec_printout(int cpu, struct perf_evsel *evsel, double avg)
|
||||
if (perf_evsel__match(evsel, SOFTWARE, SW_TASK_CLOCK))
|
||||
fprintf(output, " # %8.3f CPUs utilized ",
|
||||
avg / avg_stats(&walltime_nsecs_stats));
|
||||
else
|
||||
fprintf(output, " ");
|
||||
}
|
||||
|
||||
/* used for get_ratio_color() */
|
||||
@ -844,12 +846,18 @@ static void abs_printout(int cpu, struct perf_evsel *evsel, double avg)
|
||||
|
||||
fprintf(output, " # %8.3f GHz ", ratio);
|
||||
} else if (runtime_nsecs_stats[cpu].n != 0) {
|
||||
char unit = 'M';
|
||||
|
||||
total = avg_stats(&runtime_nsecs_stats[cpu]);
|
||||
|
||||
if (total)
|
||||
ratio = 1000.0 * avg / total;
|
||||
if (ratio < 0.001) {
|
||||
ratio *= 1000;
|
||||
unit = 'K';
|
||||
}
|
||||
|
||||
fprintf(output, " # %8.3f M/sec ", ratio);
|
||||
fprintf(output, " # %8.3f %c/sec ", ratio, unit);
|
||||
} else {
|
||||
fprintf(output, " ");
|
||||
}
|
||||
|
@ -554,7 +554,7 @@ static int perf_event__process_kernel_mmap(struct perf_tool *tool __used,
|
||||
|
||||
is_kernel_mmap = memcmp(event->mmap.filename,
|
||||
kmmap_prefix,
|
||||
strlen(kmmap_prefix)) == 0;
|
||||
strlen(kmmap_prefix) - 1) == 0;
|
||||
if (event->mmap.filename[0] == '/' ||
|
||||
(!is_kernel_mmap && event->mmap.filename[0] == '[')) {
|
||||
|
||||
|
@ -97,9 +97,9 @@ void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
|
||||
++evlist->nr_entries;
|
||||
}
|
||||
|
||||
static void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
|
||||
struct list_head *list,
|
||||
int nr_entries)
|
||||
void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
|
||||
struct list_head *list,
|
||||
int nr_entries)
|
||||
{
|
||||
list_splice_tail(list, &evlist->entries);
|
||||
evlist->nr_entries += nr_entries;
|
||||
|
@ -117,4 +117,9 @@ u16 perf_evlist__id_hdr_size(const struct perf_evlist *evlist);
|
||||
|
||||
bool perf_evlist__valid_sample_type(const struct perf_evlist *evlist);
|
||||
bool perf_evlist__valid_sample_id_all(const struct perf_evlist *evlist);
|
||||
|
||||
void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
|
||||
struct list_head *list,
|
||||
int nr_entries);
|
||||
|
||||
#endif /* __PERF_EVLIST_H */
|
||||
|
@ -463,6 +463,7 @@ int perf_event__parse_sample(const union perf_event *event, u64 type,
|
||||
memset(data, 0, sizeof(*data));
|
||||
data->cpu = data->pid = data->tid = -1;
|
||||
data->stream_id = data->id = data->time = -1ULL;
|
||||
data->period = 1;
|
||||
|
||||
if (event->header.type != PERF_RECORD_SAMPLE) {
|
||||
if (!sample_id_all)
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
enum {
|
||||
HEADER_RESERVED = 0, /* always cleared */
|
||||
HEADER_FIRST_FEATURE = 1,
|
||||
HEADER_TRACE_INFO = 1,
|
||||
HEADER_BUILD_ID,
|
||||
|
||||
|
@ -273,10 +273,10 @@ static int add_module_to_probe_trace_events(struct probe_trace_event *tevs,
|
||||
/* Try to find perf_probe_event with debuginfo */
|
||||
static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
|
||||
struct probe_trace_event **tevs,
|
||||
int max_tevs, const char *module)
|
||||
int max_tevs, const char *target)
|
||||
{
|
||||
bool need_dwarf = perf_probe_event_need_dwarf(pev);
|
||||
struct debuginfo *dinfo = open_debuginfo(module);
|
||||
struct debuginfo *dinfo = open_debuginfo(target);
|
||||
int ntevs, ret = 0;
|
||||
|
||||
if (!dinfo) {
|
||||
@ -295,9 +295,9 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
|
||||
|
||||
if (ntevs > 0) { /* Succeeded to find trace events */
|
||||
pr_debug("find %d probe_trace_events.\n", ntevs);
|
||||
if (module)
|
||||
if (target)
|
||||
ret = add_module_to_probe_trace_events(*tevs, ntevs,
|
||||
module);
|
||||
target);
|
||||
return ret < 0 ? ret : ntevs;
|
||||
}
|
||||
|
||||
@ -1796,14 +1796,14 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
|
||||
|
||||
static int convert_to_probe_trace_events(struct perf_probe_event *pev,
|
||||
struct probe_trace_event **tevs,
|
||||
int max_tevs, const char *module)
|
||||
int max_tevs, const char *target)
|
||||
{
|
||||
struct symbol *sym;
|
||||
int ret = 0, i;
|
||||
struct probe_trace_event *tev;
|
||||
|
||||
/* Convert perf_probe_event with debuginfo */
|
||||
ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, module);
|
||||
ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, target);
|
||||
if (ret != 0)
|
||||
return ret; /* Found in debuginfo or got an error */
|
||||
|
||||
@ -1819,8 +1819,8 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (module) {
|
||||
tev->point.module = strdup(module);
|
||||
if (target) {
|
||||
tev->point.module = strdup(target);
|
||||
if (tev->point.module == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
@ -1884,7 +1884,7 @@ struct __event_package {
|
||||
};
|
||||
|
||||
int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
|
||||
int max_tevs, const char *module, bool force_add)
|
||||
int max_tevs, const char *target, bool force_add)
|
||||
{
|
||||
int i, j, ret;
|
||||
struct __event_package *pkgs;
|
||||
@ -1907,7 +1907,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
|
||||
ret = convert_to_probe_trace_events(pkgs[i].pev,
|
||||
&pkgs[i].tevs,
|
||||
max_tevs,
|
||||
module);
|
||||
target);
|
||||
if (ret < 0)
|
||||
goto end;
|
||||
pkgs[i].ntevs = ret;
|
||||
@ -2063,7 +2063,7 @@ static int filter_available_functions(struct map *map __unused,
|
||||
return 1;
|
||||
}
|
||||
|
||||
int show_available_funcs(const char *module, struct strfilter *_filter)
|
||||
int show_available_funcs(const char *target, struct strfilter *_filter)
|
||||
{
|
||||
struct map *map;
|
||||
int ret;
|
||||
@ -2074,9 +2074,9 @@ int show_available_funcs(const char *module, struct strfilter *_filter)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
map = kernel_get_module_map(module);
|
||||
map = kernel_get_module_map(target);
|
||||
if (!map) {
|
||||
pr_err("Failed to find %s map.\n", (module) ? : "kernel");
|
||||
pr_err("Failed to find %s map.\n", (target) ? : "kernel");
|
||||
return -EINVAL;
|
||||
}
|
||||
available_func_filter = _filter;
|
||||
|
Loading…
Reference in New Issue
Block a user