Recently, I have been studying the driver code and found that such a macro doesn't fully understand the purpose:
# Define e1000_roundup (I, size) (I) = (I) + (size)-1 )&~ (Size)-1 )))
This is the case when calling:
Unsigned int I = 4097;
E1000_roundup (I, 4096 );
However, I still don't know what to do after splitting this operation: the simplified expression is equivalent:
I = (I + 0x00000fff) | 0xfffff000;
After you execute the command, you can see that the value is a multiple of the page size (4096 bytes. That is to say, this macro is used to find the value greater than the minimum size of I. (Note that the size must be a multiple of 2)
How can I write this kind of code with low handwriting?
I = (0 = I % size )? I: (I/size + 1) * size;
Sorry, discrete mathematics didn't learn well. Looking at the kernel, it really benefited a lot!