2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08: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:
Ingo Molnar 2012-02-07 10:00:06 +01:00
commit 52fce956a7
94 changed files with 585 additions and 494 deletions

View File

@ -102,9 +102,12 @@ X!Iinclude/linux/kobject.h
!Iinclude/linux/device.h !Iinclude/linux/device.h
</sect1> </sect1>
<sect1><title>Device Drivers Base</title> <sect1><title>Device Drivers Base</title>
!Idrivers/base/init.c
!Edrivers/base/driver.c !Edrivers/base/driver.c
!Edrivers/base/core.c !Edrivers/base/core.c
!Edrivers/base/syscore.c
!Edrivers/base/class.c !Edrivers/base/class.c
!Idrivers/base/node.c
!Edrivers/base/firmware_class.c !Edrivers/base/firmware_class.c
!Edrivers/base/transport_class.c !Edrivers/base/transport_class.c
<!-- Cannot be included, because <!-- Cannot be included, because
@ -113,13 +116,18 @@ X!Iinclude/linux/kobject.h
exceed allowed 44 characters maximum exceed allowed 44 characters maximum
X!Edrivers/base/attribute_container.c X!Edrivers/base/attribute_container.c
--> -->
!Edrivers/base/sys.c !Edrivers/base/dd.c
<!-- <!--
X!Edrivers/base/interface.c X!Edrivers/base/interface.c
--> -->
!Iinclude/linux/platform_device.h !Iinclude/linux/platform_device.h
!Edrivers/base/platform.c !Edrivers/base/platform.c
!Edrivers/base/bus.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>
<sect1><title>Device Drivers Power Management</title> <sect1><title>Device Drivers Power Management</title>
!Edrivers/base/power/main.c !Edrivers/base/power/main.c
@ -219,7 +227,7 @@ X!Isound/sound_firmware.c
<chapter id="uart16x50"> <chapter id="uart16x50">
<title>16x50 UART Driver</title> <title>16x50 UART Driver</title>
!Edrivers/tty/serial/serial_core.c !Edrivers/tty/serial/serial_core.c
!Edrivers/tty/serial/8250.c !Edrivers/tty/serial/8250/8250.c
</chapter> </chapter>
<chapter id="fbdev"> <chapter id="fbdev">

View File

@ -159,7 +159,7 @@ S: Maintained
F: drivers/net/ethernet/realtek/r8169.c F: drivers/net/ethernet/realtek/r8169.c
8250/16?50 (AND CLONE UARTS) SERIAL DRIVER 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 L: linux-serial@vger.kernel.org
W: http://serial.sourceforge.net W: http://serial.sourceforge.net
S: Maintained S: Maintained
@ -1783,9 +1783,9 @@ X: net/wireless/wext*
CHAR and MISC DRIVERS CHAR and MISC DRIVERS
M: Arnd Bergmann <arnd@arndb.de> 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 T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
S: Maintained S: Supported
F: drivers/char/* F: drivers/char/*
F: drivers/misc/* F: drivers/misc/*
@ -2320,7 +2320,7 @@ F: lib/lru_cache.c
F: Documentation/blockdev/drbd/ F: Documentation/blockdev/drbd/
DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS 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 T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git
S: Supported S: Supported
F: Documentation/kobject.txt F: Documentation/kobject.txt
@ -6276,15 +6276,15 @@ S: Maintained
F: arch/alpha/kernel/srm_env.c F: arch/alpha/kernel/srm_env.c
STABLE BRANCH STABLE BRANCH
M: Greg Kroah-Hartman <greg@kroah.com> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
L: stable@vger.kernel.org L: stable@vger.kernel.org
S: Maintained S: Supported
STAGING SUBSYSTEM 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 T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
L: devel@driverdev.osuosl.org L: devel@driverdev.osuosl.org
S: Maintained S: Supported
F: drivers/staging/ F: drivers/staging/
STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS
@ -6669,8 +6669,8 @@ S: Maintained
K: ^Subject:.*(?i)trivial K: ^Subject:.*(?i)trivial
TTY LAYER TTY LAYER
M: Greg Kroah-Hartman <gregkh@suse.de> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
S: Maintained S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git
F: drivers/tty/ F: drivers/tty/
F: drivers/tty/serial/serial_core.c F: drivers/tty/serial/serial_core.c
@ -6958,7 +6958,7 @@ S: Maintained
F: drivers/usb/serial/digi_acceleport.c F: drivers/usb/serial/digi_acceleport.c
USB SERIAL DRIVER USB SERIAL DRIVER
M: Greg Kroah-Hartman <gregkh@suse.de> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Supported S: Supported
F: Documentation/usb/usb-serial.txt F: Documentation/usb/usb-serial.txt
@ -6973,9 +6973,8 @@ S: Maintained
F: drivers/usb/serial/empeg.c F: drivers/usb/serial/empeg.c
USB SERIAL KEYSPAN DRIVER USB SERIAL KEYSPAN DRIVER
M: Greg Kroah-Hartman <greg@kroah.com> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
W: http://www.kroah.com/linux/
S: Maintained S: Maintained
F: drivers/usb/serial/*keyspan* F: drivers/usb/serial/*keyspan*
@ -7003,7 +7002,7 @@ F: Documentation/video4linux/sn9c102.txt
F: drivers/media/video/sn9c102/ F: drivers/media/video/sn9c102/
USB SUBSYSTEM USB SUBSYSTEM
M: Greg Kroah-Hartman <gregkh@suse.de> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
W: http://www.linux-usb.org W: http://www.linux-usb.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git 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) USERSPACE I/O (UIO)
M: "Hans J. Koch" <hjk@hansjkoch.de> M: "Hans J. Koch" <hjk@hansjkoch.de>
M: Greg Kroah-Hartman <gregkh@suse.de> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
S: Maintained S: Maintained
F: Documentation/DocBook/uio-howto.tmpl F: Documentation/DocBook/uio-howto.tmpl
F: drivers/uio/ F: drivers/uio/

View File

@ -26,7 +26,6 @@
#include <linux/cache.h> #include <linux/cache.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/cpu.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/entry.h> #include <asm/entry.h>
#include <asm/cpuinfo.h> #include <asm/cpuinfo.h>
@ -227,23 +226,5 @@ static int __init setup_bus_notifier(void)
return 0; return 0;
} }
arch_initcall(setup_bus_notifier); 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);

View File

@ -33,6 +33,7 @@ config SPARC
config SPARC32 config SPARC32
def_bool !64BIT def_bool !64BIT
select GENERIC_ATOMIC64 select GENERIC_ATOMIC64
select CLZ_TAB
config SPARC64 config SPARC64
def_bool 64BIT def_bool 64BIT

View File

@ -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, the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ 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 .text
.align 4 .align 4
.global .udiv
.globl __divdi3 .globl __divdi3
__divdi3: __divdi3:
save %sp,-104,%sp save %sp,-104,%sp

View File

@ -145,13 +145,13 @@ extern void __add_wrong_size(void)
#ifdef __HAVE_ARCH_CMPXCHG #ifdef __HAVE_ARCH_CMPXCHG
#define cmpxchg(ptr, old, new) \ #define cmpxchg(ptr, old, new) \
__cmpxchg((ptr), (old), (new), sizeof(*ptr)) __cmpxchg(ptr, old, new, sizeof(*(ptr)))
#define sync_cmpxchg(ptr, old, new) \ #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) \ #define cmpxchg_local(ptr, old, new) \
__cmpxchg_local((ptr), (old), (new), sizeof(*ptr)) __cmpxchg_local(ptr, old, new, sizeof(*(ptr)))
#endif #endif
/* /*

View File

@ -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); struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
int idx = event->hw.idx; int idx = event->hw.idx;
if (WARN_ON_ONCE(!(event->hw.state & PERF_HES_STOPPED)))
return;
if (WARN_ON_ONCE(idx == -1)) if (WARN_ON_ONCE(idx == -1))
return; return;

View File

@ -439,7 +439,6 @@ void intel_pmu_pebs_enable(struct perf_event *event)
hwc->config &= ~ARCH_PERFMON_EVENTSEL_INT; hwc->config &= ~ARCH_PERFMON_EVENTSEL_INT;
cpuc->pebs_enabled |= 1ULL << hwc->idx; cpuc->pebs_enabled |= 1ULL << hwc->idx;
WARN_ON_ONCE(cpuc->enabled);
if (x86_pmu.intel_cap.pebs_trap && event->attr.precise_ip > 1) if (x86_pmu.intel_cap.pebs_trap && event->attr.precise_ip > 1)
intel_pmu_lbr_enable(event); intel_pmu_lbr_enable(event);

View File

@ -72,8 +72,6 @@ void intel_pmu_lbr_enable(struct perf_event *event)
if (!x86_pmu.lbr_nr) if (!x86_pmu.lbr_nr)
return; return;
WARN_ON_ONCE(cpuc->enabled);
/* /*
* Reset the LBR stack if we changed task context to * Reset the LBR stack if we changed task context to
* avoid data leaks. * avoid data leaks.

View File

@ -252,7 +252,8 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
unsigned short ss; unsigned short ss;
unsigned long sp; unsigned long sp;
#endif #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 #ifdef CONFIG_PREEMPT
printk("PREEMPT "); printk("PREEMPT ");
#endif #endif

View File

@ -269,11 +269,11 @@ void show_registers(struct pt_regs *regs)
unsigned char c; unsigned char c;
u8 *ip; u8 *ip;
printk(KERN_EMERG "Stack:\n"); printk(KERN_DEFAULT "Stack:\n");
show_stack_log_lvl(NULL, regs, (unsigned long *)sp, 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; ip = (u8 *)regs->ip - code_prologue;
if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) { if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {

View File

@ -39,6 +39,14 @@ static int reboot_mode;
enum reboot_type reboot_type = BOOT_ACPI; enum reboot_type reboot_type = BOOT_ACPI;
int reboot_force; 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) #if defined(CONFIG_X86_32) && defined(CONFIG_SMP)
static int reboot_cpu = -1; static int reboot_cpu = -1;
#endif #endif
@ -67,6 +75,12 @@ bool port_cf9_safe = false;
static int __init reboot_setup(char *str) static int __init reboot_setup(char *str)
{ {
for (;;) { for (;;) {
/* Having anything passed on the command line via
* reboot= will cause us to disable DMI checking
* below.
*/
reboot_default = 0;
switch (*str) { switch (*str) {
case 'w': case 'w':
reboot_mode = 0x1234; reboot_mode = 0x1234;
@ -295,14 +309,6 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
DMI_MATCH(DMI_BOARD_NAME, "P4S800"), 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 */ { /* Handle reboot issue on Acer Aspire one */
.callback = set_kbd_reboot, .callback = set_kbd_reboot,
.ident = "Acer Aspire One A110", .ident = "Acer Aspire One A110",
@ -316,7 +322,12 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
static int __init reboot_init(void) static int __init reboot_init(void)
{ {
/* 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); dmi_check_system(reboot_dmi_table);
}
return 0; return 0;
} }
core_initcall(reboot_init); 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) static int __init pci_reboot_init(void)
{ {
/* 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); dmi_check_system(pci_reboot_dmi_table);
}
return 0; return 0;
} }
core_initcall(pci_reboot_init); core_initcall(pci_reboot_init);

View File

@ -673,7 +673,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
stackend = end_of_stack(tsk); stackend = end_of_stack(tsk);
if (tsk != &init_task && *stackend != STACK_END_MAGIC) 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.cr2 = address;
tsk->thread.trap_no = 14; tsk->thread.trap_no = 14;
@ -684,7 +684,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
sig = 0; sig = 0;
/* Executive summary in case the body of the oops scrolled away */ /* 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); oops_end(flags, regs, sig);
} }

View File

@ -380,6 +380,7 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
rbdc = __rbd_client_find(opt); rbdc = __rbd_client_find(opt);
if (rbdc) { if (rbdc) {
ceph_destroy_options(opt); ceph_destroy_options(opt);
kfree(rbd_opts);
/* using an existing client */ /* using an existing client */
kref_get(&rbdc->kref); kref_get(&rbdc->kref);
@ -406,15 +407,15 @@ done_err:
/* /*
* Destroy ceph client * Destroy ceph client
*
* Caller must hold node_lock.
*/ */
static void rbd_client_release(struct kref *kref) static void rbd_client_release(struct kref *kref)
{ {
struct rbd_client *rbdc = container_of(kref, struct rbd_client, kref); struct rbd_client *rbdc = container_of(kref, struct rbd_client, kref);
dout("rbd_release_client %p\n", rbdc); dout("rbd_release_client %p\n", rbdc);
spin_lock(&node_lock);
list_del(&rbdc->node); list_del(&rbdc->node);
spin_unlock(&node_lock);
ceph_destroy_client(rbdc->client); ceph_destroy_client(rbdc->client);
kfree(rbdc->rbd_opts); 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) static void rbd_put_client(struct rbd_device *rbd_dev)
{ {
spin_lock(&node_lock);
kref_put(&rbd_dev->rbd_client->kref, rbd_client_release); kref_put(&rbd_dev->rbd_client->kref, rbd_client_release);
spin_unlock(&node_lock);
rbd_dev->rbd_client = NULL; rbd_dev->rbd_client = NULL;
rbd_dev->client = NULL; rbd_dev->client = NULL;
} }

View File

@ -263,6 +263,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card)
static char ohci_driver_name[] = KBUILD_MODNAME; static char ohci_driver_name[] = KBUILD_MODNAME;
#define PCI_DEVICE_ID_AGERE_FW643 0x5901 #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_JMICRON_JMB38X_FW 0x2380
#define PCI_DEVICE_ID_TI_TSB12LV22 0x8009 #define PCI_DEVICE_ID_TI_TSB12LV22 0x8009
#define PCI_DEVICE_ID_TI_TSB12LV26 0x8020 #define PCI_DEVICE_ID_TI_TSB12LV26 0x8020
@ -289,6 +290,9 @@ static const struct {
{PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6, {PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6,
QUIRK_NO_MSI}, 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, {PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_FW, PCI_ANY_ID,
QUIRK_NO_MSI}, QUIRK_NO_MSI},
@ -299,7 +303,7 @@ static const struct {
QUIRK_NO_MSI}, QUIRK_NO_MSI},
{PCI_VENDOR_ID_RICOH, PCI_ANY_ID, PCI_ANY_ID, {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, {PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB12LV22, PCI_ANY_ID,
QUIRK_CYCLE_TIMER | QUIRK_RESET_PACKET | QUIRK_NO_1394A}, QUIRK_CYCLE_TIMER | QUIRK_RESET_PACKET | QUIRK_NO_1394A},

View File

@ -54,9 +54,10 @@ struct bit_entry {
int bit_table(struct drm_device *, u8 id, struct bit_entry *); int bit_table(struct drm_device *, u8 id, struct bit_entry *);
enum dcb_gpio_tag { enum dcb_gpio_tag {
DCB_GPIO_TVDAC0 = 0xc, DCB_GPIO_PANEL_POWER = 0x01,
DCB_GPIO_TVDAC0 = 0x0c,
DCB_GPIO_TVDAC1 = 0x2d, DCB_GPIO_TVDAC1 = 0x2d,
DCB_GPIO_PWM_FAN = 0x9, DCB_GPIO_PWM_FAN = 0x09,
DCB_GPIO_FAN_SENSE = 0x3d, DCB_GPIO_FAN_SENSE = 0x3d,
DCB_GPIO_UNUSED = 0xff DCB_GPIO_UNUSED = 0xff
}; };

View File

@ -219,6 +219,16 @@ nouveau_display_init(struct drm_device *dev)
if (ret) if (ret)
return 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); drm_kms_helper_poll_enable(dev);
/* enable hotplug interrupts */ /* enable hotplug interrupts */

View File

@ -124,7 +124,7 @@ MODULE_PARM_DESC(ctxfw, "Use external HUB/GPC ucode (fermi)\n");
int nouveau_ctxfw; int nouveau_ctxfw;
module_param_named(ctxfw, nouveau_ctxfw, int, 0400); 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; int nouveau_mxmdcb = 1;
module_param_named(mxmdcb, nouveau_mxmdcb, int, 0400); module_param_named(mxmdcb, nouveau_mxmdcb, int, 0400);

View File

@ -379,6 +379,25 @@ retry:
return 0; 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 static int
validate_list(struct nouveau_channel *chan, struct list_head *list, validate_list(struct nouveau_channel *chan, struct list_head *list,
struct drm_nouveau_gem_pushbuf_bo *pbbo, uint64_t user_pbbo_ptr) 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) { list_for_each_entry(nvbo, list, entry) {
struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; 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)) { if (unlikely(ret)) {
NV_ERROR(dev, "fail pre-validate sync\n"); NV_ERROR(dev, "fail pre-validate sync\n");
return ret; return ret;
@ -416,7 +435,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
return ret; return ret;
} }
ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan); ret = validate_sync(chan, nvbo);
if (unlikely(ret)) { if (unlikely(ret)) {
NV_ERROR(dev, "fail post-validate sync\n"); NV_ERROR(dev, "fail post-validate sync\n");
return ret; return ret;

View File

@ -656,7 +656,16 @@ nouveau_mxm_init(struct drm_device *dev)
if (mxm_shadow(dev, mxm[0])) { if (mxm_shadow(dev, mxm[0])) {
MXM_MSG(dev, "failed to locate valid SIS\n"); 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; return -EINVAL;
#else
return 0;
#endif
} }
MXM_MSG(dev, "MXMS Version %d.%d\n", MXM_MSG(dev, "MXMS Version %d.%d\n",

View File

@ -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 drm_nouveau_private *dev_priv = dev->dev_private;
struct nv50_pm_state *info; struct nv50_pm_state *info;
struct pll_lims pll; struct pll_lims pll;
int ret = -EINVAL; int clk, ret = -EINVAL;
int N, M, P1, P2; int N, M, P1, P2;
u32 clk, out; u32 out;
if (dev_priv->chipset == 0xaa || if (dev_priv->chipset == 0xaa ||
dev_priv->chipset == 0xac) dev_priv->chipset == 0xac)

View File

@ -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_GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
WREG32(EVERGREEN_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, WREG32(EVERGREEN_DESKTOP_HEIGHT + radeon_crtc->crtc_offset,
crtc->mode.vdisplay); target_fb->height);
x &= ~3; x &= ~3;
y &= ~1; y &= ~1;
WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, 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_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
WREG32(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, WREG32(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset,
crtc->mode.vdisplay); target_fb->height);
x &= ~3; x &= ~3;
y &= ~1; y &= ~1;
WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset,

View File

@ -564,9 +564,21 @@ int radeon_dp_get_panel_mode(struct drm_encoder *encoder,
ENCODER_OBJECT_ID_NUTMEG) ENCODER_OBJECT_ID_NUTMEG)
panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) ==
ENCODER_OBJECT_ID_TRAVIS) 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; panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { } else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP);
if (tmp & 1) if (tmp & 1)
panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;

View File

@ -468,27 +468,42 @@ set_default_state(struct radeon_device *rdev)
radeon_ring_write(ring, sq_stack_resource_mgmt_2); 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) static uint32_t i2f(uint32_t input)
{ {
u32 result, i, exponent, fraction; u32 result, i, exponent, fraction;
if ((input & 0x3fff) == 0) WARN_ON_ONCE(input > I2F_MAX_INPUT);
result = 0; /* 0 is a special case */
if ((input & I2F_MAX_INPUT) == 0)
result = 0;
else { else {
exponent = 140; /* exponent biased by 127; */ exponent = 126 + I2F_MAX_BITS;
fraction = (input & 0x3fff) << 10; /* cheat and only fraction = (input & I2F_MAX_INPUT) << I2F_SHIFT;
handle numbers below 2^^15 */
for (i = 0; i < 14; i++) { for (i = 0; i < I2F_MAX_BITS; i++) {
if (fraction & 0x800000) if (fraction & 0x800000)
break; break;
else { else {
fraction = fraction << 1; /* keep fraction = fraction << 1;
shifting left until top bit = 1 */
exponent = exponent - 1; exponent = exponent - 1;
} }
} }
result = exponent << 23 | (fraction & 0x7fffff); /* mask result = exponent << 23 | (fraction & 0x7fffff);
off top bit; assumed 1 */
} }
return result; return result;
} }

View File

@ -59,8 +59,9 @@ static int radeon_atrm_call(acpi_handle atrm_handle, uint8_t *bios,
obj = (union acpi_object *)buffer.pointer; obj = (union acpi_object *)buffer.pointer;
memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length); memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length);
len = obj->buffer.length;
kfree(buffer.pointer); kfree(buffer.pointer);
return obj->buffer.length; return len;
} }
bool radeon_atrm_supported(struct pci_dev *pdev) bool radeon_atrm_supported(struct pci_dev *pdev)

View File

@ -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) if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
return 0; return 0;
drm_kms_helper_poll_disable(dev);
/* turn off display hw */ /* turn off display hw */
list_for_each_entry(connector, &dev->mode_config.connector_list, head) { list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); 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) { list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
} }
drm_kms_helper_poll_enable(dev);
return 0; return 0;
} }

View File

@ -958,6 +958,7 @@ struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev,
i2c->rec = *rec; i2c->rec = *rec;
i2c->adapter.owner = THIS_MODULE; i2c->adapter.owner = THIS_MODULE;
i2c->adapter.class = I2C_CLASS_DDC; i2c->adapter.class = I2C_CLASS_DDC;
i2c->adapter.dev.parent = &dev->pdev->dev;
i2c->dev = dev; i2c->dev = dev;
snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
"Radeon aux bus %s", name); "Radeon aux bus %s", name);

View File

@ -808,9 +808,12 @@ static ssize_t ucma_accept(struct ucma_file *file, const char __user *inbuf,
return PTR_ERR(ctx); return PTR_ERR(ctx);
if (cmd.conn_param.valid) { if (cmd.conn_param.valid) {
ctx->uid = cmd.uid;
ucma_copy_conn_param(&conn_param, &cmd.conn_param); ucma_copy_conn_param(&conn_param, &cmd.conn_param);
mutex_lock(&file->mut);
ret = rdma_accept(ctx->cm_id, &conn_param); ret = rdma_accept(ctx->cm_id, &conn_param);
if (!ret)
ctx->uid = cmd.uid;
mutex_unlock(&file->mut);
} else } else
ret = rdma_accept(ctx->cm_id, NULL); ret = rdma_accept(ctx->cm_id, NULL);

View File

@ -1485,6 +1485,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
qp->event_handler = attr.event_handler; qp->event_handler = attr.event_handler;
qp->qp_context = attr.qp_context; qp->qp_context = attr.qp_context;
qp->qp_type = attr.qp_type; qp->qp_type = attr.qp_type;
atomic_set(&qp->usecnt, 0);
atomic_inc(&pd->usecnt); atomic_inc(&pd->usecnt);
atomic_inc(&attr.send_cq->usecnt); atomic_inc(&attr.send_cq->usecnt);
if (attr.recv_cq) if (attr.recv_cq)

View File

@ -421,6 +421,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
qp->uobject = NULL; qp->uobject = NULL;
qp->qp_type = qp_init_attr->qp_type; qp->qp_type = qp_init_attr->qp_type;
atomic_set(&qp->usecnt, 0);
if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) { if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
qp->event_handler = __ib_shared_qp_event_handler; qp->event_handler = __ib_shared_qp_event_handler;
qp->qp_context = qp; qp->qp_context = qp;
@ -430,7 +431,6 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
qp->xrcd = qp_init_attr->xrcd; qp->xrcd = qp_init_attr->xrcd;
atomic_inc(&qp_init_attr->xrcd->usecnt); atomic_inc(&qp_init_attr->xrcd->usecnt);
INIT_LIST_HEAD(&qp->open_list); INIT_LIST_HEAD(&qp->open_list);
atomic_set(&qp->usecnt, 0);
real_qp = qp; real_qp = qp;
qp = __ib_open_qp(real_qp, qp_init_attr->event_handler, qp = __ib_open_qp(real_qp, qp_init_attr->event_handler,

View File

@ -89,7 +89,7 @@ static int create_file(const char *name, umode_t mode,
error = ipathfs_mknod(parent->d_inode, *dentry, error = ipathfs_mknod(parent->d_inode, *dentry,
mode, fops, data); mode, fops, data);
else else
error = PTR_ERR(dentry); error = PTR_ERR(*dentry);
mutex_unlock(&parent->d_inode->i_mutex); mutex_unlock(&parent->d_inode->i_mutex);
return error; return error;

View File

@ -257,12 +257,9 @@ static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
return IB_MAD_RESULT_SUCCESS; return IB_MAD_RESULT_SUCCESS;
/* /*
* Don't process SMInfo queries or vendor-specific * Don't process SMInfo queries -- the SMA can't handle them.
* MADs -- the SMA can't handle them.
*/ */
if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO || 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))
return IB_MAD_RESULT_SUCCESS; return IB_MAD_RESULT_SUCCESS;
} else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT || } else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT ||
in_mad->mad_hdr.mgmt_class == MLX4_IB_VENDOR_CLASS1 || in_mad->mad_hdr.mgmt_class == MLX4_IB_VENDOR_CLASS1 ||

View File

@ -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. * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
* *
* This software is available to you under a choice of one of two * This software is available to you under a choice of one of two

View File

@ -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. * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
* *
* This software is available to you under a choice of one of two * This software is available to you under a choice of one of two

View File

@ -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 * 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 * 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_ptr = &start_addr;
u8 **start_buff = &start_ptr; u8 **start_buff = &start_ptr;
u16 buff_len = 0; u16 buff_len = 0;
struct ietf_mpa_v1 *mpa_frame;
skb = dev_alloc_skb(MAX_CM_BUFFER); skb = dev_alloc_skb(MAX_CM_BUFFER);
if (!skb) { if (!skb) {
@ -242,6 +243,8 @@ static int send_mpa_reject(struct nes_cm_node *cm_node)
/* send an MPA reject frame */ /* send an MPA reject frame */
cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REPLY); 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); form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK | SET_FIN);
cm_node->state = NES_CM_STATE_FIN_WAIT1; 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, if (!memcmp(nesadapter->arp_table[arpindex].mac_addr,
neigh->ha, ETH_ALEN)) { neigh->ha, ETH_ALEN)) {
/* Mac address same as in nes_arp_table */ /* Mac address same as in nes_arp_table */
ip_rt_put(rt); goto out;
return rc;
} }
nes_manage_arp_cache(nesvnic->netdev, 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); neigh_event_send(neigh, NULL);
} }
} }
out:
rcu_read_unlock(); rcu_read_unlock();
ip_rt_put(rt); ip_rt_put(rt);
return rc; return rc;

View File

@ -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 * 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 * licenses. You may choose to be licensed under the terms of the GNU

View File

@ -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 * 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 * licenses. You may choose to be licensed under the terms of the GNU

View File

@ -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 * 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 * licenses. You may choose to be licensed under the terms of the GNU

View File

@ -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 * 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 * licenses. You may choose to be licensed under the terms of the GNU

View File

@ -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 * 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 * licenses. You may choose to be licensed under the terms of the GNU

View File

@ -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 * 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 * licenses. You may choose to be licensed under the terms of the GNU

View File

@ -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 * 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 * licenses. You may choose to be licensed under the terms of the GNU

View File

@ -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 Topspin Communications. All rights reserved.
* Copyright (c) 2005 Cisco Systems. All rights reserved. * Copyright (c) 2005 Cisco Systems. All rights reserved.
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.

View File

@ -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 * 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 * licenses. You may choose to be licensed under the terms of the GNU

View File

@ -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 * 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 * 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, set_wqe_32bit_value(wqe->wqe_words,
NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX, NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX,
ib_wr->wr.fast_reg.length); 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, set_wqe_32bit_value(wqe->wqe_words,
NES_IWARP_SQ_FMR_WQE_MR_STAG_IDX, NES_IWARP_SQ_FMR_WQE_MR_STAG_IDX,
ib_wr->wr.fast_reg.rkey); 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; entry->opcode = IB_WC_SEND;
break; break;
case NES_IWARP_SQ_OP_LOCINV: case NES_IWARP_SQ_OP_LOCINV:
entry->opcode = IB_WR_LOCAL_INV; entry->opcode = IB_WC_LOCAL_INV;
break; break;
case NES_IWARP_SQ_OP_FAST_REG: case NES_IWARP_SQ_OP_FAST_REG:
entry->opcode = IB_WC_FAST_REG_MR; entry->opcode = IB_WC_FAST_REG_MR;

