dev.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
  4. * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
  5. */
  6. #include <linux/device.h>
  7. #include <net/genetlink.h>
  8. #include <net/sock.h>
  9. #include "devl_internal.h"
  10. struct devlink_info_req {
  11. struct sk_buff *msg;
  12. void (*version_cb)(const char *version_name,
  13. enum devlink_info_version_type version_type,
  14. void *version_cb_priv);
  15. void *version_cb_priv;
  16. };
  17. struct devlink_reload_combination {
  18. enum devlink_reload_action action;
  19. enum devlink_reload_limit limit;
  20. };
  21. static const struct devlink_reload_combination devlink_reload_invalid_combinations[] = {
  22. {
  23. /* can't reinitialize driver with no down time */
  24. .action = DEVLINK_RELOAD_ACTION_DRIVER_REINIT,
  25. .limit = DEVLINK_RELOAD_LIMIT_NO_RESET,
  26. },
  27. };
  28. static bool
  29. devlink_reload_combination_is_invalid(enum devlink_reload_action action,
  30. enum devlink_reload_limit limit)
  31. {
  32. int i;
  33. for (i = 0; i < ARRAY_SIZE(devlink_reload_invalid_combinations); i++)
  34. if (devlink_reload_invalid_combinations[i].action == action &&
  35. devlink_reload_invalid_combinations[i].limit == limit)
  36. return true;
  37. return false;
  38. }
  39. static bool
  40. devlink_reload_action_is_supported(struct devlink *devlink, enum devlink_reload_action action)
  41. {
  42. return test_bit(action, &devlink->ops->reload_actions);
  43. }
  44. static bool
  45. devlink_reload_limit_is_supported(struct devlink *devlink, enum devlink_reload_limit limit)
  46. {
  47. return test_bit(limit, &devlink->ops->reload_limits);
  48. }
  49. static int devlink_reload_stat_put(struct sk_buff *msg,
  50. enum devlink_reload_limit limit, u32 value)
  51. {
  52. struct nlattr *reload_stats_entry;
  53. reload_stats_entry = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_STATS_ENTRY);
  54. if (!reload_stats_entry)
  55. return -EMSGSIZE;
  56. if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_STATS_LIMIT, limit) ||
  57. nla_put_u32(msg, DEVLINK_ATTR_RELOAD_STATS_VALUE, value))
  58. goto nla_put_failure;
  59. nla_nest_end(msg, reload_stats_entry);
  60. return 0;
  61. nla_put_failure:
  62. nla_nest_cancel(msg, reload_stats_entry);
  63. return -EMSGSIZE;
  64. }
  65. static int
  66. devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote)
  67. {
  68. struct nlattr *reload_stats_attr, *act_info, *act_stats;
  69. int i, j, stat_idx;
  70. u32 value;
  71. if (!is_remote)
  72. reload_stats_attr = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_STATS);
  73. else
  74. reload_stats_attr = nla_nest_start(msg, DEVLINK_ATTR_REMOTE_RELOAD_STATS);
  75. if (!reload_stats_attr)
  76. return -EMSGSIZE;
  77. for (i = 0; i <= DEVLINK_RELOAD_ACTION_MAX; i++) {
  78. if ((!is_remote &&
  79. !devlink_reload_action_is_supported(devlink, i)) ||
  80. i == DEVLINK_RELOAD_ACTION_UNSPEC)
  81. continue;
  82. act_info = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_ACTION_INFO);
  83. if (!act_info)
  84. goto nla_put_failure;
  85. if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_ACTION, i))
  86. goto action_info_nest_cancel;
  87. act_stats = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_ACTION_STATS);
  88. if (!act_stats)
  89. goto action_info_nest_cancel;
  90. for (j = 0; j <= DEVLINK_RELOAD_LIMIT_MAX; j++) {
  91. /* Remote stats are shown even if not locally supported.
  92. * Stats of actions with unspecified limit are shown
  93. * though drivers don't need to register unspecified
  94. * limit.
  95. */
  96. if ((!is_remote && j != DEVLINK_RELOAD_LIMIT_UNSPEC &&
  97. !devlink_reload_limit_is_supported(devlink, j)) ||
  98. devlink_reload_combination_is_invalid(i, j))
  99. continue;
  100. stat_idx = j * __DEVLINK_RELOAD_ACTION_MAX + i;
  101. if (!is_remote)
  102. value = devlink->stats.reload_stats[stat_idx];
  103. else
  104. value = devlink->stats.remote_reload_stats[stat_idx];
  105. if (devlink_reload_stat_put(msg, j, value))
  106. goto action_stats_nest_cancel;
  107. }
  108. nla_nest_end(msg, act_stats);
  109. nla_nest_end(msg, act_info);
  110. }
  111. nla_nest_end(msg, reload_stats_attr);
  112. return 0;
  113. action_stats_nest_cancel:
  114. nla_nest_cancel(msg, act_stats);
  115. action_info_nest_cancel:
  116. nla_nest_cancel(msg, act_info);
  117. nla_put_failure:
  118. nla_nest_cancel(msg, reload_stats_attr);
  119. return -EMSGSIZE;
  120. }
  121. static int devlink_nl_nested_fill(struct sk_buff *msg, struct devlink *devlink)
  122. {
  123. unsigned long rel_index;
  124. void *unused;
  125. int err;
  126. xa_for_each(&devlink->nested_rels, rel_index, unused) {
  127. err = devlink_rel_devlink_handle_put(msg, devlink,
  128. rel_index,
  129. DEVLINK_ATTR_NESTED_DEVLINK,
  130. NULL);
  131. if (err)
  132. return err;
  133. }
  134. return 0;
  135. }
  136. static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink,
  137. enum devlink_command cmd, u32 portid,
  138. u32 seq, int flags)
  139. {
  140. struct nlattr *dev_stats;
  141. void *hdr;
  142. hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
  143. if (!hdr)
  144. return -EMSGSIZE;
  145. if (devlink_nl_put_handle(msg, devlink))
  146. goto nla_put_failure;
  147. if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed))
  148. goto nla_put_failure;
  149. dev_stats = nla_nest_start(msg, DEVLINK_ATTR_DEV_STATS);
  150. if (!dev_stats)
  151. goto nla_put_failure;
  152. if (devlink_reload_stats_put(msg, devlink, false))
  153. goto dev_stats_nest_cancel;
  154. if (devlink_reload_stats_put(msg, devlink, true))
  155. goto dev_stats_nest_cancel;
  156. nla_nest_end(msg, dev_stats);
  157. if (devlink_nl_nested_fill(msg, devlink))
  158. goto nla_put_failure;
  159. genlmsg_end(msg, hdr);
  160. return 0;
  161. dev_stats_nest_cancel:
  162. nla_nest_cancel(msg, dev_stats);
  163. nla_put_failure:
  164. genlmsg_cancel(msg, hdr);
  165. return -EMSGSIZE;
  166. }
  167. static void devlink_notify(struct devlink *devlink, enum devlink_command cmd)
  168. {
  169. struct sk_buff *msg;
  170. int err;
  171. WARN_ON(cmd != DEVLINK_CMD_NEW && cmd != DEVLINK_CMD_DEL);
  172. WARN_ON(!devl_is_registered(devlink));
  173. if (!devlink_nl_notify_need(devlink))
  174. return;
  175. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  176. if (!msg)
  177. return;
  178. err = devlink_nl_fill(msg, devlink, cmd, 0, 0, 0);
  179. if (err) {
  180. nlmsg_free(msg);
  181. return;
  182. }
  183. devlink_nl_notify_send(devlink, msg);
  184. }
  185. int devlink_nl_get_doit(struct sk_buff *skb, struct genl_info *info)
  186. {
  187. struct devlink *devlink = info->user_ptr[0];
  188. struct sk_buff *msg;
  189. int err;
  190. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  191. if (!msg)
  192. return -ENOMEM;
  193. err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW,
  194. info->snd_portid, info->snd_seq, 0);
  195. if (err) {
  196. nlmsg_free(msg);
  197. return err;
  198. }
  199. return genlmsg_reply(msg, info);
  200. }
  201. static int
  202. devlink_nl_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
  203. struct netlink_callback *cb, int flags)
  204. {
  205. return devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW,
  206. NETLINK_CB(cb->skb).portid,
  207. cb->nlh->nlmsg_seq, flags);
  208. }
  209. int devlink_nl_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
  210. {
  211. return devlink_nl_dumpit(msg, cb, devlink_nl_get_dump_one);
  212. }
  213. static void devlink_rel_notify_cb(struct devlink *devlink, u32 obj_index)
  214. {
  215. devlink_notify(devlink, DEVLINK_CMD_NEW);
  216. }
  217. static void devlink_rel_cleanup_cb(struct devlink *devlink, u32 obj_index,
  218. u32 rel_index)
  219. {
  220. xa_erase(&devlink->nested_rels, rel_index);
  221. }
  222. int devl_nested_devlink_set(struct devlink *devlink,
  223. struct devlink *nested_devlink)
  224. {
  225. u32 rel_index;
  226. int err;
  227. err = devlink_rel_nested_in_add(&rel_index, devlink->index, 0,
  228. devlink_rel_notify_cb,
  229. devlink_rel_cleanup_cb,
  230. nested_devlink);
  231. if (err)
  232. return err;
  233. return xa_insert(&devlink->nested_rels, rel_index,
  234. xa_mk_value(0), GFP_KERNEL);
  235. }
  236. EXPORT_SYMBOL_GPL(devl_nested_devlink_set);
  237. void devlink_notify_register(struct devlink *devlink)
  238. {
  239. devlink_notify(devlink, DEVLINK_CMD_NEW);
  240. devlink_linecards_notify_register(devlink);
  241. devlink_ports_notify_register(devlink);
  242. devlink_trap_policers_notify_register(devlink);
  243. devlink_trap_groups_notify_register(devlink);
  244. devlink_traps_notify_register(devlink);
  245. devlink_rates_notify_register(devlink);
  246. devlink_regions_notify_register(devlink);
  247. devlink_params_notify_register(devlink);
  248. }
  249. void devlink_notify_unregister(struct devlink *devlink)
  250. {
  251. devlink_params_notify_unregister(devlink);
  252. devlink_regions_notify_unregister(devlink);
  253. devlink_rates_notify_unregister(devlink);
  254. devlink_traps_notify_unregister(devlink);
  255. devlink_trap_groups_notify_unregister(devlink);
  256. devlink_trap_policers_notify_unregister(devlink);
  257. devlink_ports_notify_unregister(devlink);
  258. devlink_linecards_notify_unregister(devlink);
  259. devlink_notify(devlink, DEVLINK_CMD_DEL);
  260. }
  261. static void devlink_reload_failed_set(struct devlink *devlink,
  262. bool reload_failed)
  263. {
  264. if (devlink->reload_failed == reload_failed)
  265. return;
  266. devlink->reload_failed = reload_failed;
  267. devlink_notify(devlink, DEVLINK_CMD_NEW);
  268. }
  269. bool devlink_is_reload_failed(const struct devlink *devlink)
  270. {
  271. return devlink->reload_failed;
  272. }
  273. EXPORT_SYMBOL_GPL(devlink_is_reload_failed);
  274. static void
  275. __devlink_reload_stats_update(struct devlink *devlink, u32 *reload_stats,
  276. enum devlink_reload_limit limit, u32 actions_performed)
  277. {
  278. unsigned long actions = actions_performed;
  279. int stat_idx;
  280. int action;
  281. for_each_set_bit(action, &actions, __DEVLINK_RELOAD_ACTION_MAX) {
  282. stat_idx = limit * __DEVLINK_RELOAD_ACTION_MAX + action;
  283. reload_stats[stat_idx]++;
  284. }
  285. devlink_notify(devlink, DEVLINK_CMD_NEW);
  286. }
  287. static void
  288. devlink_reload_stats_update(struct devlink *devlink, enum devlink_reload_limit limit,
  289. u32 actions_performed)
  290. {
  291. __devlink_reload_stats_update(devlink, devlink->stats.reload_stats, limit,
  292. actions_performed);
  293. }
  294. /**
  295. * devlink_remote_reload_actions_performed - Update devlink on reload actions
  296. * performed which are not a direct result of devlink reload call.
  297. *
  298. * This should be called by a driver after performing reload actions in case it was not
  299. * a result of devlink reload call. For example fw_activate was performed as a result
  300. * of devlink reload triggered fw_activate on another host.
  301. * The motivation for this function is to keep data on reload actions performed on this
  302. * function whether it was done due to direct devlink reload call or not.
  303. *
  304. * @devlink: devlink
  305. * @limit: reload limit
  306. * @actions_performed: bitmask of actions performed
  307. */
  308. void devlink_remote_reload_actions_performed(struct devlink *devlink,
  309. enum devlink_reload_limit limit,
  310. u32 actions_performed)
  311. {
  312. if (WARN_ON(!actions_performed ||
  313. actions_performed & BIT(DEVLINK_RELOAD_ACTION_UNSPEC) ||
  314. actions_performed >= BIT(__DEVLINK_RELOAD_ACTION_MAX) ||
  315. limit > DEVLINK_RELOAD_LIMIT_MAX))
  316. return;
  317. __devlink_reload_stats_update(devlink, devlink->stats.remote_reload_stats, limit,
  318. actions_performed);
  319. }
  320. EXPORT_SYMBOL_GPL(devlink_remote_reload_actions_performed);
  321. static struct net *devlink_netns_get(struct sk_buff *skb,
  322. struct genl_info *info)
  323. {
  324. struct nlattr *netns_pid_attr = info->attrs[DEVLINK_ATTR_NETNS_PID];
  325. struct nlattr *netns_fd_attr = info->attrs[DEVLINK_ATTR_NETNS_FD];
  326. struct nlattr *netns_id_attr = info->attrs[DEVLINK_ATTR_NETNS_ID];
  327. struct net *net;
  328. if (!!netns_pid_attr + !!netns_fd_attr + !!netns_id_attr > 1) {
  329. NL_SET_ERR_MSG(info->extack, "multiple netns identifying attributes specified");
  330. return ERR_PTR(-EINVAL);
  331. }
  332. if (netns_pid_attr) {
  333. net = get_net_ns_by_pid(nla_get_u32(netns_pid_attr));
  334. } else if (netns_fd_attr) {
  335. net = get_net_ns_by_fd(nla_get_u32(netns_fd_attr));
  336. } else if (netns_id_attr) {
  337. net = get_net_ns_by_id(sock_net(skb->sk),
  338. nla_get_u32(netns_id_attr));
  339. if (!net)
  340. net = ERR_PTR(-EINVAL);
  341. } else {
  342. WARN_ON(1);
  343. net = ERR_PTR(-EINVAL);
  344. }
  345. if (IS_ERR(net)) {
  346. NL_SET_ERR_MSG(info->extack, "Unknown network namespace");
  347. return ERR_PTR(-EINVAL);
  348. }
  349. if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) {
  350. put_net(net);
  351. return ERR_PTR(-EPERM);
  352. }
  353. return net;
  354. }
  355. static void devlink_reload_netns_change(struct devlink *devlink,
  356. struct net *curr_net,
  357. struct net *dest_net)
  358. {
  359. /* Userspace needs to be notified about devlink objects
  360. * removed from original and entering new network namespace.
  361. * The rest of the devlink objects are re-created during
  362. * reload process so the notifications are generated separatelly.
  363. */
  364. devlink_notify_unregister(devlink);
  365. write_pnet(&devlink->_net, dest_net);
  366. devlink_notify_register(devlink);
  367. devlink_rel_nested_in_notify(devlink);
  368. }
  369. static void devlink_reload_reinit_sanity_check(struct devlink *devlink)
  370. {
  371. WARN_ON(!list_empty(&devlink->trap_policer_list));
  372. WARN_ON(!list_empty(&devlink->trap_group_list));
  373. WARN_ON(!list_empty(&devlink->trap_list));
  374. WARN_ON(!list_empty(&devlink->dpipe_table_list));
  375. WARN_ON(!list_empty(&devlink->sb_list));
  376. WARN_ON(devlink_rates_check(devlink, NULL, NULL));
  377. WARN_ON(!list_empty(&devlink->linecard_list));
  378. WARN_ON(!xa_empty(&devlink->ports));
  379. }
  380. int devlink_reload(struct devlink *devlink, struct net *dest_net,
  381. enum devlink_reload_action action,
  382. enum devlink_reload_limit limit,
  383. u32 *actions_performed, struct netlink_ext_ack *extack)
  384. {
  385. u32 remote_reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE];
  386. struct net *curr_net;
  387. int err;
  388. /* Make sure the reload operations are invoked with the device lock
  389. * held to allow drivers to trigger functionality that expects it
  390. * (e.g., PCI reset) and to close possible races between these
  391. * operations and probe/remove.
  392. */
  393. device_lock_assert(devlink->dev);
  394. memcpy(remote_reload_stats, devlink->stats.remote_reload_stats,
  395. sizeof(remote_reload_stats));
  396. err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack);
  397. if (err)
  398. return err;
  399. curr_net = devlink_net(devlink);
  400. if (dest_net && !net_eq(dest_net, curr_net))
  401. devlink_reload_netns_change(devlink, curr_net, dest_net);
  402. if (action == DEVLINK_RELOAD_ACTION_DRIVER_REINIT) {
  403. devlink_params_driverinit_load_new(devlink);
  404. devlink_reload_reinit_sanity_check(devlink);
  405. }
  406. err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack);
  407. devlink_reload_failed_set(devlink, !!err);
  408. if (err)
  409. return err;
  410. WARN_ON(!(*actions_performed & BIT(action)));
  411. /* Catch driver on updating the remote action within devlink reload */
  412. WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats,
  413. sizeof(remote_reload_stats)));
  414. devlink_reload_stats_update(devlink, limit, *actions_performed);
  415. return 0;
  416. }
  417. static int
  418. devlink_nl_reload_actions_performed_snd(struct devlink *devlink, u32 actions_performed,
  419. enum devlink_command cmd, struct genl_info *info)
  420. {
  421. struct sk_buff *msg;
  422. void *hdr;
  423. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  424. if (!msg)
  425. return -ENOMEM;
  426. hdr = genlmsg_put(msg, info->snd_portid, info->snd_seq, &devlink_nl_family, 0, cmd);
  427. if (!hdr)
  428. goto free_msg;
  429. if (devlink_nl_put_handle(msg, devlink))
  430. goto nla_put_failure;
  431. if (nla_put_bitfield32(msg, DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED, actions_performed,
  432. actions_performed))
  433. goto nla_put_failure;
  434. genlmsg_end(msg, hdr);
  435. return genlmsg_reply(msg, info);
  436. nla_put_failure:
  437. genlmsg_cancel(msg, hdr);
  438. free_msg:
  439. nlmsg_free(msg);
  440. return -EMSGSIZE;
  441. }
  442. int devlink_nl_reload_doit(struct sk_buff *skb, struct genl_info *info)
  443. {
  444. struct devlink *devlink = info->user_ptr[0];
  445. enum devlink_reload_action action;
  446. enum devlink_reload_limit limit;
  447. struct net *dest_net = NULL;
  448. u32 actions_performed;
  449. int err;
  450. err = devlink_resources_validate(devlink, NULL, info);
  451. if (err) {
  452. NL_SET_ERR_MSG(info->extack, "resources size validation failed");
  453. return err;
  454. }
  455. action = nla_get_u8_default(info->attrs[DEVLINK_ATTR_RELOAD_ACTION],
  456. DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
  457. if (!devlink_reload_action_is_supported(devlink, action)) {
  458. NL_SET_ERR_MSG(info->extack, "Requested reload action is not supported by the driver");
  459. return -EOPNOTSUPP;
  460. }
  461. limit = DEVLINK_RELOAD_LIMIT_UNSPEC;
  462. if (info->attrs[DEVLINK_ATTR_RELOAD_LIMITS]) {
  463. struct nla_bitfield32 limits;
  464. u32 limits_selected;
  465. limits = nla_get_bitfield32(info->attrs[DEVLINK_ATTR_RELOAD_LIMITS]);
  466. limits_selected = limits.value & limits.selector;
  467. if (!limits_selected) {
  468. NL_SET_ERR_MSG(info->extack, "Invalid limit selected");
  469. return -EINVAL;
  470. }
  471. for (limit = 0 ; limit <= DEVLINK_RELOAD_LIMIT_MAX ; limit++)
  472. if (limits_selected & BIT(limit))
  473. break;
  474. /* UAPI enables multiselection, but currently it is not used */
  475. if (limits_selected != BIT(limit)) {
  476. NL_SET_ERR_MSG(info->extack, "Multiselection of limit is not supported");
  477. return -EOPNOTSUPP;
  478. }
  479. if (!devlink_reload_limit_is_supported(devlink, limit)) {
  480. NL_SET_ERR_MSG(info->extack, "Requested limit is not supported by the driver");
  481. return -EOPNOTSUPP;
  482. }
  483. if (devlink_reload_combination_is_invalid(action, limit)) {
  484. NL_SET_ERR_MSG(info->extack, "Requested limit is invalid for this action");
  485. return -EINVAL;
  486. }
  487. }
  488. if (info->attrs[DEVLINK_ATTR_NETNS_PID] ||
  489. info->attrs[DEVLINK_ATTR_NETNS_FD] ||
  490. info->attrs[DEVLINK_ATTR_NETNS_ID]) {
  491. dest_net = devlink_netns_get(skb, info);
  492. if (IS_ERR(dest_net))
  493. return PTR_ERR(dest_net);
  494. if (!net_eq(dest_net, devlink_net(devlink)) &&
  495. action != DEVLINK_RELOAD_ACTION_DRIVER_REINIT) {
  496. NL_SET_ERR_MSG_MOD(info->extack,
  497. "Changing namespace is only supported for reinit action");
  498. return -EOPNOTSUPP;
  499. }
  500. }
  501. err = devlink_reload(devlink, dest_net, action, limit, &actions_performed, info->extack);
  502. if (dest_net)
  503. put_net(dest_net);
  504. if (err)
  505. return err;
  506. /* For backward compatibility generate reply only if attributes used by user */
  507. if (!info->attrs[DEVLINK_ATTR_RELOAD_ACTION] && !info->attrs[DEVLINK_ATTR_RELOAD_LIMITS])
  508. return 0;
  509. return devlink_nl_reload_actions_performed_snd(devlink, actions_performed,
  510. DEVLINK_CMD_RELOAD, info);
  511. }
  512. bool devlink_reload_actions_valid(const struct devlink_ops *ops)
  513. {
  514. const struct devlink_reload_combination *comb;
  515. int i;
  516. if (!devlink_reload_supported(ops)) {
  517. if (WARN_ON(ops->reload_actions))
  518. return false;
  519. return true;
  520. }
  521. if (WARN_ON(!ops->reload_actions ||
  522. ops->reload_actions & BIT(DEVLINK_RELOAD_ACTION_UNSPEC) ||
  523. ops->reload_actions >= BIT(__DEVLINK_RELOAD_ACTION_MAX)))
  524. return false;
  525. if (WARN_ON(ops->reload_limits & BIT(DEVLINK_RELOAD_LIMIT_UNSPEC) ||
  526. ops->reload_limits >= BIT(__DEVLINK_RELOAD_LIMIT_MAX)))
  527. return false;
  528. for (i = 0; i < ARRAY_SIZE(devlink_reload_invalid_combinations); i++) {
  529. comb = &devlink_reload_invalid_combinations[i];
  530. if (ops->reload_actions == BIT(comb->action) &&
  531. ops->reload_limits == BIT(comb->limit))
  532. return false;
  533. }
  534. return true;
  535. }
  536. static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink,
  537. enum devlink_command cmd, u32 portid,
  538. u32 seq, int flags)
  539. {
  540. const struct devlink_ops *ops = devlink->ops;
  541. enum devlink_eswitch_encap_mode encap_mode;
  542. u8 inline_mode;
  543. void *hdr;
  544. int err = 0;
  545. u16 mode;
  546. hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
  547. if (!hdr)
  548. return -EMSGSIZE;
  549. err = devlink_nl_put_handle(msg, devlink);
  550. if (err)
  551. goto nla_put_failure;
  552. if (ops->eswitch_mode_get) {
  553. err = ops->eswitch_mode_get(devlink, &mode);
  554. if (err)
  555. goto nla_put_failure;
  556. err = nla_put_u16(msg, DEVLINK_ATTR_ESWITCH_MODE, mode);
  557. if (err)
  558. goto nla_put_failure;
  559. }
  560. if (ops->eswitch_inline_mode_get) {
  561. err = ops->eswitch_inline_mode_get(devlink, &inline_mode);
  562. if (err)
  563. goto nla_put_failure;
  564. err = nla_put_u8(msg, DEVLINK_ATTR_ESWITCH_INLINE_MODE,
  565. inline_mode);
  566. if (err)
  567. goto nla_put_failure;
  568. }
  569. if (ops->eswitch_encap_mode_get) {
  570. err = ops->eswitch_encap_mode_get(devlink, &encap_mode);
  571. if (err)
  572. goto nla_put_failure;
  573. err = nla_put_u8(msg, DEVLINK_ATTR_ESWITCH_ENCAP_MODE, encap_mode);
  574. if (err)
  575. goto nla_put_failure;
  576. }
  577. genlmsg_end(msg, hdr);
  578. return 0;
  579. nla_put_failure:
  580. genlmsg_cancel(msg, hdr);
  581. return err;
  582. }
  583. int devlink_nl_eswitch_get_doit(struct sk_buff *skb, struct genl_info *info)
  584. {
  585. struct devlink *devlink = info->user_ptr[0];
  586. struct sk_buff *msg;
  587. int err;
  588. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  589. if (!msg)
  590. return -ENOMEM;
  591. err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET,
  592. info->snd_portid, info->snd_seq, 0);
  593. if (err) {
  594. nlmsg_free(msg);
  595. return err;
  596. }
  597. return genlmsg_reply(msg, info);
  598. }
  599. int devlink_nl_eswitch_set_doit(struct sk_buff *skb, struct genl_info *info)
  600. {
  601. struct devlink *devlink = info->user_ptr[0];
  602. const struct devlink_ops *ops = devlink->ops;
  603. enum devlink_eswitch_encap_mode encap_mode;
  604. u8 inline_mode;
  605. int err = 0;
  606. u16 mode;
  607. if (info->attrs[DEVLINK_ATTR_ESWITCH_MODE]) {
  608. if (!ops->eswitch_mode_set)
  609. return -EOPNOTSUPP;
  610. err = devlink_rates_check(devlink, devlink_rate_is_node,
  611. info->extack);
  612. if (err)
  613. return err;
  614. mode = nla_get_u16(info->attrs[DEVLINK_ATTR_ESWITCH_MODE]);
  615. err = ops->eswitch_mode_set(devlink, mode, info->extack);
  616. if (err)
  617. return err;
  618. }
  619. if (info->attrs[DEVLINK_ATTR_ESWITCH_INLINE_MODE]) {
  620. if (!ops->eswitch_inline_mode_set)
  621. return -EOPNOTSUPP;
  622. inline_mode = nla_get_u8(info->attrs[DEVLINK_ATTR_ESWITCH_INLINE_MODE]);
  623. err = ops->eswitch_inline_mode_set(devlink, inline_mode,
  624. info->extack);
  625. if (err)
  626. return err;
  627. }
  628. if (info->attrs[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]) {
  629. if (!ops->eswitch_encap_mode_set)
  630. return -EOPNOTSUPP;
  631. encap_mode = nla_get_u8(info->attrs[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]);
  632. err = ops->eswitch_encap_mode_set(devlink, encap_mode,
  633. info->extack);
  634. if (err)
  635. return err;
  636. }
  637. return 0;
  638. }
  639. int devlink_info_serial_number_put(struct devlink_info_req *req, const char *sn)
  640. {
  641. if (!req->msg)
  642. return 0;
  643. return nla_put_string(req->msg, DEVLINK_ATTR_INFO_SERIAL_NUMBER, sn);
  644. }
  645. EXPORT_SYMBOL_GPL(devlink_info_serial_number_put);
  646. int devlink_info_board_serial_number_put(struct devlink_info_req *req,
  647. const char *bsn)
  648. {
  649. if (!req->msg)
  650. return 0;
  651. return nla_put_string(req->msg, DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER,
  652. bsn);
  653. }
  654. EXPORT_SYMBOL_GPL(devlink_info_board_serial_number_put);
  655. static int devlink_info_version_put(struct devlink_info_req *req, int attr,
  656. const char *version_name,
  657. const char *version_value,
  658. enum devlink_info_version_type version_type)
  659. {
  660. struct nlattr *nest;
  661. int err;
  662. if (req->version_cb)
  663. req->version_cb(version_name, version_type,
  664. req->version_cb_priv);
  665. if (!req->msg || !*version_value)
  666. return 0;
  667. nest = nla_nest_start_noflag(req->msg, attr);
  668. if (!nest)
  669. return -EMSGSIZE;
  670. err = nla_put_string(req->msg, DEVLINK_ATTR_INFO_VERSION_NAME,
  671. version_name);
  672. if (err)
  673. goto nla_put_failure;
  674. err = nla_put_string(req->msg, DEVLINK_ATTR_INFO_VERSION_VALUE,
  675. version_value);
  676. if (err)
  677. goto nla_put_failure;
  678. nla_nest_end(req->msg, nest);
  679. return 0;
  680. nla_put_failure:
  681. nla_nest_cancel(req->msg, nest);
  682. return err;
  683. }
  684. int devlink_info_version_fixed_put(struct devlink_info_req *req,
  685. const char *version_name,
  686. const char *version_value)
  687. {
  688. return devlink_info_version_put(req, DEVLINK_ATTR_INFO_VERSION_FIXED,
  689. version_name, version_value,
  690. DEVLINK_INFO_VERSION_TYPE_NONE);
  691. }
  692. EXPORT_SYMBOL_GPL(devlink_info_version_fixed_put);
  693. int devlink_info_version_stored_put(struct devlink_info_req *req,
  694. const char *version_name,
  695. const char *version_value)
  696. {
  697. return devlink_info_version_put(req, DEVLINK_ATTR_INFO_VERSION_STORED,
  698. version_name, version_value,
  699. DEVLINK_INFO_VERSION_TYPE_NONE);
  700. }
  701. EXPORT_SYMBOL_GPL(devlink_info_version_stored_put);
  702. int devlink_info_version_stored_put_ext(struct devlink_info_req *req,
  703. const char *version_name,
  704. const char *version_value,
  705. enum devlink_info_version_type version_type)
  706. {
  707. return devlink_info_version_put(req, DEVLINK_ATTR_INFO_VERSION_STORED,
  708. version_name, version_value,
  709. version_type);
  710. }
  711. EXPORT_SYMBOL_GPL(devlink_info_version_stored_put_ext);
  712. int devlink_info_version_running_put(struct devlink_info_req *req,
  713. const char *version_name,
  714. const char *version_value)
  715. {
  716. return devlink_info_version_put(req, DEVLINK_ATTR_INFO_VERSION_RUNNING,
  717. version_name, version_value,
  718. DEVLINK_INFO_VERSION_TYPE_NONE);
  719. }
  720. EXPORT_SYMBOL_GPL(devlink_info_version_running_put);
  721. int devlink_info_version_running_put_ext(struct devlink_info_req *req,
  722. const char *version_name,
  723. const char *version_value,
  724. enum devlink_info_version_type version_type)
  725. {
  726. return devlink_info_version_put(req, DEVLINK_ATTR_INFO_VERSION_RUNNING,
  727. version_name, version_value,
  728. version_type);
  729. }
  730. EXPORT_SYMBOL_GPL(devlink_info_version_running_put_ext);
  731. static int devlink_nl_driver_info_get(struct device_driver *drv,
  732. struct devlink_info_req *req)
  733. {
  734. if (!drv)
  735. return 0;
  736. if (drv->name[0])
  737. return nla_put_string(req->msg, DEVLINK_ATTR_INFO_DRIVER_NAME,
  738. drv->name);
  739. return 0;
  740. }
  741. static int
  742. devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink,
  743. enum devlink_command cmd, u32 portid,
  744. u32 seq, int flags, struct netlink_ext_ack *extack)
  745. {
  746. struct device *dev = devlink_to_dev(devlink);
  747. struct devlink_info_req req = {};
  748. void *hdr;
  749. int err;
  750. hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
  751. if (!hdr)
  752. return -EMSGSIZE;
  753. err = -EMSGSIZE;
  754. if (devlink_nl_put_handle(msg, devlink))
  755. goto err_cancel_msg;
  756. req.msg = msg;
  757. if (devlink->ops->info_get) {
  758. err = devlink->ops->info_get(devlink, &req, extack);
  759. if (err)
  760. goto err_cancel_msg;
  761. }
  762. err = devlink_nl_driver_info_get(dev->driver, &req);
  763. if (err)
  764. goto err_cancel_msg;
  765. genlmsg_end(msg, hdr);
  766. return 0;
  767. err_cancel_msg:
  768. genlmsg_cancel(msg, hdr);
  769. return err;
  770. }
  771. int devlink_nl_info_get_doit(struct sk_buff *skb, struct genl_info *info)
  772. {
  773. struct devlink *devlink = info->user_ptr[0];
  774. struct sk_buff *msg;
  775. int err;
  776. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  777. if (!msg)
  778. return -ENOMEM;
  779. err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET,
  780. info->snd_portid, info->snd_seq, 0,
  781. info->extack);
  782. if (err) {
  783. nlmsg_free(msg);
  784. return err;
  785. }
  786. return genlmsg_reply(msg, info);
  787. }
  788. static int
  789. devlink_nl_info_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
  790. struct netlink_callback *cb, int flags)
  791. {
  792. int err;
  793. err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET,
  794. NETLINK_CB(cb->skb).portid,
  795. cb->nlh->nlmsg_seq, flags,
  796. cb->extack);
  797. if (err == -EOPNOTSUPP)
  798. err = 0;
  799. return err;
  800. }
  801. int devlink_nl_info_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
  802. {
  803. return devlink_nl_dumpit(msg, cb, devlink_nl_info_get_dump_one);
  804. }
  805. static int devlink_nl_flash_update_fill(struct sk_buff *msg,
  806. struct devlink *devlink,
  807. enum devlink_command cmd,
  808. struct devlink_flash_notify *params)
  809. {
  810. void *hdr;
  811. hdr = genlmsg_put(msg, 0, 0, &devlink_nl_family, 0, cmd);
  812. if (!hdr)
  813. return -EMSGSIZE;
  814. if (devlink_nl_put_handle(msg, devlink))
  815. goto nla_put_failure;
  816. if (cmd != DEVLINK_CMD_FLASH_UPDATE_STATUS)
  817. goto out;
  818. if (params->status_msg &&
  819. nla_put_string(msg, DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG,
  820. params->status_msg))
  821. goto nla_put_failure;
  822. if (params->component &&
  823. nla_put_string(msg, DEVLINK_ATTR_FLASH_UPDATE_COMPONENT,
  824. params->component))
  825. goto nla_put_failure;
  826. if (devlink_nl_put_u64(msg, DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE,
  827. params->done))
  828. goto nla_put_failure;
  829. if (devlink_nl_put_u64(msg, DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL,
  830. params->total))
  831. goto nla_put_failure;
  832. if (devlink_nl_put_u64(msg, DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT,
  833. params->timeout))
  834. goto nla_put_failure;
  835. out:
  836. genlmsg_end(msg, hdr);
  837. return 0;
  838. nla_put_failure:
  839. genlmsg_cancel(msg, hdr);
  840. return -EMSGSIZE;
  841. }
  842. static void __devlink_flash_update_notify(struct devlink *devlink,
  843. enum devlink_command cmd,
  844. struct devlink_flash_notify *params)
  845. {
  846. struct sk_buff *msg;
  847. int err;
  848. WARN_ON(cmd != DEVLINK_CMD_FLASH_UPDATE &&
  849. cmd != DEVLINK_CMD_FLASH_UPDATE_END &&
  850. cmd != DEVLINK_CMD_FLASH_UPDATE_STATUS);
  851. if (!devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
  852. return;
  853. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  854. if (!msg)
  855. return;
  856. err = devlink_nl_flash_update_fill(msg, devlink, cmd, params);
  857. if (err)
  858. goto out_free_msg;
  859. devlink_nl_notify_send(devlink, msg);
  860. return;
  861. out_free_msg:
  862. nlmsg_free(msg);
  863. }
  864. static void devlink_flash_update_begin_notify(struct devlink *devlink)
  865. {
  866. struct devlink_flash_notify params = {};
  867. __devlink_flash_update_notify(devlink,
  868. DEVLINK_CMD_FLASH_UPDATE,
  869. &params);
  870. }
  871. static void devlink_flash_update_end_notify(struct devlink *devlink)
  872. {
  873. struct devlink_flash_notify params = {};
  874. __devlink_flash_update_notify(devlink,
  875. DEVLINK_CMD_FLASH_UPDATE_END,
  876. &params);
  877. }
  878. void devlink_flash_update_status_notify(struct devlink *devlink,
  879. const char *status_msg,
  880. const char *component,
  881. unsigned long done,
  882. unsigned long total)
  883. {
  884. struct devlink_flash_notify params = {
  885. .status_msg = status_msg,
  886. .component = component,
  887. .done = done,
  888. .total = total,
  889. };
  890. __devlink_flash_update_notify(devlink,
  891. DEVLINK_CMD_FLASH_UPDATE_STATUS,
  892. &params);
  893. }
  894. EXPORT_SYMBOL_GPL(devlink_flash_update_status_notify);
  895. void devlink_flash_update_timeout_notify(struct devlink *devlink,
  896. const char *status_msg,
  897. const char *component,
  898. unsigned long timeout)
  899. {
  900. struct devlink_flash_notify params = {
  901. .status_msg = status_msg,
  902. .component = component,
  903. .timeout = timeout,
  904. };
  905. __devlink_flash_update_notify(devlink,
  906. DEVLINK_CMD_FLASH_UPDATE_STATUS,
  907. &params);
  908. }
  909. EXPORT_SYMBOL_GPL(devlink_flash_update_timeout_notify);
  910. struct devlink_flash_component_lookup_ctx {
  911. const char *lookup_name;
  912. bool lookup_name_found;
  913. };
  914. static void
  915. devlink_flash_component_lookup_cb(const char *version_name,
  916. enum devlink_info_version_type version_type,
  917. void *version_cb_priv)
  918. {
  919. struct devlink_flash_component_lookup_ctx *lookup_ctx = version_cb_priv;
  920. if (version_type != DEVLINK_INFO_VERSION_TYPE_COMPONENT ||
  921. lookup_ctx->lookup_name_found)
  922. return;
  923. lookup_ctx->lookup_name_found =
  924. !strcmp(lookup_ctx->lookup_name, version_name);
  925. }
  926. static int devlink_flash_component_get(struct devlink *devlink,
  927. struct nlattr *nla_component,
  928. const char **p_component,
  929. struct netlink_ext_ack *extack)
  930. {
  931. struct devlink_flash_component_lookup_ctx lookup_ctx = {};
  932. struct devlink_info_req req = {};
  933. const char *component;
  934. int ret;
  935. if (!nla_component)
  936. return 0;
  937. component = nla_data(nla_component);
  938. if (!devlink->ops->info_get) {
  939. NL_SET_ERR_MSG_ATTR(extack, nla_component,
  940. "component update is not supported by this device");
  941. return -EOPNOTSUPP;
  942. }
  943. lookup_ctx.lookup_name = component;
  944. req.version_cb = devlink_flash_component_lookup_cb;
  945. req.version_cb_priv = &lookup_ctx;
  946. ret = devlink->ops->info_get(devlink, &req, NULL);
  947. if (ret)
  948. return ret;
  949. if (!lookup_ctx.lookup_name_found) {
  950. NL_SET_ERR_MSG_ATTR(extack, nla_component,
  951. "selected component is not supported by this device");
  952. return -EINVAL;
  953. }
  954. *p_component = component;
  955. return 0;
  956. }
  957. int devlink_nl_flash_update_doit(struct sk_buff *skb, struct genl_info *info)
  958. {
  959. struct nlattr *nla_overwrite_mask, *nla_file_name;
  960. struct devlink_flash_update_params params = {};
  961. struct devlink *devlink = info->user_ptr[0];
  962. const char *file_name;
  963. u32 supported_params;
  964. int ret;
  965. if (!devlink->ops->flash_update)
  966. return -EOPNOTSUPP;
  967. if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME))
  968. return -EINVAL;
  969. ret = devlink_flash_component_get(devlink,
  970. info->attrs[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT],
  971. &params.component, info->extack);
  972. if (ret)
  973. return ret;
  974. supported_params = devlink->ops->supported_flash_update_params;
  975. nla_overwrite_mask = info->attrs[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK];
  976. if (nla_overwrite_mask) {
  977. struct nla_bitfield32 sections;
  978. if (!(supported_params & DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK)) {
  979. NL_SET_ERR_MSG_ATTR(info->extack, nla_overwrite_mask,
  980. "overwrite settings are not supported by this device");
  981. return -EOPNOTSUPP;
  982. }
  983. sections = nla_get_bitfield32(nla_overwrite_mask);
  984. params.overwrite_mask = sections.value & sections.selector;
  985. }
  986. nla_file_name = info->attrs[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME];
  987. file_name = nla_data(nla_file_name);
  988. ret = request_firmware(&params.fw, file_name, devlink->dev);
  989. if (ret) {
  990. NL_SET_ERR_MSG_ATTR(info->extack, nla_file_name,
  991. "failed to locate the requested firmware file");
  992. return ret;
  993. }
  994. devlink_flash_update_begin_notify(devlink);
  995. ret = devlink->ops->flash_update(devlink, &params, info->extack);
  996. devlink_flash_update_end_notify(devlink);
  997. release_firmware(params.fw);
  998. return ret;
  999. }
  1000. static void __devlink_compat_running_version(struct devlink *devlink,
  1001. char *buf, size_t len)
  1002. {
  1003. struct devlink_info_req req = {};
  1004. const struct nlattr *nlattr;
  1005. struct sk_buff *msg;
  1006. int rem, err;
  1007. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1008. if (!msg)
  1009. return;
  1010. req.msg = msg;
  1011. err = devlink->ops->info_get(devlink, &req, NULL);
  1012. if (err)
  1013. goto free_msg;
  1014. nla_for_each_attr_type(nlattr, DEVLINK_ATTR_INFO_VERSION_RUNNING,
  1015. (void *)msg->data, msg->len, rem) {
  1016. const struct nlattr *kv;
  1017. int rem_kv;
  1018. nla_for_each_nested_type(kv, DEVLINK_ATTR_INFO_VERSION_VALUE,
  1019. nlattr, rem_kv) {
  1020. strlcat(buf, nla_data(kv), len);
  1021. strlcat(buf, " ", len);
  1022. }
  1023. }
  1024. free_msg:
  1025. nlmsg_consume(msg);
  1026. }
  1027. void devlink_compat_running_version(struct devlink *devlink,
  1028. char *buf, size_t len)
  1029. {
  1030. if (!devlink->ops->info_get)
  1031. return;
  1032. devl_lock(devlink);
  1033. if (devl_is_registered(devlink))
  1034. __devlink_compat_running_version(devlink, buf, len);
  1035. devl_unlock(devlink);
  1036. }
  1037. int devlink_compat_flash_update(struct devlink *devlink, const char *file_name)
  1038. {
  1039. struct devlink_flash_update_params params = {};
  1040. int ret;
  1041. devl_lock(devlink);
  1042. if (!devl_is_registered(devlink)) {
  1043. ret = -ENODEV;
  1044. goto out_unlock;
  1045. }
  1046. if (!devlink->ops->flash_update) {
  1047. ret = -EOPNOTSUPP;
  1048. goto out_unlock;
  1049. }
  1050. ret = request_firmware(&params.fw, file_name, devlink->dev);
  1051. if (ret)
  1052. goto out_unlock;
  1053. devlink_flash_update_begin_notify(devlink);
  1054. ret = devlink->ops->flash_update(devlink, &params, NULL);
  1055. devlink_flash_update_end_notify(devlink);
  1056. release_firmware(params.fw);
  1057. out_unlock:
  1058. devl_unlock(devlink);
  1059. return ret;
  1060. }
  1061. static int
  1062. devlink_nl_selftests_fill(struct sk_buff *msg, struct devlink *devlink,
  1063. u32 portid, u32 seq, int flags,
  1064. struct netlink_ext_ack *extack)
  1065. {
  1066. struct nlattr *selftests;
  1067. void *hdr;
  1068. int err;
  1069. int i;
  1070. hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags,
  1071. DEVLINK_CMD_SELFTESTS_GET);
  1072. if (!hdr)
  1073. return -EMSGSIZE;
  1074. err = -EMSGSIZE;
  1075. if (devlink_nl_put_handle(msg, devlink))
  1076. goto err_cancel_msg;
  1077. selftests = nla_nest_start(msg, DEVLINK_ATTR_SELFTESTS);
  1078. if (!selftests)
  1079. goto err_cancel_msg;
  1080. for (i = DEVLINK_ATTR_SELFTEST_ID_UNSPEC + 1;
  1081. i <= DEVLINK_ATTR_SELFTEST_ID_MAX; i++) {
  1082. if (devlink->ops->selftest_check(devlink, i, extack)) {
  1083. err = nla_put_flag(msg, i);
  1084. if (err)
  1085. goto err_cancel_msg;
  1086. }
  1087. }
  1088. nla_nest_end(msg, selftests);
  1089. genlmsg_end(msg, hdr);
  1090. return 0;
  1091. err_cancel_msg:
  1092. genlmsg_cancel(msg, hdr);
  1093. return err;
  1094. }
  1095. int devlink_nl_selftests_get_doit(struct sk_buff *skb, struct genl_info *info)
  1096. {
  1097. struct devlink *devlink = info->user_ptr[0];
  1098. struct sk_buff *msg;
  1099. int err;
  1100. if (!devlink->ops->selftest_check)
  1101. return -EOPNOTSUPP;
  1102. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1103. if (!msg)
  1104. return -ENOMEM;
  1105. err = devlink_nl_selftests_fill(msg, devlink, info->snd_portid,
  1106. info->snd_seq, 0, info->extack);
  1107. if (err) {
  1108. nlmsg_free(msg);
  1109. return err;
  1110. }
  1111. return genlmsg_reply(msg, info);
  1112. }
  1113. static int devlink_nl_selftests_get_dump_one(struct sk_buff *msg,
  1114. struct devlink *devlink,
  1115. struct netlink_callback *cb,
  1116. int flags)
  1117. {
  1118. if (!devlink->ops->selftest_check)
  1119. return 0;
  1120. return devlink_nl_selftests_fill(msg, devlink,
  1121. NETLINK_CB(cb->skb).portid,
  1122. cb->nlh->nlmsg_seq, flags,
  1123. cb->extack);
  1124. }
  1125. int devlink_nl_selftests_get_dumpit(struct sk_buff *skb,
  1126. struct netlink_callback *cb)
  1127. {
  1128. return devlink_nl_dumpit(skb, cb, devlink_nl_selftests_get_dump_one);
  1129. }
  1130. static int devlink_selftest_result_put(struct sk_buff *skb, unsigned int id,
  1131. enum devlink_selftest_status test_status)
  1132. {
  1133. struct nlattr *result_attr;
  1134. result_attr = nla_nest_start(skb, DEVLINK_ATTR_SELFTEST_RESULT);
  1135. if (!result_attr)
  1136. return -EMSGSIZE;
  1137. if (nla_put_u32(skb, DEVLINK_ATTR_SELFTEST_RESULT_ID, id) ||
  1138. nla_put_u8(skb, DEVLINK_ATTR_SELFTEST_RESULT_STATUS,
  1139. test_status))
  1140. goto nla_put_failure;
  1141. nla_nest_end(skb, result_attr);
  1142. return 0;
  1143. nla_put_failure:
  1144. nla_nest_cancel(skb, result_attr);
  1145. return -EMSGSIZE;
  1146. }
  1147. static const struct nla_policy devlink_selftest_nl_policy[DEVLINK_ATTR_SELFTEST_ID_MAX + 1] = {
  1148. [DEVLINK_ATTR_SELFTEST_ID_FLASH] = { .type = NLA_FLAG },
  1149. };
  1150. int devlink_nl_selftests_run_doit(struct sk_buff *skb, struct genl_info *info)
  1151. {
  1152. struct nlattr *tb[DEVLINK_ATTR_SELFTEST_ID_MAX + 1];
  1153. struct devlink *devlink = info->user_ptr[0];
  1154. struct nlattr *attrs, *selftests;
  1155. struct sk_buff *msg;
  1156. void *hdr;
  1157. int err;
  1158. int i;
  1159. if (!devlink->ops->selftest_run || !devlink->ops->selftest_check)
  1160. return -EOPNOTSUPP;
  1161. if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_SELFTESTS))
  1162. return -EINVAL;
  1163. attrs = info->attrs[DEVLINK_ATTR_SELFTESTS];
  1164. err = nla_parse_nested(tb, DEVLINK_ATTR_SELFTEST_ID_MAX, attrs,
  1165. devlink_selftest_nl_policy, info->extack);
  1166. if (err < 0)
  1167. return err;
  1168. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1169. if (!msg)
  1170. return -ENOMEM;
  1171. err = -EMSGSIZE;
  1172. hdr = genlmsg_put(msg, info->snd_portid, info->snd_seq,
  1173. &devlink_nl_family, 0, DEVLINK_CMD_SELFTESTS_RUN);
  1174. if (!hdr)
  1175. goto free_msg;
  1176. if (devlink_nl_put_handle(msg, devlink))
  1177. goto genlmsg_cancel;
  1178. selftests = nla_nest_start(msg, DEVLINK_ATTR_SELFTESTS);
  1179. if (!selftests)
  1180. goto genlmsg_cancel;
  1181. for (i = DEVLINK_ATTR_SELFTEST_ID_UNSPEC + 1;
  1182. i <= DEVLINK_ATTR_SELFTEST_ID_MAX; i++) {
  1183. enum devlink_selftest_status test_status;
  1184. if (nla_get_flag(tb[i])) {
  1185. if (!devlink->ops->selftest_check(devlink, i,
  1186. info->extack)) {
  1187. if (devlink_selftest_result_put(msg, i,
  1188. DEVLINK_SELFTEST_STATUS_SKIP))
  1189. goto selftests_nest_cancel;
  1190. continue;
  1191. }
  1192. test_status = devlink->ops->selftest_run(devlink, i,
  1193. info->extack);
  1194. if (devlink_selftest_result_put(msg, i, test_status))
  1195. goto selftests_nest_cancel;
  1196. }
  1197. }
  1198. nla_nest_end(msg, selftests);
  1199. genlmsg_end(msg, hdr);
  1200. return genlmsg_reply(msg, info);
  1201. selftests_nest_cancel:
  1202. nla_nest_cancel(msg, selftests);
  1203. genlmsg_cancel:
  1204. genlmsg_cancel(msg, hdr);
  1205. free_msg:
  1206. nlmsg_free(msg);
  1207. return err;
  1208. }