On Tue, May 28 2024 at 15:31, Jiaxun Yang wrote: > 在2024年5月27日五月 下午5:32,Jiaxun Yang写道: >> 在2024年5月27日五月 下午4:51,Thomas Gleixner写道: >>> Jiaxun! >>> >> Hi Thomas, >> [...] >>> >>> What's this indirection for? Why dont you update >> [...] >>> >>>> +static struct clocksource nodecnt_clocksource = { >>>> + .name = "nodecnt", >>>> + .read = nodecnt_clocksource_read, >>> >>> the read function pointer here and spare the indirection? >> Smart! sched_clock takes slightly different function pointer argument type >> but as we don't use the argument anyway, it should be safe to relax this >> indirection. > > Sadly, I'm unable to remove it with force type catsing :-/ > > drivers/clocksource/loongson-nodecnt.c: In function ‘nodecnt_clocksource_init’: > drivers/clocksource/loongson-nodecnt.c:89:36: warning: cast between incompatible function types from ‘u64 (*)(void)’ {aka ‘long long unsigned int (*)(void)’} to ‘u64 (*)(struct clocksource *)’ {aka ‘long long unsigned int (*)(struct clocksource *)’} [-Wcast-function-type] > 89 | nodecnt_clocksource.read = (u64 (*)(struct clocksource *))nodecnt_read_fn; > What about making the actual read functions have the required function signature? The clocksource argument is not used in those real functions. Thanks, tglx