View File

@ -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. * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
* *
* This software is available to you under a choice of one of two * This software is available to you under a choice of one of two

View File

@ -2105,7 +2105,7 @@ static void alloc_dummy_hdrq(struct qib_devdata *dd)
dd->cspec->dummy_hdrq = dma_alloc_coherent(&dd->pcidev->dev, dd->cspec->dummy_hdrq = dma_alloc_coherent(&dd->pcidev->dev,
dd->rcd[0]->rcvhdrq_size, dd->rcd[0]->rcvhdrq_size,
&dd->cspec->dummy_hdrq_phys, &dd->cspec->dummy_hdrq_phys,
GFP_KERNEL | __GFP_COMP); GFP_ATOMIC | __GFP_COMP);
if (!dd->cspec->dummy_hdrq) { if (!dd->cspec->dummy_hdrq) {
qib_devinfo(dd->pcidev, "Couldn't allocate dummy hdrq\n"); qib_devinfo(dd->pcidev, "Couldn't allocate dummy hdrq\n");
/* fallback to just 0'ing */ /* fallback to just 0'ing */

View File

@ -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. * BIOS may not set PCIe bus-utilization parameters for best performance.
* Check and optionally adjust them to maximize our throughput. * 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_param_named(pcie_caps, qib_pcie_caps, int, S_IRUGO);
MODULE_PARM_DESC(pcie_caps, "Max PCIe tuning: Payload (0..3), ReadReq (4..7)"); MODULE_PARM_DESC(pcie_caps, "Max PCIe tuning: Payload (0..3), ReadReq (4..7)");

View File

@ -1279,3 +1279,4 @@ static struct usb_driver go7007_usb_driver = {
}; };
module_usb_driver(go7007_usb_driver); module_usb_driver(go7007_usb_driver);
MODULE_LICENSE("GPL v2");

View File

@ -641,10 +641,10 @@ static int __cap_is_valid(struct ceph_cap *cap)
unsigned long ttl; unsigned long ttl;
u32 gen; u32 gen;
spin_lock(&cap->session->s_cap_lock); spin_lock(&cap->session->s_gen_ttl_lock);
gen = cap->session->s_cap_gen; gen = cap->session->s_cap_gen;
ttl = cap->session->s_cap_ttl; 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)) { if (cap->cap_gen < gen || time_after_eq(jiffies, ttl)) {
dout("__cap_is_valid %p cap %p issued %s " dout("__cap_is_valid %p cap %p issued %s "

View File

@ -975,10 +975,10 @@ static int dentry_lease_is_valid(struct dentry *dentry)
di = ceph_dentry(dentry); di = ceph_dentry(dentry);
if (di->lease_session) { if (di->lease_session) {
s = 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; gen = s->s_cap_gen;
ttl = s->s_cap_ttl; ttl = s->s_cap_ttl;
spin_unlock(&s->s_cap_lock); spin_unlock(&s->s_gen_ttl_lock);
if (di->lease_gen == gen && if (di->lease_gen == gen &&
time_before(jiffies, dentry->d_time) && time_before(jiffies, dentry->d_time) &&

View File

@ -262,6 +262,7 @@ static int parse_reply_info(struct ceph_msg *msg,
/* trace */ /* trace */
ceph_decode_32_safe(&p, end, len, bad); ceph_decode_32_safe(&p, end, len, bad);
if (len > 0) { if (len > 0) {
ceph_decode_need(&p, end, len, bad);
err = parse_reply_info_trace(&p, p+len, info, features); err = parse_reply_info_trace(&p, p+len, info, features);
if (err < 0) if (err < 0)
goto out_bad; goto out_bad;
@ -270,6 +271,7 @@ static int parse_reply_info(struct ceph_msg *msg,
/* extra */ /* extra */
ceph_decode_32_safe(&p, end, len, bad); ceph_decode_32_safe(&p, end, len, bad);
if (len > 0) { if (len > 0) {
ceph_decode_need(&p, end, len, bad);
err = parse_reply_info_extra(&p, p+len, info, features); err = parse_reply_info_extra(&p, p+len, info, features);
if (err < 0) if (err < 0)
goto out_bad; 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.type = CEPH_ENTITY_TYPE_MDS;
s->s_con.peer_name.num = cpu_to_le64(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_gen = 0;
s->s_cap_ttl = 0; s->s_cap_ttl = 0;
spin_lock_init(&s->s_cap_lock);
s->s_renew_requested = 0; s->s_renew_requested = 0;
s->s_renew_seq = 0; s->s_renew_seq = 0;
INIT_LIST_HEAD(&s->s_caps); INIT_LIST_HEAD(&s->s_caps);
@ -2326,10 +2330,10 @@ static void handle_session(struct ceph_mds_session *session,
case CEPH_SESSION_STALE: case CEPH_SESSION_STALE:
pr_info("mds%d caps went stale, renewing\n", pr_info("mds%d caps went stale, renewing\n",
session->s_mds); session->s_mds);
spin_lock(&session->s_cap_lock); spin_lock(&session->s_gen_ttl_lock);
session->s_cap_gen++; session->s_cap_gen++;
session->s_cap_ttl = 0; session->s_cap_ttl = 0;
spin_unlock(&session->s_cap_lock); spin_unlock(&session->s_gen_ttl_lock);
send_renew_caps(mdsc, session); send_renew_caps(mdsc, session);
break; break;

View File

@ -117,10 +117,13 @@ struct ceph_mds_session {
void *s_authorizer_buf, *s_authorizer_reply_buf; void *s_authorizer_buf, *s_authorizer_reply_buf;
size_t s_authorizer_buf_len, s_authorizer_reply_buf_len; size_t s_authorizer_buf_len, s_authorizer_reply_buf_len;
/* protected by s_cap_lock */ /* protected by s_gen_ttl_lock */
spinlock_t s_cap_lock; spinlock_t s_gen_ttl_lock;
u32 s_cap_gen; /* inc each time we get mds stale msg */ u32 s_cap_gen; /* inc each time we get mds stale msg */
unsigned long s_cap_ttl; /* when session caps expire */ 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 */ struct list_head s_caps; /* all caps issued by this session */
int s_nr_caps, s_trim_caps; int s_nr_caps, s_trim_caps;
int s_num_cap_releases; int s_num_cap_releases;

View File

@ -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[] = { 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}, { true, "ceph.layout", ceph_vxattrcb_layout},
{ NULL, NULL } { true, NULL, NULL }
}; };
static struct ceph_vxattr_cb *ceph_inode_vxattrs(struct inode *inode) static struct ceph_vxattr_cb *ceph_inode_vxattrs(struct inode *inode)

View File

@ -152,9 +152,6 @@ static struct page *logfs_mtd_find_first_sb(struct super_block *sb, u64 *ofs)
filler_t *filler = logfs_mtd_readpage; filler_t *filler = logfs_mtd_readpage;
struct mtd_info *mtd = super->s_mtd; struct mtd_info *mtd = super->s_mtd;
if (!mtd_can_have_bb(mtd))
return NULL;
*ofs = 0; *ofs = 0;
while (mtd_block_isbad(mtd, *ofs)) { while (mtd_block_isbad(mtd, *ofs)) {
*ofs += mtd->erasesize; *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; filler_t *filler = logfs_mtd_readpage;
struct mtd_info *mtd = super->s_mtd; struct mtd_info *mtd = super->s_mtd;
if (!mtd_can_have_bb(mtd))
return NULL;
*ofs = mtd->size - mtd->erasesize; *ofs = mtd->size - mtd->erasesize;
while (mtd_block_isbad(mtd, *ofs)) { while (mtd_block_isbad(mtd, *ofs)) {
*ofs -= mtd->erasesize; *ofs -= mtd->erasesize;

View File

@ -198,26 +198,6 @@ static int proc_root_link(struct dentry *dentry, struct path *path)
return result; 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) struct mm_struct *mm_for_maps(struct task_struct *task)
{ {
return mm_access(task, PTRACE_MODE_READ); 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)) if (IS_ERR(mm))
return PTR_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 */ /* OK to pass negative loff_t, we can catch out-of-range */
file->f_mode |= FMODE_UNSIGNED_OFFSET; file->f_mode |= FMODE_UNSIGNED_OFFSET;
file->private_data = mm; file->private_data = mm;
@ -718,57 +705,13 @@ static int mem_open(struct inode* inode, struct file* file)
return 0; return 0;
} }
static ssize_t mem_read(struct file * file, char __user * buf, static ssize_t mem_rw(struct file *file, char __user *buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos, int write)
{ {
int ret;
char *page;
unsigned long src = *ppos;
struct mm_struct *mm = file->private_data; struct mm_struct *mm = file->private_data;
unsigned long addr = *ppos;
if (!mm) ssize_t copied;
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;
char *page; char *page;
unsigned long dst = *ppos;
struct mm_struct *mm = file->private_data;
if (!mm) if (!mm)
return 0; return 0;
@ -778,31 +721,54 @@ static ssize_t mem_write(struct file * file, const char __user *buf,
return -ENOMEM; return -ENOMEM;
copied = 0; copied = 0;
while (count > 0) { if (!atomic_inc_not_zero(&mm->mm_users))
int this_len, retval; goto free;
this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count; while (count > 0) {
if (copy_from_user(page, buf, this_len)) { int this_len = min_t(int, count, PAGE_SIZE);
if (write && copy_from_user(page, buf, this_len)) {
copied = -EFAULT; copied = -EFAULT;
break; 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) if (!copied)
copied = -EIO; copied = -EIO;
break; 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); free_page((unsigned long) page);
return copied; 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) loff_t mem_lseek(struct file *file, loff_t offset, int orig)
{ {
switch (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) static int mem_release(struct inode *inode, struct file *file)
{ {
struct mm_struct *mm = file->private_data; struct mm_struct *mm = file->private_data;
if (mm)
mmput(mm); mmdrop(mm);
return 0; return 0;
} }

0
include/linux/lp8727.h Executable file → Normal file
View File

View File

@ -57,8 +57,6 @@ struct gcry_mpi {
typedef struct gcry_mpi *MPI; typedef struct gcry_mpi *MPI;
#define MPI_NULL NULL
#define mpi_get_nlimbs(a) ((a)->nlimbs) #define mpi_get_nlimbs(a) ((a)->nlimbs)
#define mpi_is_neg(a) ((a)->sign) #define mpi_is_neg(a) ((a)->sign)

View File

@ -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) static inline int mtd_can_have_bb(const struct mtd_info *mtd)
{ {
return 0; return !!mtd->block_isbad;
} }
/* Kernel-side ioctl definitions */ /* Kernel-side ioctl definitions */

View File

@ -2259,6 +2259,12 @@ static inline void mmdrop(struct mm_struct * mm)
extern void mmput(struct mm_struct *); extern void mmput(struct mm_struct *);
/* Grab a reference to a task's mm, if it is not already going away */ /* 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); 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 */ /* Remove the current tasks stale references to the old mm_struct */
extern void mm_release(struct task_struct *, struct mm_struct *); extern void mm_release(struct task_struct *, struct mm_struct *);
/* Allocate a new mm structure and copy contents from tsk->mm */ /* Allocate a new mm structure and copy contents from tsk->mm */

View File

@ -1038,6 +1038,22 @@ void do_exit(long code)
if (tsk->nr_dirtied) if (tsk->nr_dirtied)
__this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied); __this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied);
exit_rcu(); 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(). */ /* causes final put_task_struct in finish_task_switch(). */
tsk->state = TASK_DEAD; tsk->state = TASK_DEAD;
tsk->flags |= PF_NOFREEZE; /* tell freezer to ignore us */ tsk->flags |= PF_NOFREEZE; /* tell freezer to ignore us */

View File

@ -647,6 +647,26 @@ struct mm_struct *get_task_mm(struct task_struct *task)
} }
EXPORT_SYMBOL_GPL(get_task_mm); 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. /* Please note the differences between mmput and mm_release.
* mmput is called whenever we stop holding onto a mm_struct, * mmput is called whenever we stop holding onto a mm_struct,
* error success whatever. * error success whatever.

View File

@ -74,6 +74,7 @@
#include <asm/tlb.h> #include <asm/tlb.h>
#include <asm/irq_regs.h> #include <asm/irq_regs.h>
#include <asm/mutex.h>
#ifdef CONFIG_PARAVIRT #ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h> #include <asm/paravirt.h>
#endif #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); 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) void activate_task(struct rq *rq, struct task_struct *p, int flags)
{ {
if (task_contributes_to_load(p)) 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); 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) void deactivate_task(struct rq *rq, struct task_struct *p, int flags)
{ {
if (task_contributes_to_load(p)) if (task_contributes_to_load(p))
@ -4134,7 +4129,7 @@ recheck:
on_rq = p->on_rq; on_rq = p->on_rq;
running = task_current(rq, p); running = task_current(rq, p);
if (on_rq) if (on_rq)
deactivate_task(rq, p, 0); dequeue_task(rq, p, 0);
if (running) if (running)
p->sched_class->put_prev_task(rq, p); p->sched_class->put_prev_task(rq, p);
@ -4147,7 +4142,7 @@ recheck:
if (running) if (running)
p->sched_class->set_curr_task(rq); p->sched_class->set_curr_task(rq);
if (on_rq) if (on_rq)
activate_task(rq, p, 0); enqueue_task(rq, p, 0);
check_class_changed(rq, p, prev_class, oldprio); check_class_changed(rq, p, prev_class, oldprio);
task_rq_unlock(rq, p, &flags); 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. * placed properly.
*/ */
if (p->on_rq) { if (p->on_rq) {
deactivate_task(rq_src, p, 0); dequeue_task(rq_src, p, 0);
set_task_cpu(p, dest_cpu); 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); check_preempt_curr(rq_dest, p, 0);
} }
done: done:
@ -7032,10 +7027,10 @@ static void normalize_task(struct rq *rq, struct task_struct *p)
on_rq = p->on_rq; on_rq = p->on_rq;
if (on_rq) if (on_rq)
deactivate_task(rq, p, 0); dequeue_task(rq, p, 0);
__setscheduler(rq, p, SCHED_NORMAL, 0); __setscheduler(rq, p, SCHED_NORMAL, 0);
if (on_rq) { if (on_rq) {
activate_task(rq, p, 0); enqueue_task(rq, p, 0);
resched_task(rq->curr); resched_task(rq->curr);
} }

View File

@ -4866,6 +4866,15 @@ static void nohz_balancer_kick(int cpu)
return; 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) static inline void set_cpu_sd_state_busy(void)
{ {
struct sched_domain *sd; struct sched_domain *sd;
@ -4904,6 +4913,12 @@ void select_nohz_load_balancer(int stop_tick)
{ {
int cpu = smp_processor_id(); 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 (stop_tick) {
if (test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu))) if (test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))
return; return;
@ -4914,6 +4929,18 @@ void select_nohz_load_balancer(int stop_tick)
} }
return; 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 #endif
static DEFINE_SPINLOCK(balancing); 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. * busy tick after returning from idle, we will update the busy stats.
*/ */
set_cpu_sd_state_busy(); set_cpu_sd_state_busy();
if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) { clear_nohz_tick_stopped(cpu);
clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu));
cpumask_clear_cpu(cpu, nohz.idle_cpus_mask);
atomic_dec(&nohz.nr_cpus);
}
/* /*
* None are in tickless mode and hence no need for NOHZ idle load * 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 #ifdef CONFIG_NO_HZ
zalloc_cpumask_var(&nohz.idle_cpus_mask, GFP_NOWAIT); zalloc_cpumask_var(&nohz.idle_cpus_mask, GFP_NOWAIT);
cpu_notifier(sched_ilb_notifier, 0);
#endif #endif
#endif /* SMP */ #endif /* SMP */

View File

@ -1587,6 +1587,11 @@ static int push_rt_task(struct rq *rq)
if (!next_task) if (!next_task)
return 0; return 0;
#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
if (unlikely(task_running(rq, next_task)))
return 0;
#endif
retry: retry:
if (unlikely(next_task == rq->curr)) { if (unlikely(next_task == rq->curr)) {
WARN_ON(1); WARN_ON(1);

View File

@ -296,7 +296,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
if (__this_cpu_read(soft_watchdog_warn) == true) if (__this_cpu_read(soft_watchdog_warn) == true)
return HRTIMER_RESTART; 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, smp_processor_id(), duration,
current->comm, task_pid_nr(current)); current->comm, task_pid_nr(current));
print_modules(); print_modules();

View File

@ -279,6 +279,9 @@ config AVERAGE
If unsure, say N. If unsure, say N.
config CLZ_TAB
bool
config CORDIC config CORDIC
tristate "CORDIC algorithm" tristate "CORDIC algorithm"
help help
@ -287,6 +290,7 @@ config CORDIC
config MPILIB config MPILIB
tristate tristate
select CLZ_TAB
help help
Multiprecision maths library from GnuPG. Multiprecision maths library from GnuPG.
It is used to implement RSA digital signature verification, It is used to implement RSA digital signature verification,

View File

@ -121,6 +121,8 @@ obj-$(CONFIG_DQL) += dynamic_queue_limits.o
obj-$(CONFIG_MPILIB) += mpi/ obj-$(CONFIG_MPILIB) += mpi/
obj-$(CONFIG_SIGNATURE) += digsig.o obj-$(CONFIG_SIGNATURE) += digsig.o
obj-$(CONFIG_CLZ_TAB) += clz_tab.o
hostprogs-y := gen_crc32table hostprogs-y := gen_crc32table
clean-files := crc32table.h clean-files := crc32table.h

View File

@ -169,7 +169,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
return BUG_TRAP_TYPE_WARN; return BUG_TRAP_TYPE_WARN;
} }
printk(KERN_EMERG "------------[ cut here ]------------\n"); printk(KERN_DEFAULT "------------[ cut here ]------------\n");
if (file) if (file)
printk(KERN_CRIT "kernel BUG at %s:%u!\n", printk(KERN_CRIT "kernel BUG at %s:%u!\n",

18
lib/clz_tab.c Normal file
View 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,
};

View File

@ -34,14 +34,9 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,
unsigned long msglen, unsigned long msglen,
unsigned long modulus_bitlen, unsigned long modulus_bitlen,
unsigned char *out, unsigned char *out,
unsigned long *outlen, unsigned long *outlen)
int *is_valid)
{ {
unsigned long modulus_len, ps_len, i; 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); 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; return -EINVAL;
/* separate encoded message */ /* separate encoded message */
if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) { if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1))
result = -EINVAL; return -EINVAL;
goto bail;
}
for (i = 2; i < modulus_len - 1; i++) for (i = 2; i < modulus_len - 1; i++)
if (msg[i] != 0xFF) if (msg[i] != 0xFF)
break; break;
/* separator check */ /* separator check */
if (msg[i] != 0) { if (msg[i] != 0)
/* There was no octet with hexadecimal value 0x00 /* There was no octet with hexadecimal value 0x00
to separate ps from m. */ to separate ps from m. */
result = -EINVAL; return -EINVAL;
goto bail;
}
ps_len = i - 2; ps_len = i - 2;
if (*outlen < (msglen - (2 + ps_len + 1))) { if (*outlen < (msglen - (2 + ps_len + 1))) {
*outlen = msglen - (2 + ps_len + 1); *outlen = msglen - (2 + ps_len + 1);
result = -EOVERFLOW; return -EOVERFLOW;
goto bail;
} }
*outlen = (msglen - (2 + ps_len + 1)); *outlen = (msglen - (2 + ps_len + 1));
memcpy(out, &msg[2 + ps_len + 1], *outlen); memcpy(out, &msg[2 + ps_len + 1], *outlen);
/* valid packet */ return 0;
*is_valid = 1;
result = 0;
bail:
return result;
} }
/* /*
@ -96,7 +82,7 @@ static int digsig_verify_rsa(struct key *key,
unsigned long len; unsigned long len;
unsigned long mlen, mblen; unsigned long mlen, mblen;
unsigned nret, l; unsigned nret, l;
int valid, head, i; int head, i;
unsigned char *out1 = NULL, *out2 = NULL; unsigned char *out1 = NULL, *out2 = NULL;
MPI in = NULL, res = NULL, pkey[2]; MPI in = NULL, res = NULL, pkey[2];
uint8_t *p, *datap, *endp; uint8_t *p, *datap, *endp;
@ -105,6 +91,10 @@ static int digsig_verify_rsa(struct key *key,
down_read(&key->sem); down_read(&key->sem);
ukp = key->payload.data; ukp = key->payload.data;
if (ukp->datalen < sizeof(*pkh))
goto err1;
pkh = (struct pubkey_hdr *)ukp->data; pkh = (struct pubkey_hdr *)ukp->data;
if (pkh->version != 1) if (pkh->version != 1)
@ -117,18 +107,23 @@ static int digsig_verify_rsa(struct key *key,
goto err1; goto err1;
datap = pkh->mpi; datap = pkh->mpi;
endp = datap + ukp->datalen; endp = ukp->data + ukp->datalen;
err = -ENOMEM;
for (i = 0; i < pkh->nmpi; i++) { for (i = 0; i < pkh->nmpi; i++) {
unsigned int remaining = endp - datap; unsigned int remaining = endp - datap;
pkey[i] = mpi_read_from_buffer(datap, &remaining); pkey[i] = mpi_read_from_buffer(datap, &remaining);
if (!pkey[i])
goto err;
datap += remaining; datap += remaining;
} }
mblen = mpi_get_nbits(pkey[0]); mblen = mpi_get_nbits(pkey[0]);
mlen = (mblen + 7)/8; mlen = (mblen + 7)/8;
err = -ENOMEM; if (mlen == 0)
goto err;
out1 = kzalloc(mlen, GFP_KERNEL); out1 = kzalloc(mlen, GFP_KERNEL);
if (!out1) if (!out1)
@ -167,10 +162,9 @@ static int digsig_verify_rsa(struct key *key,
memset(out1, 0, head); memset(out1, 0, head);
memcpy(out1 + head, p, l); memcpy(out1 + head, p, l);
err = -EINVAL; err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len);
pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len, &valid);
if (valid && len == hlen) if (!err && len == hlen)
err = memcmp(out2, h, hlen); err = memcmp(out2, h, hlen);
err: err:
@ -178,8 +172,8 @@ err:
mpi_free(res); mpi_free(res);
kfree(out1); kfree(out1);
kfree(out2); kfree(out2);
mpi_free(pkey[0]); while (--i >= 0)
mpi_free(pkey[1]); mpi_free(pkey[i]);
err1: err1:
up_read(&key->sem); up_read(&key->sem);

View File

@ -1200,18 +1200,40 @@ do { \
"r" ((USItype)(v)) \ "r" ((USItype)(v)) \
: "%g1", "%g2" __AND_CLOBBER_CC) : "%g1", "%g2" __AND_CLOBBER_CC)
#define UMUL_TIME 39 /* 39 instructions */ #define UMUL_TIME 39 /* 39 instructions */
#endif /* It's quite necessary to add this much assembler for the sparc.
#ifndef udiv_qrnnd The default udiv_qrnnd (in C) is more than 10 times slower! */
#ifndef LONGLONG_STANDALONE
#define udiv_qrnnd(q, r, n1, n0, d) \ #define udiv_qrnnd(q, r, n1, n0, d) \
do { USItype __r; \ __asm__ ("! Inlined udiv_qrnnd\n\t" \
(q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \ "mov 32,%%g1\n\t" \
(r) = __r; \ "subcc %1,%2,%%g0\n\t" \
} while (0) "1: bcs 5f\n\t" \
extern USItype __udiv_qrnnd(); "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \
#define UDIV_TIME 140 "sub %1,%2,%1 ! this kills msb of n\n\t" \
#endif /* LONGLONG_STANDALONE */ "addx %1,%1,%1 ! so this can't give carry\n\t" \
#endif /* udiv_qrnnd */ "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__ */ #endif /* __sparc__ */
/*************************************** /***************************************

View File

@ -21,25 +21,6 @@
#include "mpi-internal.h" #include "mpi-internal.h"
#include "longlong.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) #define A_LIMB_1 ((mpi_limb_t) 1)
/**************** /****************

View File

@ -149,6 +149,9 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den)
mpi_ptr_t marker[5]; mpi_ptr_t marker[5];
int markidx = 0; int markidx = 0;
if (!dsize)
return -EINVAL;
memset(marker, 0, sizeof(marker)); memset(marker, 0, sizeof(marker));
/* Ensure space is enough for quotient and remainder. /* 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. */ * numerator would be gradually overwritten by the quotient limbs. */
if (qp == np) { /* Copy NP object to temporary space. */ if (qp == np) { /* Copy NP object to temporary space. */
np = marker[markidx++] = mpi_alloc_limb_space(nsize); np = marker[markidx++] = mpi_alloc_limb_space(nsize);
if (!np)
goto nomem;
MPN_COPY(np, qp, nsize); MPN_COPY(np, qp, nsize);
} }
} else /* Put quotient at top of remainder. */ } else /* Put quotient at top of remainder. */

View File

@ -59,7 +59,7 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
ep = exp->d; ep = exp->d;
if (!msize) if (!msize)
msize = 1 / msize; /* provoke a signal */ return -EINVAL;
if (!esize) { if (!esize) {
/* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0

View File

@ -20,78 +20,15 @@
#include "mpi-internal.h" #include "mpi-internal.h"
#define DIM(v) (sizeof(v)/sizeof((v)[0]))
#define MAX_EXTERN_MPI_BITS 16384 #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) MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
{ {
const uint8_t *buffer = xbuffer; const uint8_t *buffer = xbuffer;
int i, j; int i, j;
unsigned nbits, nbytes, nlimbs, nread = 0; unsigned nbits, nbytes, nlimbs, nread = 0;
mpi_limb_t a; mpi_limb_t a;
MPI val = MPI_NULL; MPI val = NULL;
if (*ret_nread < 2) if (*ret_nread < 2)
goto leave; 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; nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB;
val = mpi_alloc(nlimbs); val = mpi_alloc(nlimbs);
if (!val) if (!val)
return MPI_NULL; return NULL;
i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB; i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
i %= BYTES_PER_MPI_LIMB; i %= BYTES_PER_MPI_LIMB;
val->nbits = nbits; val->nbits = nbits;
@ -211,30 +148,6 @@ int mpi_fromstr(MPI val, const char *str)
} }
EXPORT_SYMBOL_GPL(mpi_fromstr); 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). * Return an allocated buffer with the MPI (msb first).
* NBYTES receives the length of this buffer. Caller must free the * NBYTES receives the length of this buffer. Caller must free the

View File

@ -217,6 +217,10 @@ mpihelp_divrem(mpi_ptr_t qp, mpi_size_t qextra_limbs,
case 0: case 0:
/* We are asked to divide by zero, so go ahead and do it! (To make /* We are asked to divide by zero, so go ahead and do it! (To make
the compiler not remove this statement, return the value.) */ 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; return 1 / dsize;
case 1: case 1:

View File

@ -58,6 +58,9 @@ mpi_ptr_t mpi_alloc_limb_space(unsigned nlimbs)
{ {
size_t len = nlimbs * sizeof(mpi_limb_t); size_t len = nlimbs * sizeof(mpi_limb_t);
if (!len)
return NULL;
return kmalloc(len, GFP_KERNEL); return kmalloc(len, GFP_KERNEL);
} }
@ -135,7 +138,7 @@ int mpi_copy(MPI *copied, const MPI a)
size_t i; size_t i;
MPI b; MPI b;
*copied = MPI_NULL; *copied = NULL;
if (a) { if (a) {
b = mpi_alloc(a->nlimbs); b = mpi_alloc(a->nlimbs);

View File

@ -298,22 +298,17 @@ static ssize_t process_vm_rw_core(pid_t pid, const struct iovec *lvec,
goto free_proc_pages; goto free_proc_pages;
} }
task_lock(task); mm = mm_access(task, PTRACE_MODE_ATTACH);
if (__ptrace_may_access(task, PTRACE_MODE_ATTACH)) { if (!mm || IS_ERR(mm)) {
task_unlock(task); 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; rc = -EPERM;
goto put_task_struct; 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++) { for (i = 0; i < riovcnt && iov_l_curr_idx < liovcnt; i++) {
rc = process_vm_rw_single_vec( rc = process_vm_rw_single_vec(

View File

@ -85,8 +85,6 @@ int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid)
} else { } else {
pr_info("client%lld fsid %pU\n", ceph_client_id(client), fsid); pr_info("client%lld fsid %pU\n", ceph_client_id(client), fsid);
memcpy(&client->fsid, fsid, sizeof(*fsid)); memcpy(&client->fsid, fsid, sizeof(*fsid));
ceph_debugfs_client_init(client);
client->have_fsid = true;
} }
return 0; return 0;
} }

View File

@ -8,8 +8,8 @@
#include <linux/ceph/mon_client.h> #include <linux/ceph/mon_client.h>
#include <linux/ceph/libceph.h> #include <linux/ceph/libceph.h>
#include <linux/ceph/debugfs.h>
#include <linux/ceph/decode.h> #include <linux/ceph/decode.h>
#include <linux/ceph/auth.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; client->monc.monmap = monmap;
kfree(old); 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: out:
mutex_unlock(&monc->mutex); mutex_unlock(&monc->mutex);
out_unlocked:
wake_up_all(&client->auth_wq); wake_up_all(&client->auth_wq);
} }

View File

@ -1,3 +1,10 @@
OUTPUT := ./
ifeq ("$(origin O)", "command line")
ifneq ($(O),)
OUTPUT := $(O)/
endif
endif
MAN1_TXT= \ MAN1_TXT= \
$(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \ $(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
$(wildcard perf-*.txt)) \ $(wildcard perf-*.txt)) \
@ -6,10 +13,11 @@ MAN5_TXT=
MAN7_TXT= MAN7_TXT=
MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT) MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT)
MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT)) _MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT))
MAN_HTML=$(patsubst %.txt,%.html,$(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 = ARTICLES =
# with their own formatting rules. # 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 += $(API_DOCS)
SP_ARTICLES += technical/api-index 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_MAN1=$(patsubst %.txt,%.1,$(MAN1_TXT))
DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT)) _DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT))
DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_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 # Make the path relative to DESTDIR, not prefix
ifndef DESTDIR ifndef DESTDIR
@ -150,9 +164,9 @@ man1: $(DOC_MAN1)
man5: $(DOC_MAN5) man5: $(DOC_MAN5)
man7: $(DOC_MAN7) 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 install: install-man
@ -166,7 +180,7 @@ install-man: man
install-info: info install-info: info
$(INSTALL) -d -m 755 $(DESTDIR)$(infodir) $(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 \ if test -r $(DESTDIR)$(infodir)/dir; then \
$(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perf.info ;\ $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perf.info ;\
$(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perfman.info ;\ $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perfman.info ;\
@ -176,7 +190,7 @@ install-info: info
install-pdf: pdf install-pdf: pdf
$(INSTALL) -d -m 755 $(DESTDIR)$(pdfdir) $(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 #install-html: html
# '$(SHELL_PATH_SQ)' ./install-webdoc.sh $(DESTDIR)$(htmldir) # '$(SHELL_PATH_SQ)' ./install-webdoc.sh $(DESTDIR)$(htmldir)
@ -189,14 +203,14 @@ install-pdf: pdf
# #
# Determine "include::" file references in asciidoc files. # 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) $@+ $@ && \ $(QUIET_GEN)$(RM) $@+ $@ && \
$(PERL_PATH) ./build-docdep.perl >$@+ $(QUIET_STDERR) && \ $(PERL_PATH) ./build-docdep.perl >$@+ $(QUIET_STDERR) && \
mv $@+ $@ mv $@+ $@
-include doc.dep -include $(OUPTUT)doc.dep
cmds_txt = cmds-ancillaryinterrogators.txt \ _cmds_txt = cmds-ancillaryinterrogators.txt \
cmds-ancillarymanipulators.txt \ cmds-ancillarymanipulators.txt \
cmds-mainporcelain.txt \ cmds-mainporcelain.txt \
cmds-plumbinginterrogators.txt \ cmds-plumbinginterrogators.txt \
@ -205,32 +219,36 @@ cmds_txt = cmds-ancillaryinterrogators.txt \
cmds-synchelpers.txt \ cmds-synchelpers.txt \
cmds-purehelpers.txt \ cmds-purehelpers.txt \
cmds-foreignscminterface.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) $@ && \ $(QUIET_GEN)$(RM) $@ && \
$(PERL_PATH) ./cmd-list.perl ../command-list.txt $(QUIET_STDERR) && \ $(PERL_PATH) ./cmd-list.perl ../command-list.txt $(QUIET_STDERR) && \
date >$@ date >$@
clean: clean:
$(RM) *.xml *.xml+ *.html *.html+ *.1 *.5 *.7 $(RM) $(MAN_XML) $(addsuffix +,$(MAN_XML))
$(RM) *.texi *.texi+ *.texi++ perf.info perfman.info $(RM) $(MAN_HTML) $(addsuffix +,$(MAN_HTML))
$(RM) howto-index.txt howto/*.html doc.dep $(RM) $(DOC_HTML) $(DOC_MAN1) $(DOC_MAN5) $(DOC_MAN7)
$(RM) technical/api-*.html technical/api-index.txt $(RM) $(OUTPUT)*.texi $(OUTPUT)*.texi+ $(OUTPUT)*.texi++
$(RM) $(cmds_txt) *.made $(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) $@+ $@ && \ $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
$(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf \ $(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf \
$(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \ $(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \
mv $@+ $@ mv $@+ $@
%.1 %.5 %.7 : %.xml $(OUTPUT)%.1 $(OUTPUT)%.5 $(OUTPUT)%.7 : $(OUTPUT)%.xml
$(QUIET_XMLTO)$(RM) $@ && \ $(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) $@+ $@ && \ $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
$(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \ $(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \
$(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \ $(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \
@ -239,25 +257,25 @@ $(MAN_HTML): %.html : %.txt
XSLT = docbook.xsl XSLT = docbook.xsl
XSLTOPTS = --xinclude --stringparam html.stylesheet docbook-xsl.css 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) $< $(QUIET_XSLTPROC)xsltproc $(XSLTOPTS) -o $@ $(XSLT) $<
perf.info: user-manual.texi $(OUTPUT)perf.info: $(OUTPUT)user-manual.texi
$(QUIET_MAKEINFO)$(MAKEINFO) --no-split -o $@ 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) $@+ $@ && \ $(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 <$@++ >$@+ && \ $(PERL_PATH) fix-texi.perl <$@++ >$@+ && \
rm $@++ && \ rm $@++ && \
mv $@+ $@ mv $@+ $@
user-manual.pdf: user-manual.xml $(OUTPUT)user-manual.pdf: $(OUTPUT)user-manual.xml
$(QUIET_DBLATEX)$(RM) $@+ $@ && \ $(QUIET_DBLATEX)$(RM) $@+ $@ && \
$(DBLATEX) -o $@+ -p /etc/asciidoc/dblatex/asciidoc-dblatex.xsl -s /etc/asciidoc/dblatex/asciidoc-dblatex.sty $< && \ $(DBLATEX) -o $@+ -p /etc/asciidoc/dblatex/asciidoc-dblatex.xsl -s /etc/asciidoc/dblatex/asciidoc-dblatex.sty $< && \
mv $@+ $@ mv $@+ $@
perfman.texi: $(MAN_XML) cat-texi.perl $(OUTPUT)perfman.texi: $(MAN_XML) cat-texi.perl
$(QUIET_DB2TEXI)$(RM) $@+ $@ && \ $(QUIET_DB2TEXI)$(RM) $@+ $@ && \
($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --encoding=UTF-8 \ ($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --encoding=UTF-8 \
--to-stdout $(xml) &&) true) > $@++ && \ --to-stdout $(xml) &&) true) > $@++ && \
@ -265,7 +283,7 @@ perfman.texi: $(MAN_XML) cat-texi.perl
rm $@++ && \ rm $@++ && \
mv $@+ $@ mv $@+ $@
perfman.info: perfman.texi $(OUTPUT)perfman.info: $(OUTPUT)perfman.texi
$(QUIET_MAKEINFO)$(MAKEINFO) --no-split --no-validate $*.texi $(QUIET_MAKEINFO)$(MAKEINFO) --no-split --no-validate $*.texi
$(patsubst %.txt,%.texi,$(MAN_TXT)): %.texi : %.xml $(patsubst %.txt,%.texi,$(MAN_TXT)): %.texi : %.xml

View File

@ -794,7 +794,6 @@ help:
@echo ' quick-install-html - install the html documentation quickly' @echo ' quick-install-html - install the html documentation quickly'
@echo '' @echo ''
@echo 'Perf maintainer targets:' @echo 'Perf maintainer targets:'
@echo ' distclean - alias to clean'
@echo ' clean - clean all binary objects and build output' @echo ' clean - clean all binary objects and build output'
doc: doc:

View File

@ -4,3 +4,9 @@
#define Lmemcpy_c globl memcpy_c; memcpy_c #define Lmemcpy_c globl memcpy_c; memcpy_c
#define Lmemcpy_c_e globl memcpy_c_e; memcpy_c_e #define Lmemcpy_c_e globl memcpy_c_e; memcpy_c_e
#include "../../../arch/x86/lib/memcpy_64.S" #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

View File

@ -4,3 +4,10 @@
#define Lmemset_c globl memset_c; memset_c #define Lmemset_c globl memset_c; memset_c
#define Lmemset_c_e globl memset_c_e; memset_c_e #define Lmemset_c_e globl memset_c_e; memset_c_e
#include "../../../arch/x86/lib/memset_64.S" #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

View File

@ -58,7 +58,7 @@ static struct {
struct perf_probe_event events[MAX_PROBES]; struct perf_probe_event events[MAX_PROBES];
struct strlist *dellist; struct strlist *dellist;
struct line_range line_range; struct line_range line_range;
const char *target_module; const char *target;
int max_probe_points; int max_probe_points;
struct strfilter *filter; struct strfilter *filter;
} params; } params;
@ -246,7 +246,7 @@ static const struct option options[] = {
"file", "vmlinux pathname"), "file", "vmlinux pathname"),
OPT_STRING('s', "source", &symbol_conf.source_prefix, OPT_STRING('s', "source", &symbol_conf.source_prefix,
"directory", "path to kernel source"), "directory", "path to kernel source"),
OPT_STRING('m', "module", &params.target_module, OPT_STRING('m', "module", &params.target,
"modname|path", "modname|path",
"target module name (for online) or path (for offline)"), "target module name (for online) or path (for offline)"),
#endif #endif
@ -333,7 +333,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
if (!params.filter) if (!params.filter)
params.filter = strfilter__new(DEFAULT_FUNC_FILTER, params.filter = strfilter__new(DEFAULT_FUNC_FILTER,
NULL); NULL);
ret = show_available_funcs(params.target_module, ret = show_available_funcs(params.target,
params.filter); params.filter);
strfilter__delete(params.filter); strfilter__delete(params.filter);
if (ret < 0) 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); usage_with_options(probe_usage, options);
} }
ret = show_line_range(&params.line_range, params.target_module); ret = show_line_range(&params.line_range, params.target);
if (ret < 0) if (ret < 0)
pr_err(" Error: Failed to show lines. (%d)\n", ret); pr_err(" Error: Failed to show lines. (%d)\n", ret);
return 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, ret = show_available_vars(params.events, params.nevents,
params.max_probe_points, params.max_probe_points,
params.target_module, params.target,
params.filter, params.filter,
params.show_ext_vars); params.show_ext_vars);
strfilter__delete(params.filter); strfilter__delete(params.filter);
@ -393,7 +393,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
if (params.nevents) { if (params.nevents) {
ret = add_perf_probe_events(params.events, params.nevents, ret = add_perf_probe_events(params.events, params.nevents,
params.max_probe_points, params.max_probe_points,
params.target_module, params.target,
params.force_add); params.force_add);
if (ret < 0) { if (ret < 0) {
pr_err(" Error: Failed to add events. (%d)\n", ret); pr_err(" Error: Failed to add events. (%d)\n", ret);

View File

@ -386,7 +386,7 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
{ {
struct stat st; struct stat st;
int flags; int flags;
int err, output; int err, output, feat;
unsigned long waking = 0; unsigned long waking = 0;
const bool forks = argc > 0; const bool forks = argc > 0;
struct machine *machine; struct machine *machine;
@ -453,8 +453,14 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
rec->session = session; rec->session = session;
if (!rec->no_buildid) for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++)
perf_header__set_feat(&session->header, HEADER_BUILD_ID); 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) { if (!rec->file_new) {
err = perf_session__read_header(session, output); 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; 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) { if (forks) {
err = perf_evlist__prepare_workload(evsel_list, opts, argv); err = perf_evlist__prepare_workload(evsel_list, opts, argv);
if (err < 0) { if (err < 0) {

View File

@ -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)) if (perf_evsel__match(evsel, SOFTWARE, SW_TASK_CLOCK))
fprintf(output, " # %8.3f CPUs utilized ", fprintf(output, " # %8.3f CPUs utilized ",
avg / avg_stats(&walltime_nsecs_stats)); avg / avg_stats(&walltime_nsecs_stats));
else
fprintf(output, " ");
} }
/* used for get_ratio_color() */ /* 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); fprintf(output, " # %8.3f GHz ", ratio);
} else if (runtime_nsecs_stats[cpu].n != 0) { } else if (runtime_nsecs_stats[cpu].n != 0) {
char unit = 'M';
total = avg_stats(&runtime_nsecs_stats[cpu]); total = avg_stats(&runtime_nsecs_stats[cpu]);
if (total) if (total)
ratio = 1000.0 * avg / 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 { } else {
fprintf(output, " "); fprintf(output, " ");
} }

View File

@ -554,7 +554,7 @@ static int perf_event__process_kernel_mmap(struct perf_tool *tool __used,
is_kernel_mmap = memcmp(event->mmap.filename, is_kernel_mmap = memcmp(event->mmap.filename,
kmmap_prefix, kmmap_prefix,
strlen(kmmap_prefix)) == 0; strlen(kmmap_prefix) - 1) == 0;
if (event->mmap.filename[0] == '/' || if (event->mmap.filename[0] == '/' ||
(!is_kernel_mmap && event->mmap.filename[0] == '[')) { (!is_kernel_mmap && event->mmap.filename[0] == '[')) {

View File

@ -97,7 +97,7 @@ void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
++evlist->nr_entries; ++evlist->nr_entries;
} }
static void perf_evlist__splice_list_tail(struct perf_evlist *evlist, void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
struct list_head *list, struct list_head *list,
int nr_entries) int nr_entries)
{ {

View File

@ -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_type(const struct perf_evlist *evlist);
bool perf_evlist__valid_sample_id_all(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 */ #endif /* __PERF_EVLIST_H */

View File

@ -463,6 +463,7 @@ int perf_event__parse_sample(const union perf_event *event, u64 type,
memset(data, 0, sizeof(*data)); memset(data, 0, sizeof(*data));
data->cpu = data->pid = data->tid = -1; data->cpu = data->pid = data->tid = -1;
data->stream_id = data->id = data->time = -1ULL; data->stream_id = data->id = data->time = -1ULL;
data->period = 1;
if (event->header.type != PERF_RECORD_SAMPLE) { if (event->header.type != PERF_RECORD_SAMPLE) {
if (!sample_id_all) if (!sample_id_all)

View File

@ -11,6 +11,7 @@
enum { enum {
HEADER_RESERVED = 0, /* always cleared */ HEADER_RESERVED = 0, /* always cleared */
HEADER_FIRST_FEATURE = 1,
HEADER_TRACE_INFO = 1, HEADER_TRACE_INFO = 1,
HEADER_BUILD_ID, HEADER_BUILD_ID,

View File

@ -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 */ /* Try to find perf_probe_event with debuginfo */
static int try_to_find_probe_trace_events(struct perf_probe_event *pev, static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event **tevs, 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); 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; int ntevs, ret = 0;
if (!dinfo) { 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 */ if (ntevs > 0) { /* Succeeded to find trace events */
pr_debug("find %d probe_trace_events.\n", ntevs); pr_debug("find %d probe_trace_events.\n", ntevs);
if (module) if (target)
ret = add_module_to_probe_trace_events(*tevs, ntevs, ret = add_module_to_probe_trace_events(*tevs, ntevs,
module); target);
return ret < 0 ? ret : ntevs; 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, static int convert_to_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event **tevs, struct probe_trace_event **tevs,
int max_tevs, const char *module) int max_tevs, const char *target)
{ {
struct symbol *sym; struct symbol *sym;
int ret = 0, i; int ret = 0, i;
struct probe_trace_event *tev; struct probe_trace_event *tev;
/* Convert perf_probe_event with debuginfo */ /* 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) if (ret != 0)
return ret; /* Found in debuginfo or got an error */ 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; goto error;
} }
if (module) { if (target) {
tev->point.module = strdup(module); tev->point.module = strdup(target);
if (tev->point.module == NULL) { if (tev->point.module == NULL) {
ret = -ENOMEM; ret = -ENOMEM;
goto error; goto error;
@ -1884,7 +1884,7 @@ struct __event_package {
}; };
int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, 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; int i, j, ret;
struct __event_package *pkgs; 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, ret = convert_to_probe_trace_events(pkgs[i].pev,
&pkgs[i].tevs, &pkgs[i].tevs,
max_tevs, max_tevs,
module); target);
if (ret < 0) if (ret < 0)
goto end; goto end;
pkgs[i].ntevs = ret; pkgs[i].ntevs = ret;
@ -2063,7 +2063,7 @@ static int filter_available_functions(struct map *map __unused,
return 1; 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; struct map *map;
int ret; int ret;
@ -2074,9 +2074,9 @@ int show_available_funcs(const char *module, struct strfilter *_filter)
if (ret < 0) if (ret < 0)
return ret; return ret;
map = kernel_get_module_map(module); map = kernel_get_module_map(target);
if (!map) { if (!map) {
pr_err("Failed to find %s map.\n", (module) ? : "kernel"); pr_err("Failed to find %s map.\n", (target) ? : "kernel");
return -EINVAL; return -EINVAL;
} }
available_func_filter = _filter; available_func_filter = _filter;