perf/x86/uncore: Handle pci_read_config_dword() errors

This, beyond handling corner cases, also fixes some build warnings:

 arch/x86/kernel/cpu/perf_event_intel_uncore.c: In function ‘snbep_uncore_pci_disable_box’:
 arch/x86/kernel/cpu/perf_event_intel_uncore.c:124:9: warning: ‘config’ is used uninitialized in this function [-Wuninitialized]
 arch/x86/kernel/cpu/perf_event_intel_uncore.c: In function ‘snbep_uncore_pci_enable_box’:
 arch/x86/kernel/cpu/perf_event_intel_uncore.c:135:9: warning: ‘config’ is used uninitialized in this function [-Wuninitialized]
 arch/x86/kernel/cpu/perf_event_intel_uncore.c: In function ‘snbep_uncore_pci_read_counter’:
 arch/x86/kernel/cpu/perf_event_intel_uncore.c:164:2: warning: ‘count’ is used uninitialized in this function [-Wuninitialized]

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Cc: a.p.zijlstra@chello.nl
Link: http://lkml.kernel.org/r/1351068140-13456-1-git-send-email-zheng.z.yan@intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Yan, Zheng 2012-10-24 16:42:20 +08:00 committed by Ingo Molnar
parent 58e9eaf06f
commit 032c3851f5

View file

@ -118,22 +118,24 @@ static void snbep_uncore_pci_disable_box(struct intel_uncore_box *box)
{ {
struct pci_dev *pdev = box->pci_dev; struct pci_dev *pdev = box->pci_dev;
int box_ctl = uncore_pci_box_ctl(box); int box_ctl = uncore_pci_box_ctl(box);
u32 config; u32 config = 0;
pci_read_config_dword(pdev, box_ctl, &config); if (!pci_read_config_dword(pdev, box_ctl, &config)) {
config |= SNBEP_PMON_BOX_CTL_FRZ; config |= SNBEP_PMON_BOX_CTL_FRZ;
pci_write_config_dword(pdev, box_ctl, config); pci_write_config_dword(pdev, box_ctl, config);
}
} }
static void snbep_uncore_pci_enable_box(struct intel_uncore_box *box) static void snbep_uncore_pci_enable_box(struct intel_uncore_box *box)
{ {
struct pci_dev *pdev = box->pci_dev; struct pci_dev *pdev = box->pci_dev;
int box_ctl = uncore_pci_box_ctl(box); int box_ctl = uncore_pci_box_ctl(box);
u32 config; u32 config = 0;
pci_read_config_dword(pdev, box_ctl, &config); if (!pci_read_config_dword(pdev, box_ctl, &config)) {
config &= ~SNBEP_PMON_BOX_CTL_FRZ; config &= ~SNBEP_PMON_BOX_CTL_FRZ;
pci_write_config_dword(pdev, box_ctl, config); pci_write_config_dword(pdev, box_ctl, config);
}
} }
static void snbep_uncore_pci_enable_event(struct intel_uncore_box *box, struct perf_event *event) static void snbep_uncore_pci_enable_event(struct intel_uncore_box *box, struct perf_event *event)
@ -156,7 +158,7 @@ static u64 snbep_uncore_pci_read_counter(struct intel_uncore_box *box, struct pe
{ {
struct pci_dev *pdev = box->pci_dev; struct pci_dev *pdev = box->pci_dev;
struct hw_perf_event *hwc = &event->hw; struct hw_perf_event *hwc = &event->hw;
u64 count; u64 count = 0;
pci_read_config_dword(pdev, hwc->event_base, (u32 *)&count); pci_read_config_dword(pdev, hwc->event_base, (u32 *)&count);
pci_read_config_dword(pdev, hwc->event_base + 4, (u32 *)&count + 1); pci_read_config_dword(pdev, hwc->event_base + 4, (u32 *)&count + 1);
@ -603,11 +605,12 @@ static struct pci_driver snbep_uncore_pci_driver = {
/* /*
* build pci bus to socket mapping * build pci bus to socket mapping
*/ */
static void snbep_pci2phy_map_init(void) static int snbep_pci2phy_map_init(void)
{ {
struct pci_dev *ubox_dev = NULL; struct pci_dev *ubox_dev = NULL;
int i, bus, nodeid; int i, bus, nodeid;
u32 config; int err = 0;
u32 config = 0;
while (1) { while (1) {
/* find the UBOX device */ /* find the UBOX device */
@ -618,10 +621,14 @@ static void snbep_pci2phy_map_init(void)
break; break;
bus = ubox_dev->bus->number; bus = ubox_dev->bus->number;
/* get the Node ID of the local register */ /* get the Node ID of the local register */
pci_read_config_dword(ubox_dev, 0x40, &config); err = pci_read_config_dword(ubox_dev, 0x40, &config);
if (err)
break;
nodeid = config; nodeid = config;
/* get the Node ID mapping */ /* get the Node ID mapping */
pci_read_config_dword(ubox_dev, 0x54, &config); err = pci_read_config_dword(ubox_dev, 0x54, &config);
if (err)
break;
/* /*
* every three bits in the Node ID mapping register maps * every three bits in the Node ID mapping register maps
* to a particular node. * to a particular node.
@ -633,7 +640,11 @@ static void snbep_pci2phy_map_init(void)
} }
} }
}; };
return;
if (ubox_dev)
pci_dev_put(ubox_dev);
return err ? pcibios_err_to_errno(err) : 0;
} }
/* end of Sandy Bridge-EP uncore support */ /* end of Sandy Bridge-EP uncore support */
@ -2578,9 +2589,11 @@ static int __init uncore_pci_init(void)
switch (boot_cpu_data.x86_model) { switch (boot_cpu_data.x86_model) {
case 45: /* Sandy Bridge-EP */ case 45: /* Sandy Bridge-EP */
ret = snbep_pci2phy_map_init();
if (ret)
return ret;
pci_uncores = snbep_pci_uncores; pci_uncores = snbep_pci_uncores;
uncore_pci_driver = &snbep_uncore_pci_driver; uncore_pci_driver = &snbep_uncore_pci_driver;
snbep_pci2phy_map_init();
break; break;
default: default:
return 0; return 0;