On Wed, Sep 7, 2022, at 2:56 PM, Ilpo Järvinen wrote: > On Wed, 7 Sep 2022, Greg Kroah-Hartman wrote: >> Ok, no, I don't understand what Arnd meant here then :( > > I think he did just 2 things (compared with 2/4 of this series): > > - __DEFINE_UART_PORT_TX_HELPER() doesn't create a function but just wraps > the macro body with ({ }). Therefore, a driver must use it inside > a function rather than the macro creating a new function with name. > - Use lowercase instead of uppercase (this is a trivial change) > > When a driver is using these "function" that are just made look functions > but are macros for real, it will not add function-pointer-indirection-call > per character but pulls the whole loop from the macro into the function > in the driver and injects those putchar, etc. directly into that loop. > ...It is just like read_poll_timeout() constructs the loop. Right, the example I was thinking of was wait_event(), which is another common macro that takes expressions as arguments but gets used like a function call. Same thing really. Note that even with an always_inline function that takes a function pointer argument, anything from gcc-4.7 up has no problem inlining through that, so it should not be any less efficient though it might not help readability either. See https://godbolt.org/z/o8GGG8TzM for an example of that. Arnd