| From 75757507e014fa074d25d2883c4ab604999584bd Mon Sep 17 00:00:00 2001 |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Date: Fri, 4 Dec 2009 10:24:19 -0800 |
| Subject: DMI: allow omitting ident strings in DMI tables |
| |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| |
| commit 75757507e014fa074d25d2883c4ab604999584bd upstream. |
| |
| The purpose of dmi->ident is twofold - it may be used by DMI callback |
| functions when composing log messages; it is also used to determine |
| end of DMI table in dmi_check_system() and dmi_first_match(). However, |
| in case when callbacks are not interested in using ident at all it just |
| wastes memory. Let's make entries with empty first match slot serve as |
| end-of-table markers instead. |
| |
| [needed for DMI table changes that need to be done by later patches - gkh] |
| |
| Acked-by: Jean Delvare <khali@linux-fr.org> |
| Signed-off-by: Dmitry Torokhov <dtor@mail.ru> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/firmware/dmi_scan.c | 15 ++++++++++++--- |
| 1 file changed, 12 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/firmware/dmi_scan.c |
| +++ b/drivers/firmware/dmi_scan.c |
| @@ -429,7 +429,7 @@ static bool dmi_matches(const struct dmi |
| for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) { |
| int s = dmi->matches[i].slot; |
| if (s == DMI_NONE) |
| - continue; |
| + break; |
| if (dmi_ident[s] |
| && strstr(dmi_ident[s], dmi->matches[i].substr)) |
| continue; |
| @@ -440,6 +440,15 @@ static bool dmi_matches(const struct dmi |
| } |
| |
| /** |
| + * dmi_is_end_of_table - check for end-of-table marker |
| + * @dmi: pointer to the dmi_system_id structure to check |
| + */ |
| +static bool dmi_is_end_of_table(const struct dmi_system_id *dmi) |
| +{ |
| + return dmi->matches[0].slot == DMI_NONE; |
| +} |
| + |
| +/** |
| * dmi_check_system - check system DMI data |
| * @list: array of dmi_system_id structures to match against |
| * All non-null elements of the list must match |
| @@ -457,7 +466,7 @@ int dmi_check_system(const struct dmi_sy |
| int count = 0; |
| const struct dmi_system_id *d; |
| |
| - for (d = list; d->ident; d++) |
| + for (d = list; !dmi_is_end_of_table(d); d++) |
| if (dmi_matches(d)) { |
| count++; |
| if (d->callback && d->callback(d)) |
| @@ -484,7 +493,7 @@ const struct dmi_system_id *dmi_first_ma |
| { |
| const struct dmi_system_id *d; |
| |
| - for (d = list; d->ident; d++) |
| + for (d = list; !dmi_is_end_of_table(d); d++) |
| if (dmi_matches(d)) |
| return d; |
| |