aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorRobert Love <robert.w.love@intel.com>2012-11-27 01:53:19 -0500
committerRobert Love <robert.w.love@intel.com>2012-12-04 13:16:38 -0500
commitef60f674344cdb6d1da199f6b8d7d7016813cc6f (patch)
treeaafc59aa0fe5fd86e29c01abc882f819a8239725 /drivers/scsi
parent354d1123c16942b8a3ca9131b8fc2f8c06e2ed7f (diff)
libfcoe: Save some memory and optimize name lookups
Instead of creating a structure with an enum and a pointer to a string, simply allocate an array of strings and use the enum values for the indicies. This means that we do not need to iterate through the list of entries when looking up a string name by its enum key. This will also help with a latter patch that will add more fcoe_sysfs attributes that will also use the fcoe_enum_name_search macro. One attribute will also do a reverse lookup which requires less code when the enum-to-string mappings are organized as this patch makes them to be. Signed-off-by: Robert Love <robert.w.love@intel.com> Acked-by: Neil Horman <nhorman@tuxdriver.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/fcoe/fcoe_sysfs.c44
1 files changed, 16 insertions, 28 deletions
diff --git a/drivers/scsi/fcoe/fcoe_sysfs.c b/drivers/scsi/fcoe/fcoe_sysfs.c
index 5e751689a089..e6fce2862a33 100644
--- a/drivers/scsi/fcoe/fcoe_sysfs.c
+++ b/drivers/scsi/fcoe/fcoe_sysfs.c
@@ -210,25 +210,23 @@ static ssize_t show_fcoe_fcf_device_##field(struct device *dev, \
210#define fcoe_enum_name_search(title, table_type, table) \ 210#define fcoe_enum_name_search(title, table_type, table) \
211static const char *get_fcoe_##title##_name(enum table_type table_key) \ 211static const char *get_fcoe_##title##_name(enum table_type table_key) \
212{ \ 212{ \
213 int i; \ 213 if (table_key < 0 || table_key >= ARRAY_SIZE(table)) \
214 char *name = NULL; \ 214 return NULL; \
215 \ 215 return table[table_key]; \
216 for (i = 0; i < ARRAY_SIZE(table); i++) { \
217 if (table[i].value == table_key) { \
218 name = table[i].name; \
219 break; \
220 } \
221 } \
222 return name; \
223} 216}
224 217
225static struct { 218static char *fip_conn_type_names[] = {
226 enum fcf_state value; 219 [ FIP_CONN_TYPE_UNKNOWN ] = "Unknown",
227 char *name; 220 [ FIP_CONN_TYPE_FABRIC ] = "Fabric",
228} fcf_state_names[] = { 221 [ FIP_CONN_TYPE_VN2VN ] = "VN2VN",
229 { FCOE_FCF_STATE_UNKNOWN, "Unknown" }, 222};
230 { FCOE_FCF_STATE_DISCONNECTED, "Disconnected" }, 223fcoe_enum_name_search(ctlr_mode, fip_conn_type, fip_conn_type_names)
231 { FCOE_FCF_STATE_CONNECTED, "Connected" }, 224#define FCOE_CTLR_MODE_MAX_NAMELEN 50
225
226static char *fcf_state_names[] = {
227 [ FCOE_FCF_STATE_UNKNOWN ] = "Unknown",
228 [ FCOE_FCF_STATE_DISCONNECTED ] = "Disconnected",
229 [ FCOE_FCF_STATE_CONNECTED ] = "Connected",
232}; 230};
233fcoe_enum_name_search(fcf_state, fcf_state, fcf_state_names) 231fcoe_enum_name_search(fcf_state, fcf_state, fcf_state_names)
234#define FCOE_FCF_STATE_MAX_NAMELEN 50 232#define FCOE_FCF_STATE_MAX_NAMELEN 50
@@ -246,17 +244,7 @@ static ssize_t show_fcf_state(struct device *dev,
246} 244}
247static FCOE_DEVICE_ATTR(fcf, state, S_IRUGO, show_fcf_state, NULL); 245static FCOE_DEVICE_ATTR(fcf, state, S_IRUGO, show_fcf_state, NULL);
248 246
249static struct { 247#define FCOE_MAX_MODENAME_LEN 20
250 enum fip_conn_type value;
251 char *name;
252} fip_conn_type_names[] = {
253 { FIP_CONN_TYPE_UNKNOWN, "Unknown" },
254 { FIP_CONN_TYPE_FABRIC, "Fabric" },
255 { FIP_CONN_TYPE_VN2VN, "VN2VN" },
256};
257fcoe_enum_name_search(ctlr_mode, fip_conn_type, fip_conn_type_names)
258#define FCOE_CTLR_MODE_MAX_NAMELEN 50
259
260static ssize_t show_ctlr_mode(struct device *dev, 248static ssize_t show_ctlr_mode(struct device *dev,
261 struct device_attribute *attr, 249 struct device_attribute *attr,
262 char *buf) 250 char *buf)