From: Maksim Kiselev <bigunclemax@gmail.com>
To: bigunclemax@gmail.com
Cc: fido_max@inbox.ru, mw@semihalf.com, Andrew Lunn <andrew@lunn.ch>,
Florian Fainelli <f.fainelli@gmail.com>,
Vladimir Oltean <olteanv@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Richard Cochran <richardcochran@gmail.com>,
Russell King <linux@armlinux.org.uk>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Subject: Locking mv88e6xxx_reg_lock twice leads deadlock for 88E6176 switch
Date: Wed, 14 Dec 2022 01:58:55 +0300 [thread overview]
Message-ID: <20221213225856.1506850-1-bigunclemax@gmail.com> (raw)
Subject: Locking mv88e6xxx_reg_lock twice leads deadlock for 88E6176 switch
Hello, friends.
I have a device with Marvell 88E6176 switch.
After 'mv88e6xxx: fix speed setting for CPU/DSA ports (cc1049ccee20)'commit was applied to
mainline kernel I faced with a problem that switch driver stuck at 'mv88e6xxx_probe' function.
I made some investigations and found that 'mv88e6xxx_reg_lock' called twice from the same thread which leads to deadlock.
I added logs to 'mv88e6xxx_reg_lock' and 'mv88e6xxx_reg_unlock' functions to see what happened.
So, first lock called from mv88e6xxx_setup:
static int mv88e6xxx_setup(struct dsa_switch *ds)
{
...
if (mv88e6xxx_has_pvt(chip))
ds->max_num_bridges = MV88E6XXX_MAX_PVT_SWITCHES -
ds->dst->last_switch - 1;
mv88e6xxx_reg_lock(chip);
And second lock called from mv88e6352_phylink_get_caps (only for port 4):
static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
struct phylink_config *config)
{
...
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
MAC_1000FD;
/* Port 4 supports automedia if the serdes is associated with it. */
if (port == 4) {
dump_stack(); // I added this to see where we came from
mv88e6xxx_reg_lock(chip);
Here is kernel log with my debug output and call stack right before secondary lock:
[ 5.801203] mv88e6085 mdio@2d24000:0c: switch 0x1760 detected: Marvell 88E6176, revision 1
[ 5.950236] >>>>> (mv88e6xxx_reg_lock|797) from mv88e6xxx_mdio_read+0x54/0xfc [mv88e6xxx] thread_id: 287
[ 5.952884] >>>>> (mv88e6xxx_reg_unlock|804) from mv88e6xxx_mdio_read+0x88/0xfc [mv88e6xxx] thread_id: 287
[ 5.969373] >>>>> (mv88e6xxx_reg_lock|797) from mv88e6xxx_setup+0x5c/0x550 [mv88e6xxx] thread_id: 287
[ 6.023785] >>>>> (mv88e6xxx_reg_lock|797) from mv88e6xxx_g1_irq_thread_work+0x28/0x124 [mv88e6xxx] thread_id: 315
[ 6.069185] Backtrace:
[ 6.069206] dump_backtrace from show_stack+0x18/0x1c
[ 6.069266] r7:f1221aa4 r6:00000004 r5:600b0013 r4:c08d684d
[ 6.069279] show_stack from dump_stack_lvl+0x48/0x54
[ 6.069315] dump_stack_lvl from dump_stack+0x14/0x1c
[ 6.069351] r5:f1221ab4 r4:c1e40040
[ 6.069363] dump_stack from mv88e6352_phylink_get_caps+0x58/0x164 [mv88e6xxx]
[ 6.069645] mv88e6352_phylink_get_caps [mv88e6xxx] from mv88e6xxx_get_caps+0x2c/0x4c [mv88e6xxx]
[ 6.070106] r7:c1ff31c0 r6:00000004 r5:c1ff31c0 r4:f1221aa4
[ 6.070118] mv88e6xxx_get_caps [mv88e6xxx] from mv88e6xxx_setup_port+0x84/0x60c [mv88e6xxx]
[ 6.070575] r7:c1ff31c0 r6:00000004 r5:c1e40040 r4:bf16e510
[ 6.070588] mv88e6xxx_setup_port [mv88e6xxx] from mv88e6xxx_setup+0x3e0/0x550 [mv88e6xxx]
[ 6.071048] r9:c1083600 r8:c1e40e04 r7:00000004 r6:c1ff31c0 r5:c1e40040 r4:bf16e510
[ 6.071062] mv88e6xxx_setup [mv88e6xxx] from dsa_register_switch+0x738/0xba8 [dsa_core]
[ 6.071451] r8:c23395c8 r7:c1ff31c0 r6:c23395c0 r5:c1ff31c0 r4:00000000
[ 6.071464] dsa_register_switch [dsa_core] from mv88e6xxx_probe+0x640/0x6a8 [mv88e6xxx]
[ 6.071835] r10:c1164000 r9:bf171a2c r8:ef7f00f8 r7:00000000 r6:00000000 r5:c1e40040
[ 6.071851] r4:c13ea000
[ 6.071862] mv88e6xxx_probe [mv88e6xxx] from mdio_probe+0x34/0x50
[ 6.072133] r10:c1164000 r9:c1e6a5b8 r8:bf173c4c r7:00000000 r6:bf173000 r5:c13ea000
[ 6.072149] r4:bf173000
[ 6.072160] mdio_probe from really_probe+0x14c/0x2b8
[ 6.072206] r5:c13ea000 r4:00000000
[ 6.072218] really_probe from __driver_probe_device+0xcc/0xe0
[ 6.072260] r7:00000039 r6:c13ea000 r5:bf173000 r4:c13ea000
[ 6.072273] __driver_probe_device from driver_probe_device+0x40/0xbc
[ 6.072312] r5:c13ea000 r4:c0cbdbc0
[ 6.072324] driver_probe_device from __driver_attach+0xf0/0x104
[ 6.072367] r7:c0c7c790 r6:bf173000 r5:c13ea000 r4:00000000
[ 6.072380] __driver_attach from bus_for_each_dev+0x70/0xb4
[ 6.072434] r7:c0c7c790 r6:c04e87e8 r5:bf173000 r4:c13ea000
[ 6.072446] bus_for_each_dev from driver_attach+0x20/0x28
[ 6.072507] r6:00000000 r5:c1e6a580 r4:bf173000
[ 6.072520] driver_attach from bus_add_driver+0xbc/0x1cc
[ 6.072574] bus_add_driver from driver_register+0xb4/0xfc
[ 6.072633] r9:bf102000 r8:bf173c4c r7:f1221ea0 r6:c1ff8800 r5:bf173c40 r4:bf173000
[ 6.072647] driver_register from mdio_driver_register+0x34/0x68
[ 6.072696] r5:bf173c40 r4:bf173000
[ 6.072708] mdio_driver_register from mdio_module_init+0x14/0x1000 [mv88e6xxx]
[ 6.072976] r5:bf173c40 r4:c0c88000
[ 6.072988] mdio_module_init [mv88e6xxx] from do_one_initcall+0x6c/0x1d8
[ 6.073239] do_one_initcall from do_init_module+0x48/0x1c4
[ 6.073292] r10:0000000c r9:00000000 r8:bf173c4c r7:f1221ea0 r6:c1ff8800 r5:bf173c40
[ 6.073308] r4:bf173c40
[ 6.073319] do_init_module from load_module+0x1558/0x1698
[ 6.073362] r6:00000000 r5:bf173c40 r4:f1221f28
[ 6.073374] load_module from sys_finit_module+0xdc/0xec
[ 6.073423] r10:0000017b r9:c1164000 r8:c020029c r7:0000017b r6:0000000f r5:b6edbee8
[ 6.073439] r4:00000000
[ 6.073450] sys_finit_module from ret_fast_syscall+0x0/0x4c
[ 6.073485] Exception stack(0xf1221fa8 to 0xf1221ff0)
[ 6.073515] 1fa0: 00020000 00000000 0000000f b6edbee8 00000000 004a3420
[ 6.073544] 1fc0: 00020000 00000000 00000000 0000017b 004a96a8 beb9292c 00000000 004a3420
[ 6.073567] 1fe0: beb92820 beb92810 b6ed5294 b6b98c30
[ 6.073589] r6:00000000 r5:00000000 r4:00020000
[ 6.073658] >>>>> (mv88e6xxx_reg_lock|797) from mv88e6352_phylink_get_caps+0x60/0x164 [mv88e6xxx] thread_id: 287
next reply other threads:[~2022-12-13 22:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-13 22:58 Maksim Kiselev [this message]
2022-12-14 11:03 ` Subject: Locking mv88e6xxx_reg_lock twice leads deadlock for 88E6176 switch Vladimir Oltean
2022-12-14 11:42 ` Maxim Kiselev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221213225856.1506850-1-bigunclemax@gmail.com \
--to=bigunclemax@gmail.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=fido_max@inbox.ru \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=mw@semihalf.com \
--cc=netdev@vger.kernel.org \
--cc=olteanv@gmail.com \
--cc=pabeni@redhat.com \
--cc=richardcochran@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox