Re: [PATCH v6] mm: Uninline copy_overflow()

From: Christophe Leroy
Date: Mon Feb 14 2022 - 08:21:33 EST




Le 14/02/2022 à 12:31, David Laight a écrit :
> From: Anshuman Khandual
>> Sent: 14 February 2022 09:54
> ...
>>> With -Winline, GCC tells:
>>>
>>> /include/linux/thread_info.h:212:20: warning: inlining failed in call to 'copy_overflow': call
>> is unlikely and code size would grow [-Winline]
>>>
>>> copy_overflow() is a non conditional warning called by
>>> check_copy_size() on an error path.
>>>
>>> check_copy_size() have to remain inlined in order to benefit
>>> from constant folding, but copy_overflow() is not worth inlining.
>>>
>>> Uninline the warning when CONFIG_BUG is selected.
>>>
>>> When CONFIG_BUG is not selected, WARN() does nothing so skip it.
>>>
>>> This reduces the size of vmlinux by almost 4kbytes.
>>
>
>>> +void __copy_overflow(int size, unsigned long count);
>>> +
>>> static inline void copy_overflow(int size, unsigned long count)
>>> {
>>> - WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
>>> + if (IS_ENABLED(CONFIG_BUG))
>>> + __copy_overflow(size, count);
>>> }
>
>> Just wondering, is this the only such scenario which results in
>> an avoidable bloated vmlinux image ?
>
> The more interesting question is whether the call to __copy_overflow()
> is actually significantly smaller than the one to WARN()?
> And if so why.
>
unsigned long tst_copy_to_user(void __user *to, unsigned long n)
{
return copy_to_user(to, &jiffies_64, n);
}

With the patch:

00003c78 <tst_copy_to_user>:
3c78: 28 04 00 08 cmplwi r4,8
3c7c: 7c 85 23 78 mr r5,r4
3c80: 41 81 00 10 bgt 3c90 <tst_copy_to_user+0x18>
3c84: 3c 80 00 00 lis r4,0
3c86: R_PPC_ADDR16_HA jiffies_64
3c88: 38 84 00 00 addi r4,r4,0
3c8a: R_PPC_ADDR16_LO jiffies_64
3c8c: 48 00 00 00 b 3c8c <tst_copy_to_user+0x14>
3c8c: R_PPC_REL24 _copy_to_user

3c90: 94 21 ff f0 stwu r1,-16(r1)
3c94: 7c 08 02 a6 mflr r0
3c98: 38 60 00 08 li r3,8
3c9c: 90 01 00 14 stw r0,20(r1)
3ca0: 90 81 00 08 stw r4,8(r1)
3ca4: 48 00 00 01 bl 3ca4 <tst_copy_to_user+0x2c>
3ca4: R_PPC_REL24 __copy_overflow
3ca8: 80 a1 00 08 lwz r5,8(r1)
3cac: 80 01 00 14 lwz r0,20(r1)
3cb0: 7c a3 2b 78 mr r3,r5
3cb4: 7c 08 03 a6 mtlr r0
3cb8: 38 21 00 10 addi r1,r1,16
3cbc: 4e 80 00 20 blr


Without the patch:

00003c88 <tst_copy_to_user>:
3c88: 28 04 00 08 cmplwi r4,8
3c8c: 7c 85 23 78 mr r5,r4
3c90: 41 81 00 10 bgt 3ca0 <tst_copy_to_user+0x18>
3c94: 3c 80 00 00 lis r4,0
3c96: R_PPC_ADDR16_HA jiffies_64
3c98: 38 84 00 00 addi r4,r4,0
3c9a: R_PPC_ADDR16_LO jiffies_64
3c9c: 48 00 00 00 b 3c9c <tst_copy_to_user+0x14>
3c9c: R_PPC_REL24 _copy_to_user

3ca0: 94 21 ff f0 stwu r1,-16(r1)
3ca4: 3c 60 00 00 lis r3,0
3ca6: R_PPC_ADDR16_HA .rodata.str1.4+0x30
3ca8: 90 81 00 08 stw r4,8(r1)
3cac: 7c 08 02 a6 mflr r0
3cb0: 38 63 00 00 addi r3,r3,0
3cb2: R_PPC_ADDR16_LO .rodata.str1.4+0x30
3cb4: 38 80 00 08 li r4,8
3cb8: 90 01 00 14 stw r0,20(r1)
3cbc: 48 00 00 01 bl 3cbc <tst_copy_to_user+0x34>
3cbc: R_PPC_REL24 __warn_printk
3cc0: 80 a1 00 08 lwz r5,8(r1)
3cc4: 0f e0 00 00 twui r0,0
3cc8: 80 01 00 14 lwz r0,20(r1)
3ccc: 7c a3 2b 78 mr r3,r5
3cd0: 7c 08 03 a6 mtlr r0
3cd4: 38 21 00 10 addi r1,r1,16
3cd8: 4e 80 00 20 blr