Skip to content

Commit 3b0f31f

Browse files
jmberg-inteldavem330
authored andcommitted
genetlink: make policy common to family
Since maxattr is common, the policy can't really differ sanely, so make it common as well. The only user that did in fact manage to make a non-common policy is taskstats, which has to be really careful about it (since it's still using a common maxattr!). This is no longer supported, but we can fake it using pre_doit. This reduces the size of e.g. nl80211.o (which has lots of commands): text data bss dec hex filename 398745 14323 2240 415308 6564c net/wireless/nl80211.o (before) 397913 14331 2240 414484 65314 net/wireless/nl80211.o (after) -------------------------------- -832 +8 0 -824 Which is obviously just 8 bytes for each command, and an added 8 bytes for the new policy pointer. I'm not sure why the ops list is counted as .text though. Most of the code transformations were done using the following spatch: @ops@ identifier OPS; expression POLICY; @@ struct genl_ops OPS[] = { ..., { - .policy = POLICY, }, ... }; @@ identifier ops.OPS; expression ops.POLICY; identifier fam; expression M; @@ struct genl_family fam = { .ops = OPS, .maxattr = M, + .policy = POLICY, ... }; This also gets rid of devlink_nl_cmd_region_read_dumpit() accessing the cb->data as ops, which we want to change in a later genl patch. Signed-off-by: Johannes Berg <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 601ed4d commit 3b0f31f

36 files changed

+68
-374
lines changed

drivers/block/nbd.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,22 +1999,18 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info)
19991999
static const struct genl_ops nbd_connect_genl_ops[] = {
20002000
{
20012001
.cmd = NBD_CMD_CONNECT,
2002-
.policy = nbd_attr_policy,
20032002
.doit = nbd_genl_connect,
20042003
},
20052004
{
20062005
.cmd = NBD_CMD_DISCONNECT,
2007-
.policy = nbd_attr_policy,
20082006
.doit = nbd_genl_disconnect,
20092007
},
20102008
{
20112009
.cmd = NBD_CMD_RECONFIGURE,
2012-
.policy = nbd_attr_policy,
20132010
.doit = nbd_genl_reconfigure,
20142011
},
20152012
{
20162013
.cmd = NBD_CMD_STATUS,
2017-
.policy = nbd_attr_policy,
20182014
.doit = nbd_genl_status,
20192015
},
20202016
};
@@ -2031,6 +2027,7 @@ static struct genl_family nbd_genl_family __ro_after_init = {
20312027
.ops = nbd_connect_genl_ops,
20322028
.n_ops = ARRAY_SIZE(nbd_connect_genl_ops),
20332029
.maxattr = NBD_ATTR_MAX,
2030+
.policy = nbd_attr_policy,
20342031
.mcgrps = nbd_mcast_grps,
20352032
.n_mcgrps = ARRAY_SIZE(nbd_mcast_grps),
20362033
};

