Re: [PATCH 08/46] kernel: MOve prototype declaration to header file include/linux/perf_event.h

josh
2014-02-27T22:55:50Z

On Thu, Feb 27, 2014 at 08:23:35PM +0100, Peter Zijlstra wrote:
> On Thu, Feb 27, 2014 at 07:51:50AM -0800, Josh Triplett wrote:
> > On Thu, Feb 27, 2014 at 12:54:14PM +0100, Peter Zijlstra wrote:
> > > On Thu, Feb 27, 2014 at 05:02:48PM +0530, Rashika Kheria wrote:
> > > > Add prototype declaration of function to header file
> > > > include/linux/perf_event.h because it is used by more than one file.
> > > >
> > > > This eliminates the following warning in kernel/events/core.c:
> > > > kernel/events/core.c:3743:13: warning: no previous prototype for ‘arch_perf_update_userpage’ [-Wmissing-prototypes]
> > >
> > > # git grep arch_perf_update_userpage
> > > arch/x86/kernel/cpu/perf_event.c:void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now)
> > > kernel/events/core.c:void __weak arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now)
> > > kernel/events/core.c: arch_perf_update_userpage(userpg, now);
> > >
> > >
> > > There's two definitions; one weak, and one usage site.
> > >
> > > What gives?
> >
> > There's no prototype for the function anywhere, so -Wmissing-prototypes
> > rightfully complains. Adding the prototype to a header included in both
> > source files ensures that the function signatures must match, and
> > eliminates the warning.
>
> Definitions don't require prior declarations. Only usage without prior
> definitions require them.
>
> I still don't see a problem.

There's value in -Wmissing-prototypes; it's equivalent to the Sparse
check that ensures functions are marked as static when they're not used
outside the file they're defined in (though unlike the Sparse check it
only applies to functions, not data). The goal isn't "make the warning
go away"; the goal of passing -Wmissing-prototypes is:

- Get rid of unused functions (many of which have been caught by this
effort).
- Mark functions as static where possible (which enables the above and
also improves code generation).
- Include headers that declare functions in the source files that define
them, not just in the source files that use them. That keeps the
declaration and definition in sync (which has caught some real bugs as
part of this effort).
- When no such header exists for a function used across multiple files,
add the prototype to an appropriate header and use that. Again, this
has caught real bugs as part of this effort, when the definition and
use were out of sync. (For instance, disagreeing in return type.)