Blob Blame History Raw
From: Shung-Hsi Yu <shung-hsi.yu@suse.com>
Date: Fri, 25 Aug 2023 13:30:00 +0800
Subject: [PATCH] net: mana: add support for XDP_QUERY_PROG
Patch-mainline: Never, old kernel
References: jsc#SLE-18779, bsc#1214209

The MANA driver is added in v5.13, when the XDP_QUERY_PROG kernel is already
removed. However in SLE12-SP5 still expect driver to support the
XDP_QUERY_PROG since it based on 4.12 kernel, which leads to the warning
seen below.

Luckily XDP_QUERY_PROG is easy to support. So let's just add XDP_QUERY_PROG
support to MANA driver.

  WARNING: CPU: 0 PID: 624 at ../net/core/dev.c:7029 __dev_xdp_attached+0x60/0x70
  Modules linked in: kvm mana(X+) hyperv_fb(X+) i2c_piix4 pcspkr joydev irqbypass pci_hyperv(X) xfs libcrc32c ata_generic pata_acpi sd_mod sr_mod cdrom hid_generic crc32_pclmul crc32c_intel ghash_clmulni_intel pcbc hid_hyperv(X) hyperv_keyboard(X) hv_netvsc(X) hv_storvsc(X) scsi_transport_fc serio_raw aesni_intel ata_piix floppy hv_vmbus(X) libata aes_x86_64 crypto_simd glue_helper cryptd sunrpc dm_mirror dm_region_hash dm_log dm_mod sg scsi_transport_iscsi scsi_mod autofs4
  Supported: Yes, External
  CPU: 0 PID: 624 Comm: systemd-udevd Tainted: G                   4.12.14-95.102-default #1 SLE12-SP4
  Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS 090008  02/27/2023
  task: ffff8ffe5f51c480 task.stack: ffffacec82eb4000
  RIP: 0010:__dev_xdp_attached+0x60/0x70
  RSP: 0018:ffffacec82eb7860 EFLAGS: 00010282
  RAX: 00000000ffffffa1 RBX: ffffacec82eb78a4 RCX: 0000000000000000
  RDX: ffffacec82eb78a4 RSI: ffffacec82eb7860 RDI: ffff8ffe6a2d6000
  RBP: ffff8ffe6a2d6000 R08: 0000000000000000 R09: ffff8ffe5efae210
  R10: 0000000000000004 R11: 0000000000000000 R12: ffff8ffe5efae20c
  R13: ffff8ffe5efae000 R14: 0000000000000000 R15: ffffffffc03dd080
  FS:  00007fa5259438c0(0000) GS:ffff8ffe7fc00000(0000) knlGS:0000000000000000
  CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
  CR2: 00007fa5257b9e24 CR3: 000000029eaee004 CR4: 00000000003606f0
  DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
  DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400
  Call Trace:
   rtnl_fill_ifinfo+0xe25/0xf60
   ? __alloc_skb+0x87/0x260
   rtmsg_ifinfo_build_skb+0x7f/0xe0
   rtmsg_ifinfo_event.part.26+0x12/0x50
   rtnetlink_event+0x50/0x70
   notifier_call_chain+0x47/0x70
   __netdev_upper_dev_link+0x110/0x1a0
   netvsc_netdev_event+0x289/0x340 [hv_netvsc]
   notifier_call_chain+0x47/0x70
   register_netdevice+0x332/0x410
   register_netdev+0x16/0x30
   mana_probe+0x325/0x3f0 [mana]
   mana_gd_probe+0x191/0x200 [mana]
   local_pci_probe+0x44/0xb0
   pci_device_probe+0x109/0x170
   driver_probe_device+0x387/0x480
   device_driver_attach+0x7a/0x80
   __driver_attach+0xc5/0x150
   ? device_driver_attach+0x80/0x80
   bus_for_each_dev+0x5a/0x90
   bus_add_driver+0xfe/0x220
   driver_register+0x5b/0xe0
   ? 0xffffffffc03f9000
   do_one_initcall+0x50/0x1b0
   do_init_module+0x5a/0x1fe
   load_module+0x1656/0x1f10
   ? m_show+0x1b0/0x1b0
   ? security_capable+0x47/0x70
   SYSC_finit_module+0x80/0xc0
   do_syscall_64+0x74/0x160
   entry_SYSCALL_64_after_hwframe+0x77/0xdc
  RIP: 0033:0x7fa5247acbc9
  RSP: 002b:00007ffeb9d8d218 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
  RAX: ffffffffffffffda RBX: 0000558192790d80 RCX: 00007fa5247acbc9
  RDX: 0000000000000000 RSI: 00007fa524ca82fb RDI: 0000000000000007
  RBP: 00007fa524ca82fb R08: 0000558192784aad R09: 0000000000000000
  R10: 0000000000000006 R11: 0000000000000246 R12: 0000000000020000
  R13: 0000000000000000 R14: 00005581927843f0 R15: 0000000000000000
  Code: 00 c7 04 24 02 00 00 00 e8 de 6e 41 00 85 c0 78 1a 48 85 db 74 06 8b 44 24 0c 89 03 0f b6 44 24 08 48 83 c4 20 5b e9 00 71 41 00 <0f> 0b eb e2 66 66 2e 0f 1f 84 00 00 00 00 00 90 0f 1f 44 00 00 

Signed-off-by: Shung-Hsi Yu <shung-hsi.yu@suse.com>
---
 drivers/net/ethernet/microsoft/mana/mana_bpf.c |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

--- a/drivers/net/ethernet/microsoft/mana/mana_bpf.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_bpf.c
@@ -145,6 +145,19 @@ static int mana_xdp_set(struct net_devic
 	return 0;
 }
 
+static int mana_xdp_query(struct net_device *ndev)
+{
+	struct mana_port_context *apc = netdev_priv(ndev);
+	struct bpf_prog *prog;
+
+	prog = mana_xdp_get(apc);
+
+	if (prog)
+		return prog->aux->id;
+
+	return 0;
+}
+
 int mana_bpf(struct net_device *ndev, struct netdev_bpf *bpf)
 {
 	struct netlink_ext_ack *extack = bpf->extack;
@@ -153,6 +166,8 @@ int mana_bpf(struct net_device *ndev, st
 	switch (bpf->command) {
 	case XDP_SETUP_PROG:
 		return mana_xdp_set(ndev, bpf->prog, extack);
+	case XDP_QUERY_PROG:
+		return mana_xdp_query(ndev);
 
 	default:
 		return -EOPNOTSUPP;