drivers/net/gtp.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,20 +1271,17 @@ static const struct genl_ops gtp_genl_ops[] = {
12711271
{
12721272
.cmd = GTP_CMD_NEWPDP,
12731273
.doit = gtp_genl_new_pdp,
1274-
.policy = gtp_genl_policy,
12751274
.flags = GENL_ADMIN_PERM,
12761275
},
12771276
{
12781277
.cmd = GTP_CMD_DELPDP,
12791278
.doit = gtp_genl_del_pdp,
1280-
.policy = gtp_genl_policy,
12811279
.flags = GENL_ADMIN_PERM,
12821280
},
12831281
{
12841282
.cmd = GTP_CMD_GETPDP,
12851283
.doit = gtp_genl_get_pdp,
12861284
.dumpit = gtp_genl_dump_pdp,
1287-
.policy = gtp_genl_policy,
12881285
.flags = GENL_ADMIN_PERM,
12891286
},
12901287
};
@@ -1294,6 +1291,7 @@ static struct genl_family gtp_genl_family __ro_after_init = {
12941291
.version = 0,
12951292
.hdrsize = 0,
12961293
.maxattr = GTPA_MAX,
1294+
.policy = gtp_genl_policy,
12971295
.netnsok = true,
12981296
.module = THIS_MODULE,
12991297
.ops = gtp_genl_ops,

drivers/net/ieee802154/mac802154_hwsim.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -598,37 +598,31 @@ static const struct nla_policy hwsim_genl_policy[MAC802154_HWSIM_ATTR_MAX + 1] =
598598
static const struct genl_ops hwsim_nl_ops[] = {
599599
{
600600
.cmd = MAC802154_HWSIM_CMD_NEW_RADIO,
601-
.policy = hwsim_genl_policy,
602601
.doit = hwsim_new_radio_nl,
603602
.flags = GENL_UNS_ADMIN_PERM,
604603
},
605604
{
606605
.cmd = MAC802154_HWSIM_CMD_DEL_RADIO,
607-
.policy = hwsim_genl_policy,
608606
.doit = hwsim_del_radio_nl,
609607
.flags = GENL_UNS_ADMIN_PERM,
610608
},
611609
{
612610
.cmd = MAC802154_HWSIM_CMD_GET_RADIO,
613-
.policy = hwsim_genl_policy,
614611
.doit = hwsim_get_radio_nl,
615612
.dumpit = hwsim_dump_radio_nl,
616613
},
617614
{
618615
.cmd = MAC802154_HWSIM_CMD_NEW_EDGE,
619-
.policy = hwsim_genl_policy,
620616
.doit = hwsim_new_edge_nl,
621617
.flags = GENL_UNS_ADMIN_PERM,
622618
},
623619
{
624620
.cmd = MAC802154_HWSIM_CMD_DEL_EDGE,
625-
.policy = hwsim_genl_policy,
626621
.doit = hwsim_del_edge_nl,
627622
.flags = GENL_UNS_ADMIN_PERM,
628623
},
629624
{
630625
.cmd = MAC802154_HWSIM_CMD_SET_EDGE,
631-
.policy = hwsim_genl_policy,
632626
.doit = hwsim_set_edge_lqi,
633627
.flags = GENL_UNS_ADMIN_PERM,
634628
},
@@ -638,6 +632,7 @@ static struct genl_family hwsim_genl_family __ro_after_init = {
638632
.name = "MAC802154_HWSIM",
639633
.version = 1,
640634
.maxattr = MAC802154_HWSIM_ATTR_MAX,
635+
.policy = hwsim_genl_policy,
641636
.module = THIS_MODULE,
642637
.ops = hwsim_nl_ops,
643638
.n_ops = ARRAY_SIZE(hwsim_nl_ops),

drivers/net/macsec.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2637,60 +2637,50 @@ static const struct genl_ops macsec_genl_ops[] = {
26372637
{
26382638
.cmd = MACSEC_CMD_GET_TXSC,
26392639
.dumpit = macsec_dump_txsc,
2640-
.policy = macsec_genl_policy,
26412640
},
26422641
{
26432642
.cmd = MACSEC_CMD_ADD_RXSC,
26442643
.doit = macsec_add_rxsc,
2645-
.policy = macsec_genl_policy,
26462644
.flags = GENL_ADMIN_PERM,
26472645
},
26482646
{
26492647
.cmd = MACSEC_CMD_DEL_RXSC,
26502648
.doit = macsec_del_rxsc,
2651-
.policy = macsec_genl_policy,
26522649
.flags = GENL_ADMIN_PERM,
26532650
},
26542651
{
26552652
.cmd = MACSEC_CMD_UPD_RXSC,
26562653
.doit = macsec_upd_rxsc,
2657-
.policy = macsec_genl_policy,
26582654
.flags = GENL_ADMIN_PERM,
26592655
},
26602656
{
26612657
.cmd = MACSEC_CMD_ADD_TXSA,
26622658
.doit = macsec_add_txsa,
2663-
.policy = macsec_genl_policy,
26642659
.flags = GENL_ADMIN_PERM,
26652660
},
26662661
{
26672662
.cmd = MACSEC_CMD_DEL_TXSA,
26682663
.doit = macsec_del_txsa,
2669-
.policy = macsec_genl_policy,
26702664
.flags = GENL_ADMIN_PERM,
26712665
},
26722666
{
26732667
.cmd = MACSEC_CMD_UPD_TXSA,
26742668
.doit = macsec_upd_txsa,
2675-
.policy = macsec_genl_policy,
26762669
.flags = GENL_ADMIN_PERM,
26772670
},
26782671
{
26792672
.cmd = MACSEC_CMD_ADD_RXSA,
26802673
.doit = macsec_add_rxsa,
2681-
.policy = macsec_genl_policy,
26822674
.flags = GENL_ADMIN_PERM,
26832675
},
26842676
{
26852677
.cmd = MACSEC_CMD_DEL_RXSA,
26862678
.doit = macsec_del_rxsa,
2687-
.policy = macsec_genl_policy,
26882679
.flags = GENL_ADMIN_PERM,
26892680
},
26902681
{
26912682
.cmd = MACSEC_CMD_UPD_RXSA,
26922683
.doit = macsec_upd_rxsa,
2693-
.policy = macsec_genl_policy,
26942684
.flags = GENL_ADMIN_PERM,
26952685
},
26962686
};
@@ -2700,6 +2690,7 @@ static struct genl_family macsec_fam __ro_after_init = {
27002690
.hdrsize = 0,
27012691
.version = MACSEC_GENL_VERSION,
27022692
.maxattr = MACSEC_ATTR_MAX,
2693+
.policy = macsec_genl_policy,
27032694
.netnsok = true,
27042695
.module = THIS_MODULE,
27052696
.ops = macsec_genl_ops,

drivers/net/team/team.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2725,24 +2725,20 @@ static const struct genl_ops team_nl_ops[] = {
27252725
{
27262726
.cmd = TEAM_CMD_NOOP,
27272727
.doit = team_nl_cmd_noop,
2728-
.policy = team_nl_policy,
27292728
},
27302729
{
27312730
.cmd = TEAM_CMD_OPTIONS_SET,
27322731
.doit = team_nl_cmd_options_set,
2733-
.policy = team_nl_policy,
27342732
.flags = GENL_ADMIN_PERM,
27352733
},
27362734
{
27372735
.cmd = TEAM_CMD_OPTIONS_GET,
27382736
.doit = team_nl_cmd_options_get,
2739-
.policy = team_nl_policy,
27402737
.flags = GENL_ADMIN_PERM,
27412738
},
27422739
{
27432740
.cmd = TEAM_CMD_PORT_LIST_GET,
27442741
.doit = team_nl_cmd_port_list_get,
2745-
.policy = team_nl_policy,
27462742
.flags = GENL_ADMIN_PERM,
27472743
},
27482744
};
@@ -2755,6 +2751,7 @@ static struct genl_family team_nl_family __ro_after_init = {
27552751
.name = TEAM_GENL_NAME,
27562752
.version = TEAM_GENL_VERSION,
27572753
.maxattr = TEAM_ATTR_MAX,
2754+
.policy = team_nl_policy,
27582755
.netnsok = true,
27592756
.module = THIS_MODULE,
27602757
.ops = team_nl_ops,

drivers/net/wireless/mac80211_hwsim.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3620,35 +3620,29 @@ static int hwsim_dump_radio_nl(struct sk_buff *skb,
36203620
static const struct genl_ops hwsim_ops[] = {
36213621
{
36223622
.cmd = HWSIM_CMD_REGISTER,
3623-
.policy = hwsim_genl_policy,
36243623
.doit = hwsim_register_received_nl,
36253624
.flags = GENL_UNS_ADMIN_PERM,
36263625
},
36273626
{
36283627
.cmd = HWSIM_CMD_FRAME,
3629-
.policy = hwsim_genl_policy,
36303628
.doit = hwsim_cloned_frame_received_nl,
36313629
},
36323630
{
36333631
.cmd = HWSIM_CMD_TX_INFO_FRAME,
3634-
.policy = hwsim_genl_policy,
36353632
.doit = hwsim_tx_info_frame_received_nl,
36363633
},
36373634
{
36383635
.cmd = HWSIM_CMD_NEW_RADIO,
3639-
.policy = hwsim_genl_policy,
36403636
.doit = hwsim_new_radio_nl,
36413637
.flags = GENL_UNS_ADMIN_PERM,
36423638
},
36433639
{
36443640
.cmd = HWSIM_CMD_DEL_RADIO,
3645-
.policy = hwsim_genl_policy,
36463641
.doit = hwsim_del_radio_nl,
36473642
.flags = GENL_UNS_ADMIN_PERM,
36483643
},
36493644
{
36503645
.cmd = HWSIM_CMD_GET_RADIO,
3651-
.policy = hwsim_genl_policy,
36523646
.doit = hwsim_get_radio_nl,
36533647
.dumpit = hwsim_dump_radio_nl,
36543648
},
@@ -3658,6 +3652,7 @@ static struct genl_family hwsim_genl_family __ro_after_init = {
36583652
.name = "MAC80211_HWSIM",
36593653
.version = 1,
36603654
.maxattr = HWSIM_ATTR_MAX,
3655+
.policy = hwsim_genl_policy,
36613656
.netnsok = true,
36623657
.module = THIS_MODULE,
36633658
.ops = hwsim_ops,

drivers/target/target_core_user.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -442,25 +442,21 @@ static const struct genl_ops tcmu_genl_ops[] = {
442442
{
443443
.cmd = TCMU_CMD_SET_FEATURES,
444444
.flags = GENL_ADMIN_PERM,
445-
.policy = tcmu_attr_policy,
446445
.doit = tcmu_genl_set_features,
447446
},
448447
{
449448
.cmd = TCMU_CMD_ADDED_DEVICE_DONE,
450449
.flags = GENL_ADMIN_PERM,
451-
.policy = tcmu_attr_policy,
452450
.doit = tcmu_genl_add_dev_done,
453451
},
454452
{
455453
.cmd = TCMU_CMD_REMOVED_DEVICE_DONE,
456454
.flags = GENL_ADMIN_PERM,
457-
.policy = tcmu_attr_policy,
458455
.doit = tcmu_genl_rm_dev_done,
459456
},
460457
{
461458
.cmd = TCMU_CMD_RECONFIG_DEVICE_DONE,
462459
.flags = GENL_ADMIN_PERM,
463-
.policy = tcmu_attr_policy,
464460
.doit = tcmu_genl_reconfig_dev_done,
465461
},
466462
};
@@ -472,6 +468,7 @@ static struct genl_family tcmu_genl_family __ro_after_init = {
472468
.name = "TCM-USER",
473469
.version = 2,
474470
.maxattr = TCMU_ATTR_MAX,
471+
.policy = tcmu_attr_policy,
475472
.mcgrps = tcmu_mcgrps,
476473
.n_mcgrps = ARRAY_SIZE(tcmu_mcgrps),
477474
.netnsok = true,

include/linux/genl_magic_func.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ const char *CONCAT_(GENL_MAGIC_FAMILY, _genl_cmd_to_str)(__u8 cmd)
233233
{ \
234234
handler \
235235
.cmd = op_name, \
236-
.policy = CONCAT_(GENL_MAGIC_FAMILY, _tla_nl_policy), \
237236
},
238237

239238
#define ZZZ_genl_ops CONCAT_(GENL_MAGIC_FAMILY, _genl_ops)
@@ -290,7 +289,8 @@ static struct genl_family ZZZ_genl_family __ro_after_init = {
290289
#ifdef GENL_MAGIC_FAMILY_HDRSZ
291290
.hdrsize = NLA_ALIGN(GENL_MAGIC_FAMILY_HDRSZ),
292291
#endif
293-
.maxattr = ARRAY_SIZE(drbd_tla_nl_policy)-1,
292+
.maxattr = ARRAY_SIZE(CONCAT_(GENL_MAGIC_FAMILY, _tla_nl_policy))-1,
293+
.policy = CONCAT_(GENL_MAGIC_FAMILY, _tla_nl_policy),
294294
.ops = ZZZ_genl_ops,
295295
.n_ops = ARRAY_SIZE(ZZZ_genl_ops),
296296
.mcgrps = ZZZ_genl_mcgrps,

include/net/genetlink.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct genl_info;
2626
* @name: name of family
2727
* @version: protocol version
2828
* @maxattr: maximum number of attributes supported
29+
* @policy: netlink policy
2930
* @netnsok: set to true if the family can handle network
3031
* namespaces and should be presented in all of them
3132
* @parallel_ops: operations can be called in parallel and aren't
@@ -56,6 +57,7 @@ struct genl_family {
5657
unsigned int maxattr;
5758
bool netnsok;
5859
bool parallel_ops;
60+
const struct nla_policy *policy;
5961
int (*pre_doit)(const struct genl_ops *ops,
6062
struct sk_buff *skb,
6163
struct genl_info *info);
@@ -124,14 +126,12 @@ static inline int genl_err_attr(struct genl_info *info, int err,
124126
* @cmd: command identifier
125127
* @internal_flags: flags used by the family
126128
* @flags: flags
127-
* @policy: attribute validation policy
128129
* @doit: standard command callback
129130
* @start: start callback for dumps
130131
* @dumpit: callback for dumpers
131132
* @done: completion callback for dumps
132133
*/
133134
struct genl_ops {
134-
const struct nla_policy *policy;
135135
int (*doit)(struct sk_buff *skb,
136136
struct genl_info *info);
137137
int (*start)(struct netlink_callback *cb);

kernel/taskstats.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -650,23 +650,45 @@ static const struct genl_ops taskstats_ops[] = {
650650
{
651651
.cmd = TASKSTATS_CMD_GET,
652652
.doit = taskstats_user_cmd,
653-
.policy = taskstats_cmd_get_policy,
654-
.flags = GENL_ADMIN_PERM,
653+
/* policy enforced later */
654+
.flags = GENL_ADMIN_PERM | GENL_CMD_CAP_HASPOL,
655655
},
656656
{
657657
.cmd = CGROUPSTATS_CMD_GET,
658658
.doit = cgroupstats_user_cmd,
659-
.policy = cgroupstats_cmd_get_policy,
659+
/* policy enforced later */
660+
.flags = GENL_CMD_CAP_HASPOL,
660661
},
661662
};
662663

664+
static int taskstats_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
665+
struct genl_info *info)
666+
{
667+
const struct nla_policy *policy = NULL;
668+
669+
switch (ops->cmd) {
670+
case TASKSTATS_CMD_GET:
671+
policy = taskstats_cmd_get_policy;
672+
break;
673+
case CGROUPSTATS_CMD_GET:
674+
policy = cgroupstats_cmd_get_policy;
675+
break;
676+
default:
677+
return -EINVAL;
678+
}
679+
680+
return nlmsg_validate(info->nlhdr, GENL_HDRLEN, TASKSTATS_CMD_ATTR_MAX,
681+
policy, info->extack);
682+
}
683+
663684
static struct genl_family family __ro_after_init = {
664685
.name = TASKSTATS_GENL_NAME,
665686
.version = TASKSTATS_GENL_VERSION,
666687
.maxattr = TASKSTATS_CMD_ATTR_MAX,
667688
.module = THIS_MODULE,
668689
.ops = taskstats_ops,
669690
.n_ops = ARRAY_SIZE(taskstats_ops),
691+
.pre_doit = taskstats_pre_doit,
670692
};
671693

672694
/* Needed early in initialization */

0 commit comments

Comments
 (0)