* [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion
@ 2024-09-11 15:34 Lorenzo Stoakes
2024-09-11 16:24 ` Hans de Goede
2024-09-11 17:01 ` Andrew Lunn
0 siblings, 2 replies; 9+ messages in thread
From: Lorenzo Stoakes @ 2024-09-11 15:34 UTC (permalink / raw)
To: Andrew Morton
Cc: Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Hans de Goede, Mauro Carvalho Chehab, Sakari Ailus,
Greg Kroah-Hartman, Marcin Wojtas, Russell King,
David S . Miller, Arnd Bergmann, Linus Torvalds, netdev,
linux-kernel, linux-media, linux-staging, linux-mm, stable
Avoid nested min()/max() which results in egregious macro expansion.
This issue was introduced by commit 867046cc7027 ("minmax: relax check to
allow comparison between unsigned arguments and signed constants") [2].
Work has been done to address the issue of egregious min()/max() macro
expansion in commit 22f546873149 ("minmax: improve macro expansion and type
checking") and related, however it appears that some issues remain on more
tightly constrained systems.
Adjust a few known-bad cases of deeply nested macros to avoid doing so to
mitigate this. Porting the patch first proposed in [1] to Linus's tree.
Running an allmodconfig build using the methodology described in [2] we
observe a 35 MiB reduction in generated code.
The difference is much more significant prior to recent minmax fixes which
were not backported. As per [1] prior these the reduction is more like 200
MiB.
This resolves an issue with slackware 15.0 32-bit compilation as reported
by Richard Narron.
Presumably the min/max fixups would be difficult to backport, this patch
should be easier and fix's Richard's problem in 5.15.
[0]:https://lore.kernel.org/all/b97faef60ad24922b530241c5d7c933c@AcuMS.aculab.com/
[1]:https://lore.kernel.org/lkml/5882b96e-1287-4390-8174-3316d39038ef@lucifer.local/
[2]:https://lore.kernel.org/linux-mm/36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local/
Reported-by: Richard Narron <richard@aaazen.com>
Closes: https://lore.kernel.org/all/4a5321bd-b1f-1832-f0c-cea8694dc5aa@aaazen.com/
Fixes: 867046cc7027 ("minmax: relax check to allow comparison between unsigned arguments and signed constants")
Cc: stable@vger.kernel.org
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
---
drivers/net/ethernet/marvell/mvpp2/mvpp2.h | 2 +-
.../staging/media/atomisp/pci/sh_css_frac.h | 26 ++++++++++++++-----
include/linux/skbuff.h | 6 ++++-
3 files changed, 25 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
index e809f91c08fb..8b431f90efc3 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
@@ -23,7 +23,7 @@
/* The PacketOffset field is measured in units of 32 bytes and is 3 bits wide,
* so the maximum offset is 7 * 32 = 224
*/
-#define MVPP2_SKB_HEADROOM min(max(XDP_PACKET_HEADROOM, NET_SKB_PAD), 224)
+#define MVPP2_SKB_HEADROOM clamp_t(int, XDP_PACKET_HEADROOM, NET_SKB_PAD, 224)
#define MVPP2_XDP_PASS 0
#define MVPP2_XDP_DROPPED BIT(0)
diff --git a/drivers/staging/media/atomisp/pci/sh_css_frac.h b/drivers/staging/media/atomisp/pci/sh_css_frac.h
index b90b5b330dfa..a973394c5bc0 100644
--- a/drivers/staging/media/atomisp/pci/sh_css_frac.h
+++ b/drivers/staging/media/atomisp/pci/sh_css_frac.h
@@ -32,12 +32,24 @@
#define uISP_VAL_MAX ((unsigned int)((1 << uISP_REG_BIT) - 1))
/* a:fraction bits for 16bit precision, b:fraction bits for ISP precision */
-#define sDIGIT_FITTING(v, a, b) \
- min_t(int, max_t(int, (((v) >> sSHIFT) >> max(sFRACTION_BITS_FITTING(a) - (b), 0)), \
- sISP_VAL_MIN), sISP_VAL_MAX)
-#define uDIGIT_FITTING(v, a, b) \
- min((unsigned int)max((unsigned)(((v) >> uSHIFT) \
- >> max((int)(uFRACTION_BITS_FITTING(a) - (b)), 0)), \
- uISP_VAL_MIN), uISP_VAL_MAX)
+static inline int sDIGIT_FITTING(short v, int a, int b)
+{
+ int fit_shift = sFRACTION_BITS_FITTING(a) - b;
+
+ v >>= sSHIFT;
+ v >>= fit_shift > 0 ? fit_shift : 0;
+
+ return clamp_t(int, v, sISP_VAL_MIN, sISP_VAL_MAX);
+}
+
+static inline unsigned int uDIGIT_FITTING(unsigned int v, int a, int b)
+{
+ int fit_shift = uFRACTION_BITS_FITTING(a) - b;
+
+ v >>= uSHIFT;
+ v >>= fit_shift > 0 ? fit_shift : 0;
+
+ return clamp_t(unsigned int, v, uISP_VAL_MIN, uISP_VAL_MAX);
+}
#endif /* __SH_CSS_FRAC_H */
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 29c3ea5b6e93..d53b296df504 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -3164,7 +3164,11 @@ static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len)
* NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
*/
#ifndef NET_SKB_PAD
-#define NET_SKB_PAD max(32, L1_CACHE_BYTES)
+#if L1_CACHE_BYTES < 32
+#define NET_SKB_PAD 32
+#else
+#define NET_SKB_PAD L1_CACHE_BYTES
+#endif
#endif
int ___pskb_trim(struct sk_buff *skb, unsigned int len);
--
2.46.0
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion 2024-09-11 15:34 [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion Lorenzo Stoakes @ 2024-09-11 16:24 ` Hans de Goede 2024-09-11 16:37 ` Lorenzo Stoakes 2024-09-11 17:25 ` Dan Carpenter 2024-09-11 17:01 ` Andrew Lunn 1 sibling, 2 replies; 9+ messages in thread From: Hans de Goede @ 2024-09-11 16:24 UTC (permalink / raw) To: Lorenzo Stoakes, Andrew Morton Cc: Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Mauro Carvalho Chehab, Sakari Ailus, Greg Kroah-Hartman, Marcin Wojtas, Russell King, David S . Miller, Arnd Bergmann, Linus Torvalds, netdev, linux-kernel, linux-media, linux-staging, linux-mm, stable Hi Lorenzo, On 9/11/24 5:34 PM, Lorenzo Stoakes wrote: > Avoid nested min()/max() which results in egregious macro expansion. > > This issue was introduced by commit 867046cc7027 ("minmax: relax check to > allow comparison between unsigned arguments and signed constants") [2]. > > Work has been done to address the issue of egregious min()/max() macro > expansion in commit 22f546873149 ("minmax: improve macro expansion and type > checking") and related, however it appears that some issues remain on more > tightly constrained systems. > > Adjust a few known-bad cases of deeply nested macros to avoid doing so to > mitigate this. Porting the patch first proposed in [1] to Linus's tree. > > Running an allmodconfig build using the methodology described in [2] we > observe a 35 MiB reduction in generated code. > > The difference is much more significant prior to recent minmax fixes which > were not backported. As per [1] prior these the reduction is more like 200 > MiB. > > This resolves an issue with slackware 15.0 32-bit compilation as reported > by Richard Narron. > > Presumably the min/max fixups would be difficult to backport, this patch > should be easier and fix's Richard's problem in 5.15. > > [0]:https://lore.kernel.org/all/b97faef60ad24922b530241c5d7c933c@AcuMS.aculab.com/ > [1]:https://lore.kernel.org/lkml/5882b96e-1287-4390-8174-3316d39038ef@lucifer.local/ > [2]:https://lore.kernel.org/linux-mm/36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local/ > > Reported-by: Richard Narron <richard@aaazen.com> > Closes: https://lore.kernel.org/all/4a5321bd-b1f-1832-f0c-cea8694dc5aa@aaazen.com/ > Fixes: 867046cc7027 ("minmax: relax check to allow comparison between unsigned arguments and signed constants") > Cc: stable@vger.kernel.org > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Thank you for your patch. I must say that I'm not a fan of that this is patching 3 totally unrelated files here in a single patch. This is e.g. going to be a problem if we need to revert one of the changes because of regressions... So I would prefer this to be split into 3 patches. One review comment for the atomisp bits inline / below. > --- > drivers/net/ethernet/marvell/mvpp2/mvpp2.h | 2 +- > .../staging/media/atomisp/pci/sh_css_frac.h | 26 ++++++++++++++----- > include/linux/skbuff.h | 6 ++++- > 3 files changed, 25 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h > index e809f91c08fb..8b431f90efc3 100644 > --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h > +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h > @@ -23,7 +23,7 @@ > /* The PacketOffset field is measured in units of 32 bytes and is 3 bits wide, > * so the maximum offset is 7 * 32 = 224 > */ > -#define MVPP2_SKB_HEADROOM min(max(XDP_PACKET_HEADROOM, NET_SKB_PAD), 224) > +#define MVPP2_SKB_HEADROOM clamp_t(int, XDP_PACKET_HEADROOM, NET_SKB_PAD, 224) > > #define MVPP2_XDP_PASS 0 > #define MVPP2_XDP_DROPPED BIT(0) > diff --git a/drivers/staging/media/atomisp/pci/sh_css_frac.h b/drivers/staging/media/atomisp/pci/sh_css_frac.h > index b90b5b330dfa..a973394c5bc0 100644 > --- a/drivers/staging/media/atomisp/pci/sh_css_frac.h > +++ b/drivers/staging/media/atomisp/pci/sh_css_frac.h > @@ -32,12 +32,24 @@ > #define uISP_VAL_MAX ((unsigned int)((1 << uISP_REG_BIT) - 1)) > > /* a:fraction bits for 16bit precision, b:fraction bits for ISP precision */ > -#define sDIGIT_FITTING(v, a, b) \ > - min_t(int, max_t(int, (((v) >> sSHIFT) >> max(sFRACTION_BITS_FITTING(a) - (b), 0)), \ > - sISP_VAL_MIN), sISP_VAL_MAX) > -#define uDIGIT_FITTING(v, a, b) \ > - min((unsigned int)max((unsigned)(((v) >> uSHIFT) \ > - >> max((int)(uFRACTION_BITS_FITTING(a) - (b)), 0)), \ > - uISP_VAL_MIN), uISP_VAL_MAX) > +static inline int sDIGIT_FITTING(short v, int a, int b) > +{ drivers/staging/media/atomisp/pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a.host.c calls this with ia_css_3a_config.af_fir1_coef / .af_fir2_coef as first argument those are of the ia_css_s0_15 type which is: /* Signed fixed point value, 0 integer bits, 15 fractional bits */ typedef s32 ia_css_s0_15; please replace the "short v" with "int v" I think that you can then also replace clamp_t() with clamp() > + int fit_shift = sFRACTION_BITS_FITTING(a) - b; > + > + v >>= sSHIFT; > + v >>= fit_shift > 0 ? fit_shift : 0; > + > + return clamp_t(int, v, sISP_VAL_MIN, sISP_VAL_MAX); > +} > + > +static inline unsigned int uDIGIT_FITTING(unsigned int v, int a, int b) > +{ > + int fit_shift = uFRACTION_BITS_FITTING(a) - b; > + > + v >>= uSHIFT; > + v >>= fit_shift > 0 ? fit_shift : 0; > + > + return clamp_t(unsigned int, v, uISP_VAL_MIN, uISP_VAL_MAX); > +} Regular clamp() should work here ? all parameters are already unsigned ints. Regards, Hans > > #endif /* __SH_CSS_FRAC_H */ > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > index 29c3ea5b6e93..d53b296df504 100644 > --- a/include/linux/skbuff.h > +++ b/include/linux/skbuff.h > @@ -3164,7 +3164,11 @@ static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len) > * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) > */ > #ifndef NET_SKB_PAD > -#define NET_SKB_PAD max(32, L1_CACHE_BYTES) > +#if L1_CACHE_BYTES < 32 > +#define NET_SKB_PAD 32 > +#else > +#define NET_SKB_PAD L1_CACHE_BYTES > +#endif > #endif > > int ___pskb_trim(struct sk_buff *skb, unsigned int len); > -- > 2.46.0 > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion 2024-09-11 16:24 ` Hans de Goede @ 2024-09-11 16:37 ` Lorenzo Stoakes 2024-09-11 16:44 ` Hans de Goede 2024-09-11 16:57 ` Andrew Lunn 2024-09-11 17:25 ` Dan Carpenter 1 sibling, 2 replies; 9+ messages in thread From: Lorenzo Stoakes @ 2024-09-11 16:37 UTC (permalink / raw) To: Hans de Goede Cc: Andrew Morton, Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Mauro Carvalho Chehab, Sakari Ailus, Greg Kroah-Hartman, Marcin Wojtas, Russell King, David S . Miller, Arnd Bergmann, Linus Torvalds, netdev, linux-kernel, linux-media, linux-staging, linux-mm, stable On Wed, Sep 11, 2024 at 06:24:54PM GMT, Hans de Goede wrote: > Hi Lorenzo, > > On 9/11/24 5:34 PM, Lorenzo Stoakes wrote: > > Avoid nested min()/max() which results in egregious macro expansion. > > > > This issue was introduced by commit 867046cc7027 ("minmax: relax check to > > allow comparison between unsigned arguments and signed constants") [2]. > > > > Work has been done to address the issue of egregious min()/max() macro > > expansion in commit 22f546873149 ("minmax: improve macro expansion and type > > checking") and related, however it appears that some issues remain on more > > tightly constrained systems. > > > > Adjust a few known-bad cases of deeply nested macros to avoid doing so to > > mitigate this. Porting the patch first proposed in [1] to Linus's tree. > > > > Running an allmodconfig build using the methodology described in [2] we > > observe a 35 MiB reduction in generated code. > > > > The difference is much more significant prior to recent minmax fixes which > > were not backported. As per [1] prior these the reduction is more like 200 > > MiB. > > > > This resolves an issue with slackware 15.0 32-bit compilation as reported > > by Richard Narron. > > > > Presumably the min/max fixups would be difficult to backport, this patch > > should be easier and fix's Richard's problem in 5.15. > > > > [0]:https://lore.kernel.org/all/b97faef60ad24922b530241c5d7c933c@AcuMS.aculab.com/ > > [1]:https://lore.kernel.org/lkml/5882b96e-1287-4390-8174-3316d39038ef@lucifer.local/ > > [2]:https://lore.kernel.org/linux-mm/36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local/ > > > > Reported-by: Richard Narron <richard@aaazen.com> > > Closes: https://lore.kernel.org/all/4a5321bd-b1f-1832-f0c-cea8694dc5aa@aaazen.com/ > > Fixes: 867046cc7027 ("minmax: relax check to allow comparison between unsigned arguments and signed constants") > > Cc: stable@vger.kernel.org > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > > Thank you for your patch. > > I must say that I'm not a fan of that this is patching 3 totally > unrelated files here in a single patch. > > This is e.g. going to be a problem if we need to revert one of > the changes because of regressions... > > So I would prefer this to be split into 3 patches. Well, I was doing this as a favour to Richard between other work so put this together quickly, but you're right this is going to be a pain to backport/revert if issues so absolutely - will do. Since this is a hotfix I'm going to risk annoying people and shoot out a v2 on same day as v1. Sorry in advance. > > One review comment for the atomisp bits inline / below. > > > --- > > drivers/net/ethernet/marvell/mvpp2/mvpp2.h | 2 +- > > .../staging/media/atomisp/pci/sh_css_frac.h | 26 ++++++++++++++----- > > include/linux/skbuff.h | 6 ++++- > > 3 files changed, 25 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h > > index e809f91c08fb..8b431f90efc3 100644 > > --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h > > +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h > > @@ -23,7 +23,7 @@ > > /* The PacketOffset field is measured in units of 32 bytes and is 3 bits wide, > > * so the maximum offset is 7 * 32 = 224 > > */ > > -#define MVPP2_SKB_HEADROOM min(max(XDP_PACKET_HEADROOM, NET_SKB_PAD), 224) > > +#define MVPP2_SKB_HEADROOM clamp_t(int, XDP_PACKET_HEADROOM, NET_SKB_PAD, 224) > > > > #define MVPP2_XDP_PASS 0 > > #define MVPP2_XDP_DROPPED BIT(0) > > diff --git a/drivers/staging/media/atomisp/pci/sh_css_frac.h b/drivers/staging/media/atomisp/pci/sh_css_frac.h > > index b90b5b330dfa..a973394c5bc0 100644 > > --- a/drivers/staging/media/atomisp/pci/sh_css_frac.h > > +++ b/drivers/staging/media/atomisp/pci/sh_css_frac.h > > @@ -32,12 +32,24 @@ > > #define uISP_VAL_MAX ((unsigned int)((1 << uISP_REG_BIT) - 1)) > > > > /* a:fraction bits for 16bit precision, b:fraction bits for ISP precision */ > > -#define sDIGIT_FITTING(v, a, b) \ > > - min_t(int, max_t(int, (((v) >> sSHIFT) >> max(sFRACTION_BITS_FITTING(a) - (b), 0)), \ > > - sISP_VAL_MIN), sISP_VAL_MAX) > > -#define uDIGIT_FITTING(v, a, b) \ > > - min((unsigned int)max((unsigned)(((v) >> uSHIFT) \ > > - >> max((int)(uFRACTION_BITS_FITTING(a) - (b)), 0)), \ > > - uISP_VAL_MIN), uISP_VAL_MAX) > > +static inline int sDIGIT_FITTING(short v, int a, int b) > > +{ > > drivers/staging/media/atomisp/pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a.host.c > > calls this with ia_css_3a_config.af_fir1_coef / .af_fir2_coef > as first argument those are of the ia_css_s0_15 type which is: > > /* Signed fixed point value, 0 integer bits, 15 fractional bits */ > typedef s32 ia_css_s0_15; > > please replace the "short v" with "int v" Yeah I think you're right, it's odd, because it seems that the shift value and the comments implies that this is a short, but perhaps it's more so that values are shifted as to obtain 16 bits of precision. > > I think that you can then also replace clamp_t() with clamp() The use of clamp_t() is to avoid egregious macro expansion in clamp(). After the series improving min/max the clamp() is probably equivalent. But in 5.15 it will likely not be. So this is, in line with the purpose of this change, I believe necesasry. > > > > + int fit_shift = sFRACTION_BITS_FITTING(a) - b; > > + > > + v >>= sSHIFT; > > + v >>= fit_shift > 0 ? fit_shift : 0; > > + > > + return clamp_t(int, v, sISP_VAL_MIN, sISP_VAL_MAX); > > +} > > + > > +static inline unsigned int uDIGIT_FITTING(unsigned int v, int a, int b) > > +{ > > + int fit_shift = uFRACTION_BITS_FITTING(a) - b; > > + > > + v >>= uSHIFT; > > + v >>= fit_shift > 0 ? fit_shift : 0; > > + > > + return clamp_t(unsigned int, v, uISP_VAL_MIN, uISP_VAL_MAX); > > +} > > Regular clamp() should work here ? all parameters are already > unsigned ints. See above. > > Regards, > > Hans > > > > > > > > #endif /* __SH_CSS_FRAC_H */ > > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > > index 29c3ea5b6e93..d53b296df504 100644 > > --- a/include/linux/skbuff.h > > +++ b/include/linux/skbuff.h > > @@ -3164,7 +3164,11 @@ static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len) > > * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) > > */ > > #ifndef NET_SKB_PAD > > -#define NET_SKB_PAD max(32, L1_CACHE_BYTES) > > +#if L1_CACHE_BYTES < 32 > > +#define NET_SKB_PAD 32 > > +#else > > +#define NET_SKB_PAD L1_CACHE_BYTES > > +#endif > > #endif > > > > int ___pskb_trim(struct sk_buff *skb, unsigned int len); > > -- > > 2.46.0 > > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion 2024-09-11 16:37 ` Lorenzo Stoakes @ 2024-09-11 16:44 ` Hans de Goede 2024-09-11 16:57 ` Andrew Lunn 1 sibling, 0 replies; 9+ messages in thread From: Hans de Goede @ 2024-09-11 16:44 UTC (permalink / raw) To: Lorenzo Stoakes Cc: Andrew Morton, Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Mauro Carvalho Chehab, Sakari Ailus, Greg Kroah-Hartman, Marcin Wojtas, Russell King, David S . Miller, Arnd Bergmann, Linus Torvalds, netdev, linux-kernel, linux-media, linux-staging, linux-mm, stable Hi, On 9/11/24 6:37 PM, Lorenzo Stoakes wrote: > On Wed, Sep 11, 2024 at 06:24:54PM GMT, Hans de Goede wrote: >> Hi Lorenzo, >> >> On 9/11/24 5:34 PM, Lorenzo Stoakes wrote: >>> Avoid nested min()/max() which results in egregious macro expansion. >>> >>> This issue was introduced by commit 867046cc7027 ("minmax: relax check to >>> allow comparison between unsigned arguments and signed constants") [2]. >>> >>> Work has been done to address the issue of egregious min()/max() macro >>> expansion in commit 22f546873149 ("minmax: improve macro expansion and type >>> checking") and related, however it appears that some issues remain on more >>> tightly constrained systems. >>> >>> Adjust a few known-bad cases of deeply nested macros to avoid doing so to >>> mitigate this. Porting the patch first proposed in [1] to Linus's tree. >>> >>> Running an allmodconfig build using the methodology described in [2] we >>> observe a 35 MiB reduction in generated code. >>> >>> The difference is much more significant prior to recent minmax fixes which >>> were not backported. As per [1] prior these the reduction is more like 200 >>> MiB. >>> >>> This resolves an issue with slackware 15.0 32-bit compilation as reported >>> by Richard Narron. >>> >>> Presumably the min/max fixups would be difficult to backport, this patch >>> should be easier and fix's Richard's problem in 5.15. >>> >>> [0]:https://lore.kernel.org/all/b97faef60ad24922b530241c5d7c933c@AcuMS.aculab.com/ >>> [1]:https://lore.kernel.org/lkml/5882b96e-1287-4390-8174-3316d39038ef@lucifer.local/ >>> [2]:https://lore.kernel.org/linux-mm/36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local/ >>> >>> Reported-by: Richard Narron <richard@aaazen.com> >>> Closes: https://lore.kernel.org/all/4a5321bd-b1f-1832-f0c-cea8694dc5aa@aaazen.com/ >>> Fixes: 867046cc7027 ("minmax: relax check to allow comparison between unsigned arguments and signed constants") >>> Cc: stable@vger.kernel.org >>> Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> >> >> Thank you for your patch. >> >> I must say that I'm not a fan of that this is patching 3 totally >> unrelated files here in a single patch. >> >> This is e.g. going to be a problem if we need to revert one of >> the changes because of regressions... >> >> So I would prefer this to be split into 3 patches. > > Well, I was doing this as a favour to Richard between other work so put > this together quickly, but you're right this is going to be a pain to > backport/revert if issues so absolutely - will do. > > Since this is a hotfix I'm going to risk annoying people and shoot out > a v2 on same day as v1. Sorry in advance. > >> >> One review comment for the atomisp bits inline / below. >> >>> --- >>> drivers/net/ethernet/marvell/mvpp2/mvpp2.h | 2 +- >>> .../staging/media/atomisp/pci/sh_css_frac.h | 26 ++++++++++++++----- >>> include/linux/skbuff.h | 6 ++++- >>> 3 files changed, 25 insertions(+), 9 deletions(-) >>> >>> diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h >>> index e809f91c08fb..8b431f90efc3 100644 >>> --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h >>> +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h >>> @@ -23,7 +23,7 @@ >>> /* The PacketOffset field is measured in units of 32 bytes and is 3 bits wide, >>> * so the maximum offset is 7 * 32 = 224 >>> */ >>> -#define MVPP2_SKB_HEADROOM min(max(XDP_PACKET_HEADROOM, NET_SKB_PAD), 224) >>> +#define MVPP2_SKB_HEADROOM clamp_t(int, XDP_PACKET_HEADROOM, NET_SKB_PAD, 224) >>> >>> #define MVPP2_XDP_PASS 0 >>> #define MVPP2_XDP_DROPPED BIT(0) >>> diff --git a/drivers/staging/media/atomisp/pci/sh_css_frac.h b/drivers/staging/media/atomisp/pci/sh_css_frac.h >>> index b90b5b330dfa..a973394c5bc0 100644 >>> --- a/drivers/staging/media/atomisp/pci/sh_css_frac.h >>> +++ b/drivers/staging/media/atomisp/pci/sh_css_frac.h >>> @@ -32,12 +32,24 @@ >>> #define uISP_VAL_MAX ((unsigned int)((1 << uISP_REG_BIT) - 1)) >>> >>> /* a:fraction bits for 16bit precision, b:fraction bits for ISP precision */ >>> -#define sDIGIT_FITTING(v, a, b) \ >>> - min_t(int, max_t(int, (((v) >> sSHIFT) >> max(sFRACTION_BITS_FITTING(a) - (b), 0)), \ >>> - sISP_VAL_MIN), sISP_VAL_MAX) >>> -#define uDIGIT_FITTING(v, a, b) \ >>> - min((unsigned int)max((unsigned)(((v) >> uSHIFT) \ >>> - >> max((int)(uFRACTION_BITS_FITTING(a) - (b)), 0)), \ >>> - uISP_VAL_MIN), uISP_VAL_MAX) >>> +static inline int sDIGIT_FITTING(short v, int a, int b) >>> +{ >> >> drivers/staging/media/atomisp/pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a.host.c >> >> calls this with ia_css_3a_config.af_fir1_coef / .af_fir2_coef >> as first argument those are of the ia_css_s0_15 type which is: >> >> /* Signed fixed point value, 0 integer bits, 15 fractional bits */ >> typedef s32 ia_css_s0_15; >> >> please replace the "short v" with "int v" > > Yeah I think you're right, it's odd, because it seems that the shift value > and the comments implies that this is a short, but perhaps it's more so > that values are shifted as to obtain 16 bits of precision. > >> >> I think that you can then also replace clamp_t() with clamp() > > The use of clamp_t() is to avoid egregious macro expansion in > clamp(). After the series improving min/max the clamp() is probably > equivalent. But in 5.15 it will likely not be. So this is, in line with the > purpose of this change, I believe necesasry. Ok fair enough. Regards, Hans ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion 2024-09-11 16:37 ` Lorenzo Stoakes 2024-09-11 16:44 ` Hans de Goede @ 2024-09-11 16:57 ` Andrew Lunn 2024-09-11 17:00 ` Lorenzo Stoakes 1 sibling, 1 reply; 9+ messages in thread From: Andrew Lunn @ 2024-09-11 16:57 UTC (permalink / raw) To: Lorenzo Stoakes Cc: Hans de Goede, Andrew Morton, Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Mauro Carvalho Chehab, Sakari Ailus, Greg Kroah-Hartman, Marcin Wojtas, Russell King, David S . Miller, Arnd Bergmann, Linus Torvalds, netdev, linux-kernel, linux-media, linux-staging, linux-mm, stable > > I think that you can then also replace clamp_t() with clamp() > > The use of clamp_t() is to avoid egregious macro expansion in > clamp(). After the series improving min/max the clamp() is probably > equivalent. But in 5.15 it will likely not be. So this is, in line with the > purpose of this change, I believe necesasry. Maybe that should be in the commit message? Andrew ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion 2024-09-11 16:57 ` Andrew Lunn @ 2024-09-11 17:00 ` Lorenzo Stoakes 0 siblings, 0 replies; 9+ messages in thread From: Lorenzo Stoakes @ 2024-09-11 17:00 UTC (permalink / raw) To: Andrew Lunn Cc: Hans de Goede, Andrew Morton, Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Mauro Carvalho Chehab, Sakari Ailus, Greg Kroah-Hartman, Marcin Wojtas, Russell King, David S . Miller, Arnd Bergmann, Linus Torvalds, netdev, linux-kernel, linux-media, linux-staging, linux-mm, stable On Wed, Sep 11, 2024 at 06:57:47PM GMT, Andrew Lunn wrote: > > > I think that you can then also replace clamp_t() with clamp() > > > > The use of clamp_t() is to avoid egregious macro expansion in > > clamp(). After the series improving min/max the clamp() is probably > > equivalent. But in 5.15 it will likely not be. So this is, in line with the > > purpose of this change, I believe necesasry. > > Maybe that should be in the commit message? message-s :) Yup, I'm putting that in. > > Andrew ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion 2024-09-11 16:24 ` Hans de Goede 2024-09-11 16:37 ` Lorenzo Stoakes @ 2024-09-11 17:25 ` Dan Carpenter 2024-09-11 17:36 ` Lorenzo Stoakes 1 sibling, 1 reply; 9+ messages in thread From: Dan Carpenter @ 2024-09-11 17:25 UTC (permalink / raw) To: Hans de Goede Cc: Lorenzo Stoakes, Andrew Morton, Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Mauro Carvalho Chehab, Sakari Ailus, Greg Kroah-Hartman, Marcin Wojtas, Russell King, David S . Miller, Arnd Bergmann, Linus Torvalds, netdev, linux-kernel, linux-media, linux-staging, linux-mm, stable On Wed, Sep 11, 2024 at 06:24:54PM +0200, Hans de Goede wrote: > Hi Lorenzo, > > On 9/11/24 5:34 PM, Lorenzo Stoakes wrote: > > Avoid nested min()/max() which results in egregious macro expansion. > > > > This issue was introduced by commit 867046cc7027 ("minmax: relax check to > > allow comparison between unsigned arguments and signed constants") [2]. > > > > Work has been done to address the issue of egregious min()/max() macro > > expansion in commit 22f546873149 ("minmax: improve macro expansion and type > > checking") and related, however it appears that some issues remain on more > > tightly constrained systems. > > > > Adjust a few known-bad cases of deeply nested macros to avoid doing so to > > mitigate this. Porting the patch first proposed in [1] to Linus's tree. > > > > Running an allmodconfig build using the methodology described in [2] we > > observe a 35 MiB reduction in generated code. > > > > The difference is much more significant prior to recent minmax fixes which > > were not backported. As per [1] prior these the reduction is more like 200 > > MiB. > > > > This resolves an issue with slackware 15.0 32-bit compilation as reported > > by Richard Narron. > > > > Presumably the min/max fixups would be difficult to backport, this patch > > should be easier and fix's Richard's problem in 5.15. > > > > [0]:https://lore.kernel.org/all/b97faef60ad24922b530241c5d7c933c@AcuMS.aculab.com/ > > [1]:https://lore.kernel.org/lkml/5882b96e-1287-4390-8174-3316d39038ef@lucifer.local/ > > [2]:https://lore.kernel.org/linux-mm/36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local/ > > > > Reported-by: Richard Narron <richard@aaazen.com> > > Closes: https://lore.kernel.org/all/4a5321bd-b1f-1832-f0c-cea8694dc5aa@aaazen.com/ > > Fixes: 867046cc7027 ("minmax: relax check to allow comparison between unsigned arguments and signed constants") > > Cc: stable@vger.kernel.org > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > > Thank you for your patch. > > I must say that I'm not a fan of that this is patching 3 totally > unrelated files here in a single patch. > > This is e.g. going to be a problem if we need to revert one of > the changes because of regressions... These kinds of thing also complicates backporting to stable. The stable kernel developers like whole, unmodified patches. So if we have to fix something in sDIGIT_FITTING() then we'd want to pull this back instead of re-writing the fix on top of the original define (unmodified patches). But now we have to backport the chunk which changes mvpp2 as well (whole patches). regards, dan carpenter ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion 2024-09-11 17:25 ` Dan Carpenter @ 2024-09-11 17:36 ` Lorenzo Stoakes 0 siblings, 0 replies; 9+ messages in thread From: Lorenzo Stoakes @ 2024-09-11 17:36 UTC (permalink / raw) To: Dan Carpenter Cc: Hans de Goede, Andrew Morton, Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Mauro Carvalho Chehab, Sakari Ailus, Greg Kroah-Hartman, Marcin Wojtas, Russell King, David S . Miller, Arnd Bergmann, Linus Torvalds, netdev, linux-kernel, linux-media, linux-staging, linux-mm, stable On Wed, Sep 11, 2024 at 08:25:33PM GMT, Dan Carpenter wrote: > On Wed, Sep 11, 2024 at 06:24:54PM +0200, Hans de Goede wrote: > > Hi Lorenzo, > > > > On 9/11/24 5:34 PM, Lorenzo Stoakes wrote: > > > Avoid nested min()/max() which results in egregious macro expansion. > > > > > > This issue was introduced by commit 867046cc7027 ("minmax: relax check to > > > allow comparison between unsigned arguments and signed constants") [2]. > > > > > > Work has been done to address the issue of egregious min()/max() macro > > > expansion in commit 22f546873149 ("minmax: improve macro expansion and type > > > checking") and related, however it appears that some issues remain on more > > > tightly constrained systems. > > > > > > Adjust a few known-bad cases of deeply nested macros to avoid doing so to > > > mitigate this. Porting the patch first proposed in [1] to Linus's tree. > > > > > > Running an allmodconfig build using the methodology described in [2] we > > > observe a 35 MiB reduction in generated code. > > > > > > The difference is much more significant prior to recent minmax fixes which > > > were not backported. As per [1] prior these the reduction is more like 200 > > > MiB. > > > > > > This resolves an issue with slackware 15.0 32-bit compilation as reported > > > by Richard Narron. > > > > > > Presumably the min/max fixups would be difficult to backport, this patch > > > should be easier and fix's Richard's problem in 5.15. > > > > > > [0]:https://lore.kernel.org/all/b97faef60ad24922b530241c5d7c933c@AcuMS.aculab.com/ > > > [1]:https://lore.kernel.org/lkml/5882b96e-1287-4390-8174-3316d39038ef@lucifer.local/ > > > [2]:https://lore.kernel.org/linux-mm/36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local/ > > > > > > Reported-by: Richard Narron <richard@aaazen.com> > > > Closes: https://lore.kernel.org/all/4a5321bd-b1f-1832-f0c-cea8694dc5aa@aaazen.com/ > > > Fixes: 867046cc7027 ("minmax: relax check to allow comparison between unsigned arguments and signed constants") > > > Cc: stable@vger.kernel.org > > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > > > > Thank you for your patch. > > > > I must say that I'm not a fan of that this is patching 3 totally > > unrelated files here in a single patch. > > > > This is e.g. going to be a problem if we need to revert one of > > the changes because of regressions... > > These kinds of thing also complicates backporting to stable. The stable kernel > developers like whole, unmodified patches. So if we have to fix something in > sDIGIT_FITTING() then we'd want to pull this back instead of re-writing the fix > on top of the original define (unmodified patches). But now we have to backport > the chunk which changes mvpp2 as well (whole patches). Sure absolutely, as I said to Hans I did it all as one as I wanted to get this out quickly as a favour to Richard, but this was a mistake, very obviously it's much easier to have these separate. About to send out a v2 with this done. Cheers! > > regards, > dan carpenter > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion 2024-09-11 15:34 [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion Lorenzo Stoakes 2024-09-11 16:24 ` Hans de Goede @ 2024-09-11 17:01 ` Andrew Lunn 1 sibling, 0 replies; 9+ messages in thread From: Andrew Lunn @ 2024-09-11 17:01 UTC (permalink / raw) To: Lorenzo Stoakes Cc: Andrew Morton, Richard Narron, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Hans de Goede, Mauro Carvalho Chehab, Sakari Ailus, Greg Kroah-Hartman, Marcin Wojtas, Russell King, David S . Miller, Arnd Bergmann, Linus Torvalds, netdev, linux-kernel, linux-media, linux-staging, linux-mm, stable > drivers/net/ethernet/marvell/mvpp2/mvpp2.h | 2 +- For this part only: Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-09-11 17:36 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2024-09-11 15:34 [PATCH hotfix 6.11] minmax: reduce egregious min/max macro expansion Lorenzo Stoakes 2024-09-11 16:24 ` Hans de Goede 2024-09-11 16:37 ` Lorenzo Stoakes 2024-09-11 16:44 ` Hans de Goede 2024-09-11 16:57 ` Andrew Lunn 2024-09-11 17:00 ` Lorenzo Stoakes 2024-09-11 17:25 ` Dan Carpenter 2024-09-11 17:36 ` Lorenzo Stoakes 2024-09-11 17:01 ` Andrew Lunn
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox