* [patch 2/8] genksyms: allow to ignore symbol checksum changes
@ 2008-12-01 22:21 akpm
2008-12-03 21:33 ` Sam Ravnborg
0 siblings, 1 reply; 2+ messages in thread
From: akpm @ 2008-12-01 22:21 UTC (permalink / raw)
To: sam; +Cc: linux-kbuild, akpm, agruen, randy.dunlap
From: Andreas Gruenbacher <agruen@suse.de>
This adds an "override" keyword for use in *.symvers / *.symref files.
When a symbol is overridden, the symbol's old definition will be used for
computing checksums instead of the new one, preserving the previous
checksum. (Genksyms will still warn about the change.)
This is meant to allow distributions to hide minor actual as well as fake
ABI changes. (For example, when extra type information becomes available
because additional headers are included, this may change checksums even
though none of the types used have actully changed.)
This approach also allows to get rid of "#ifdef __GENKSYMS__" hacks in the
code, which are currently used in some vendor kernels to work around
checksum changes.
Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
scripts/genksyms/genksyms.c | 34 ++++++++++++++++++++++++++++++----
scripts/genksyms/genksyms.h | 1 +
2 files changed, 31 insertions(+), 4 deletions(-)
diff -puN scripts/genksyms/genksyms.c~genksyms-allow-to-ignore-symbol-checksum-changes scripts/genksyms/genksyms.c
--- a/scripts/genksyms/genksyms.c~genksyms-allow-to-ignore-symbol-checksum-changes
+++ a/scripts/genksyms/genksyms.c
@@ -191,11 +191,26 @@ struct symbol *__add_symbol(const char *
/* fall through */ ;
else if (sym->type == type &&
equal_list(sym->defn, defn)) {
+ if (!sym->is_declared && sym->is_override) {
+ print_location();
+ print_type_name(type, name);
+ fprintf(stderr, " modversion is "
+ "unchanged\n");
+ }
sym->is_declared = 1;
return sym;
} else if (!sym->is_declared) {
- status = is_unknown_symbol(sym) ?
- STATUS_DEFINED : STATUS_MODIFIED;
+ if (sym->is_override && flag_preserve) {
+ print_location();
+ fprintf(stderr, "ignoring ");
+ print_type_name(type, name);
+ fprintf(stderr, " modversion change\n");
+ sym->is_declared = 1;
+ return sym;
+ } else {
+ status = is_unknown_symbol(sym) ?
+ STATUS_DEFINED : STATUS_MODIFIED;
+ }
} else {
error_with_pos("redefinition of %s", name);
return sym;
@@ -229,6 +244,7 @@ struct symbol *__add_symbol(const char *
sym->is_declared = !is_reference;
sym->status = status;
+ sym->is_override = 0;
if (flag_debug) {
fprintf(debugfile, "Defn for %s %s == <",
@@ -348,9 +364,16 @@ static void read_reference(FILE *f)
while (!feof(f)) {
struct string_list *defn = NULL;
struct string_list *sym, *def;
- int is_extern = 0;
+ int is_extern = 0, is_override = 0;
+ struct symbol *subsym;
sym = read_node(f);
+ if (sym && sym->tag == SYM_NORMAL &&
+ !strcmp(sym->string, "override")) {
+ is_override = 1;
+ free_node(sym);
+ sym = read_node(f);
+ }
if (!sym)
continue;
def = read_node(f);
@@ -365,8 +388,9 @@ static void read_reference(FILE *f)
defn = def;
def = read_node(f);
}
- add_reference_symbol(xstrdup(sym->string), sym->tag,
+ subsym = add_reference_symbol(xstrdup(sym->string), sym->tag,
defn, is_extern);
+ subsym->is_override = is_override;
free_node(sym);
}
}
@@ -743,6 +767,8 @@ int main(int argc, char **argv)
while (visited_symbols != (struct symbol *)-1L) {
struct symbol *sym = visited_symbols;
+ if (sym->is_override)
+ fputs("override ", dumpfile);
if (sym->type != SYM_NORMAL) {
putc(symbol_type_name[sym->type][0], dumpfile);
putc('#', dumpfile);
diff -puN scripts/genksyms/genksyms.h~genksyms-allow-to-ignore-symbol-checksum-changes scripts/genksyms/genksyms.h
--- a/scripts/genksyms/genksyms.h~genksyms-allow-to-ignore-symbol-checksum-changes
+++ a/scripts/genksyms/genksyms.h
@@ -49,6 +49,7 @@ struct symbol {
int is_extern;
int is_declared;
enum symbol_status status;
+ int is_override;
};
typedef struct string_list **yystype;
_
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [patch 2/8] genksyms: allow to ignore symbol checksum changes
2008-12-01 22:21 [patch 2/8] genksyms: allow to ignore symbol checksum changes akpm
@ 2008-12-03 21:33 ` Sam Ravnborg
0 siblings, 0 replies; 2+ messages in thread
From: Sam Ravnborg @ 2008-12-03 21:33 UTC (permalink / raw)
To: akpm; +Cc: linux-kbuild, agruen, randy.dunlap
On Mon, Dec 01, 2008 at 02:21:03PM -0800, akpm@linux-foundation.org wrote:
> From: Andreas Gruenbacher <agruen@suse.de>
>
> This adds an "override" keyword for use in *.symvers / *.symref files.
> When a symbol is overridden, the symbol's old definition will be used for
> computing checksums instead of the new one, preserving the previous
> checksum. (Genksyms will still warn about the change.)
>
> This is meant to allow distributions to hide minor actual as well as fake
> ABI changes. (For example, when extra type information becomes available
> because additional headers are included, this may change checksums even
> though none of the types used have actully changed.)
>
> This approach also allows to get rid of "#ifdef __GENKSYMS__" hacks in the
> code, which are currently used in some vendor kernels to work around
> checksum changes.
>
> Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Cc: Randy Dunlap <randy.dunlap@oracle.com>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Applied.
Sam
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-12-03 21:32 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-01 22:21 [patch 2/8] genksyms: allow to ignore symbol checksum changes akpm
2008-12-03 21:33 ` Sam Ravnborg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox