Re: [PATCH v2] libfcoe: Save some memory and optimize name lookups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 14, 2012 at 02:02:18PM -0800, Robert Love wrote:
> 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@xxxxxxxxx>
> Acked-by: Neil Horman <nhorman@xxxxxxxxxxxxx>
> ---
>  drivers/scsi/fcoe/fcoe_sysfs.c |   44 +++++++++++++++-------------------------
>  1 file changed, 16 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/scsi/fcoe/fcoe_sysfs.c b/drivers/scsi/fcoe/fcoe_sysfs.c
> index 5e75168..e6fce28 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,	\
>  #define fcoe_enum_name_search(title, table_type, table)			\
>  static const char *get_fcoe_##title##_name(enum table_type table_key)	\
>  {									\
> -	int i;								\
> -	char *name = NULL;						\
> -									\
> -	for (i = 0; i < ARRAY_SIZE(table); i++) {			\
> -		if (table[i].value == table_key) {			\
> -			name = table[i].name;				\
> -			break;						\
> -		}							\
> -	}								\
> -	return name;							\
> +	if (table_key < 0 || table_key >= ARRAY_SIZE(table))		\
> +		return NULL;						\
> +	return table[table_key];					\
>  }
>  
> -static struct {
> -	enum fcf_state value;
> -	char           *name;
> -} fcf_state_names[] = {
> -	{ FCOE_FCF_STATE_UNKNOWN,      "Unknown" },
> -	{ FCOE_FCF_STATE_DISCONNECTED, "Disconnected" },
> -	{ FCOE_FCF_STATE_CONNECTED,    "Connected" },
> +static char *fip_conn_type_names[] = {
> +	[ FIP_CONN_TYPE_UNKNOWN ] = "Unknown",
> +	[ FIP_CONN_TYPE_FABRIC ]  = "Fabric",
> +	[ FIP_CONN_TYPE_VN2VN ]   = "VN2VN",
> +};
> +fcoe_enum_name_search(ctlr_mode, fip_conn_type, fip_conn_type_names)
> +#define FCOE_CTLR_MODE_MAX_NAMELEN 50
> +
> +static char *fcf_state_names[] = {
> +	[ FCOE_FCF_STATE_UNKNOWN ]      = "Unknown",
> +	[ FCOE_FCF_STATE_DISCONNECTED ] = "Disconnected",
> +	[ FCOE_FCF_STATE_CONNECTED ]    = "Connected",
>  };
>  fcoe_enum_name_search(fcf_state, fcf_state, fcf_state_names)
>  #define FCOE_FCF_STATE_MAX_NAMELEN 50
> @@ -246,17 +244,7 @@ static ssize_t show_fcf_state(struct device *dev,
>  }
>  static FCOE_DEVICE_ATTR(fcf, state, S_IRUGO, show_fcf_state, NULL);
>  
> -static struct {
> -	enum fip_conn_type value;
> -	char               *name;
> -} fip_conn_type_names[] = {
> -	{ FIP_CONN_TYPE_UNKNOWN, "Unknown" },
> -	{ FIP_CONN_TYPE_FABRIC, "Fabric" },
> -	{ FIP_CONN_TYPE_VN2VN, "VN2VN" },
> -};
> -fcoe_enum_name_search(ctlr_mode, fip_conn_type, fip_conn_type_names)
> -#define FCOE_CTLR_MODE_MAX_NAMELEN 50
> -
> +#define FCOE_MAX_MODENAME_LEN 20
>  static ssize_t show_ctlr_mode(struct device *dev,
>  			      struct device_attribute *attr,
>  			      char *buf)
> 
> 
Acked-by: Neil Horman <nhorman@xxxxxxxxxxxxx>

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux