You're right; even in the module there may be functions that you really do not need after initialization, and therefore, in principle, they can be deleted from memory. The reason __init does not affect modules, it is more about how easy it is to implement.
This answer to the question of nature __init sheds light on this topic. Essentially, the kernel build system looks for all the functions marked with __init in all parts of the kernel and arranges them so that they are all in the same memory block.
Then, when the kernel boots, it can immediately free one block of memory.
This pre-sorting does not work very well with modules. The initialization code must be loaded when the module is loaded, so it cannot use the space with another initialization code. Instead, the kernel would have to allocate several hundred bytes from each module and release them separately.
However, the size of the hardware pages is usually 4 KB, so it is difficult to free up memory in smaller pieces. Therefore, trying to free __init functions in each individual module is likely to be more of a problem than it costs.
source share