summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Zhao <henry.zhao@oracle.com>2016-05-25 14:06:49 -0700
committerEmil Velikov <emil.l.velikov@gmail.com>2017-04-04 13:22:25 +0100
commitfe556c48dad96717b0ba71d489575c6b90b46448 (patch)
tree426f211506e2d5caaab2c8a4ce1aaef0a173e9bc
parent0bd248f852f1f2a37396c98519eee6f50c434848 (diff)
downloadxorg-lib-libpciaccess-fe556c48dad96717b0ba71d489575c6b90b46448.tar.gz
use cached devinfo snapshots, remove unnecessary di_init()
Use cached devinfo (DINFOCACHE) in di_init(). Remove unnecessary di_init() on nexus nodes. Signed-off-by: Henry Zhao <henry.zhao@oracle.com> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
-rw-r--r--src/solx_devfs.c25
1 files changed, 5 insertions, 20 deletions
diff --git a/src/solx_devfs.c b/src/solx_devfs.c
index 15bb3b4..46fc301 100644
--- a/src/solx_devfs.c
+++ b/src/solx_devfs.c
@@ -1,6 +1,6 @@
/*
* (C) Copyright IBM Corporation 2006
- * Copyright (c) 2007, 2009, 2011, 2012, 2015 Oracle and/or its affiliates.
+ * Copyright (c) 2007, 2009, 2011, 2012, 2016 Oracle and/or its affiliates.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
@@ -65,7 +65,7 @@ typedef struct nexus {
int first_bus;
int last_bus;
int domain;
- char *path; /* for errors/debugging; fd is all we need */
+ char *path; /* for open */
char *dev_path;
struct nexus *next;
} nexus_t;
@@ -297,7 +297,6 @@ probe_nexus_node(di_node_t di_node, di_minor_t minor, void *arg)
int pci_node = 0;
int first_bus = 0, last_bus = PCI_REG_BUS_G(PCI_REG_BUS_M);
int domain = 0;
- di_node_t rnode = DI_NODE_NIL;
#ifdef __sparc
int bus_range_found = 0;
int device_type_found = 0;
@@ -423,21 +422,12 @@ probe_nexus_node(di_node_t di_node, di_minor_t minor, void *arg)
nexus->dev_path = strdup(nexus_dev_path);
di_devfs_path_free(nexus_dev_path);
- if ((rnode = di_init(nexus->dev_path, DINFOCPYALL)) == DI_NODE_NIL) {
- (void) fprintf(stderr, "di_init failed: %s\n", strerror(errno));
- close(fd);
- free(nexus->path);
- free(nexus->dev_path);
- free(nexus);
- return (DI_WALK_TERMINATE);
- }
-
/* Walk through devices under the rnode */
args.pinfo = pinfo;
args.nexus = nexus;
args.ret = 0;
- (void) di_walk_node(rnode, DI_WALK_CLDFIRST, (void *)&args, probe_device_node);
+ (void) di_walk_node(di_node, DI_WALK_CLDFIRST, (void *)&args, probe_device_node);
close(fd);
@@ -445,7 +435,6 @@ probe_nexus_node(di_node_t di_node, di_minor_t minor, void *arg)
free(nexus->path);
free(nexus->dev_path);
free(nexus);
- di_fini(rnode);
return (DI_WALK_TERMINATE);
}
@@ -457,10 +446,6 @@ probe_nexus_node(di_node_t di_node, di_minor_t minor, void *arg)
free(nexus);
}
- if (rnode != DI_NODE_NIL) {
- di_fini(rnode);
- }
-
return DI_WALK_CONTINUE;
}
@@ -553,7 +538,7 @@ pci_device_solx_devfs_probe( struct pci_device * dev )
* starting to find if it is MEM/MEM64/IO
* using libdevinfo
*/
- if ((rnode = di_init(nexus->dev_path, DINFOCPYALL)) == DI_NODE_NIL) {
+ if ((rnode = di_init(nexus->dev_path, DINFOCACHE)) == DI_NODE_NIL) {
err = errno;
(void) fprintf(stderr, "di_init failed: %s\n", strerror(errno));
} else {
@@ -1085,7 +1070,7 @@ pci_system_solx_devfs_create( void )
return 0;
}
- if ((di_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) {
+ if ((di_node = di_init("/", DINFOCACHE)) == DI_NODE_NIL) {
err = errno;
(void) fprintf(stderr, "di_init() failed: %s\n",
strerror(errno));