forked from mirrors/linux
		
	Currently this stack trace can be seen with CONFIG_DEBUG_ATOMIC_SLEEP=y:
[   41.568348] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:909
[   41.576757] in_atomic(): 1, irqs_disabled(): 0, pid: 208, name: ptp4l
[   41.583212] INFO: lockdep is turned off.
[   41.587123] CPU: 1 PID: 208 Comm: ptp4l Not tainted 5.3.0-rc6-01445-ge950f2d4bc7f-dirty #1827
[   41.599873] [<c0313d7c>] (unwind_backtrace) from [<c030e13c>] (show_stack+0x10/0x14)
[   41.607584] [<c030e13c>] (show_stack) from [<c1212d50>] (dump_stack+0xd4/0x100)
[   41.614863] [<c1212d50>] (dump_stack) from [<c037dfc8>] (___might_sleep+0x1c8/0x2b4)
[   41.622574] [<c037dfc8>] (___might_sleep) from [<c122ea90>] (__mutex_lock+0x48/0xab8)
[   41.630368] [<c122ea90>] (__mutex_lock) from [<c122f51c>] (mutex_lock_nested+0x1c/0x24)
[   41.638340] [<c122f51c>] (mutex_lock_nested) from [<c0c6fe08>] (sja1105_static_config_reload+0x30/0x27c)
[   41.647779] [<c0c6fe08>] (sja1105_static_config_reload) from [<c0c7015c>] (sja1105_hwtstamp_set+0x108/0x1cc)
[   41.657562] [<c0c7015c>] (sja1105_hwtstamp_set) from [<c0feb650>] (dev_ifsioc+0x18c/0x330)
[   41.665788] [<c0feb650>] (dev_ifsioc) from [<c0febbd8>] (dev_ioctl+0x320/0x6e8)
[   41.673064] [<c0febbd8>] (dev_ioctl) from [<c0f8b1f4>] (sock_ioctl+0x334/0x5e8)
[   41.680340] [<c0f8b1f4>] (sock_ioctl) from [<c05404a8>] (do_vfs_ioctl+0xb0/0xa10)
[   41.687789] [<c05404a8>] (do_vfs_ioctl) from [<c0540e3c>] (ksys_ioctl+0x34/0x58)
[   41.695151] [<c0540e3c>] (ksys_ioctl) from [<c0301000>] (ret_fast_syscall+0x0/0x28)
[   41.702768] Exception stack(0xe8495fa8 to 0xe8495ff0)
[   41.707796] 5fa0:                   beff4a8c 00000001 00000011 000089b0 beff4a8c beff4a80
[   41.715933] 5fc0: beff4a8c 00000001 0000000c 00000036 b6fa98c8 004e19c1 00000001 00000000
[   41.724069] 5fe0: 004dcedc beff4a6c 004c0738 b6e7af4c
[   41.729860] BUG: scheduling while atomic: ptp4l/208/0x00000002
[   41.735682] INFO: lockdep is turned off.
Enabling RX timestamping will logically disturb the fastpath (processing
of meta frames). Replace bool hwts_rx_en with a bit that is checked
atomically from the fastpath and temporarily unset from the sleepable
context during a change of the RX timestamping process (a destructive
operation anyways, requires switch reset).
If found unset, the fastpath (net/dsa/tag_sja1105.c) will just drop any
received meta frame and not take the meta_lock at all.
Fixes: a602afd200 ("net: dsa: sja1105: Expose PTP timestamping ioctls to userspace")
Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
		
	
			
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0
 | 
						|
 * Copyright (c) 2019, Vladimir Oltean <olteanv@gmail.com>
 | 
						|
 */
 | 
						|
 | 
						|
/* Included by drivers/net/dsa/sja1105/sja1105.h and net/dsa/tag_sja1105.c */
 | 
						|
 | 
						|
#ifndef _NET_DSA_SJA1105_H
 | 
						|
#define _NET_DSA_SJA1105_H
 | 
						|
 | 
						|
#include <linux/skbuff.h>
 | 
						|
#include <linux/etherdevice.h>
 | 
						|
#include <net/dsa.h>
 | 
						|
 | 
						|
#define ETH_P_SJA1105				ETH_P_DSA_8021Q
 | 
						|
#define ETH_P_SJA1105_META			0x0008
 | 
						|
 | 
						|
/* IEEE 802.3 Annex 57A: Slow Protocols PDUs (01:80:C2:xx:xx:xx) */
 | 
						|
#define SJA1105_LINKLOCAL_FILTER_A		0x0180C2000000ull
 | 
						|
#define SJA1105_LINKLOCAL_FILTER_A_MASK		0xFFFFFF000000ull
 | 
						|
/* IEEE 1588 Annex F: Transport of PTP over Ethernet (01:1B:19:xx:xx:xx) */
 | 
						|
#define SJA1105_LINKLOCAL_FILTER_B		0x011B19000000ull
 | 
						|
#define SJA1105_LINKLOCAL_FILTER_B_MASK		0xFFFFFF000000ull
 | 
						|
 | 
						|
/* Source and Destination MAC of follow-up meta frames.
 | 
						|
 * Whereas the choice of SMAC only affects the unique identification of the
 | 
						|
 * switch as sender of meta frames, the DMAC must be an address that is present
 | 
						|
 * in the DSA master port's multicast MAC filter.
 | 
						|
 * 01-80-C2-00-00-0E is a good choice for this, as all profiles of IEEE 1588
 | 
						|
 * over L2 use this address for some purpose already.
 | 
						|
 */
 | 
						|
#define SJA1105_META_SMAC			0x222222222222ull
 | 
						|
#define SJA1105_META_DMAC			0x0180C200000Eull
 | 
						|
 | 
						|
#define SJA1105_HWTS_RX_EN			0
 | 
						|
 | 
						|
/* Global tagger data: each struct sja1105_port has a reference to
 | 
						|
 * the structure defined in struct sja1105_private.
 | 
						|
 */
 | 
						|
struct sja1105_tagger_data {
 | 
						|
	struct sk_buff_head skb_rxtstamp_queue;
 | 
						|
	struct work_struct rxtstamp_work;
 | 
						|
	struct sk_buff *stampable_skb;
 | 
						|
	/* Protects concurrent access to the meta state machine
 | 
						|
	 * from taggers running on multiple ports on SMP systems
 | 
						|
	 */
 | 
						|
	spinlock_t meta_lock;
 | 
						|
	unsigned long state;
 | 
						|
};
 | 
						|
 | 
						|
struct sja1105_skb_cb {
 | 
						|
	u32 meta_tstamp;
 | 
						|
};
 | 
						|
 | 
						|
#define SJA1105_SKB_CB(skb) \
 | 
						|
	((struct sja1105_skb_cb *)DSA_SKB_CB_PRIV(skb))
 | 
						|
 | 
						|
struct sja1105_port {
 | 
						|
	struct sja1105_tagger_data *data;
 | 
						|
	struct dsa_port *dp;
 | 
						|
	bool hwts_tx_en;
 | 
						|
	int mgmt_slot;
 | 
						|
};
 | 
						|
 | 
						|
#endif /* _NET_DSA_SJA1105_H */
 |