kernel_samsung_a53x/net/sched
Gustavo A. R. Silva 7c305720ca net: sched: cls_u32: Fix allocation size in u32_init()
[ Upstream commit c4d49196ceec80e30e8d981410d73331b49b7850 ]

commit d61491a51f7e ("net/sched: cls_u32: Replace one-element array
with flexible-array member") incorrecly replaced an instance of
`sizeof(*tp_c)` with `struct_size(tp_c, hlist->ht, 1)`. This results
in a an over-allocation of 8 bytes.

This change is wrong because `hlist` in `struct tc_u_common` is a
pointer:

net/sched/cls_u32.c:
struct tc_u_common {
        struct tc_u_hnode __rcu *hlist;
        void                    *ptr;
        int                     refcnt;
        struct idr              handle_idr;
        struct hlist_node       hnode;
        long                    knodes;
};

So, the use of `struct_size()` makes no sense: we don't need to allocate
any extra space for a flexible-array member. `sizeof(*tp_c)` is just fine.

So, `struct_size(tp_c, hlist->ht, 1)` translates to:

sizeof(*tp_c) + sizeof(tp_c->hlist->ht) ==
sizeof(struct tc_u_common) + sizeof(struct tc_u_knode *) ==
						144 + 8  == 0x98 (byes)
						     ^^^
						      |
						unnecessary extra
						allocation size

$ pahole -C tc_u_common net/sched/cls_u32.o
struct tc_u_common {
	struct tc_u_hnode *        hlist;                /*     0     8 */
	void *                     ptr;                  /*     8     8 */
	int                        refcnt;               /*    16     4 */

	/* XXX 4 bytes hole, try to pack */

	struct idr                 handle_idr;           /*    24    96 */
	/* --- cacheline 1 boundary (64 bytes) was 56 bytes ago --- */
	struct hlist_node          hnode;                /*   120    16 */
	/* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
	long int                   knodes;               /*   136     8 */

	/* size: 144, cachelines: 3, members: 6 */
	/* sum members: 140, holes: 1, sum holes: 4 */
	/* last cacheline: 16 bytes */
};

And with `sizeof(*tp_c)`, we have:

	sizeof(*tp_c) == sizeof(struct tc_u_common) == 144 == 0x90 (bytes)

which is the correct and original allocation size.

Fix this issue by replacing `struct_size(tp_c, hlist->ht, 1)` with
`sizeof(*tp_c)`, and avoid allocating 8 too many bytes.

The following difference in binary output is expected and reflects the
desired change:

| net/sched/cls_u32.o
| @@ -6148,7 +6148,7 @@
| include/linux/slab.h:599
|     2cf5:      mov    0x0(%rip),%rdi        # 2cfc <u32_init+0xfc>
|                        2cf8: R_X86_64_PC32     kmalloc_caches+0xc
|-    2cfc:      mov    $0x98,%edx
|+    2cfc:      mov    $0x90,%edx

Reported-by: Alejandro Colomar <alx@kernel.org>
Closes: https://lore.kernel.org/lkml/09b4a2ce-da74-3a19-6961-67883f634d98@kernel.org/
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-18 10:58:46 +01:00
..
act_api.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_bpf.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_connmark.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_csum.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_ct.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_ctinfo.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_gact.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_gate.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_ife.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_ipt.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_meta_mark.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_meta_skbprio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_meta_skbtcindex.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_mirred.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_mpls.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_nat.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_pedit.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_police.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_sample.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_simple.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_skbedit.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_skbmod.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_tunnel_key.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
act_vlan.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_api.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_basic.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_bpf.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_cgroup.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_flow.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_flower.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_fw.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_matchall.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_route.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cls_u32.c net: sched: cls_u32: Fix allocation size in u32_init() 2024-11-18 10:58:46 +01:00
em_canid.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
em_cmp.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
em_ipset.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
em_ipt.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
em_meta.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
em_nbyte.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
em_text.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
em_u32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ematch.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kconfig Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_api.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_atm.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_blackhole.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_cake.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_cbq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_cbs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_choke.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_codel.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_drr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_dsmark.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_etf.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_ets.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_fifo.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_fq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_fq_codel.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_fq_pie.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_generic.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_gred.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_hfsc.c net/sched: sch_hfsc: upgrade 'rt' to 'sc' when it becomes a inner curve 2024-11-08 11:26:11 +01:00
sch_hhf.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_htb.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_ingress.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_mq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_mqprio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_multiq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_netem.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_pie.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_plug.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_prio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_qfq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_red.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_sfb.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_sfq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_skbprio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_taprio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_tbf.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_teql.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00