mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 03:13:59 +00:00 
			
		
		
		
	 bc971dee6e
			
		
	
	
		bc971dee6e
		
	
	
	
	
		
			
			Dave, you were right and the sleeping locks in shaper were broken. Markus Kanet noticed this and also tested the patch below that switches locking to spinlocks. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __LINUX_SHAPER_H
 | |
| #define __LINUX_SHAPER_H
 | |
| 
 | |
| #ifdef __KERNEL__
 | |
| 
 | |
| #define SHAPER_QLEN	10
 | |
| /*
 | |
|  *	This is a bit speed dependent (read it shouldn't be a constant!)
 | |
|  *
 | |
|  *	5 is about right for 28.8 upwards. Below that double for every
 | |
|  *	halving of speed or so. - ie about 20 for 9600 baud.
 | |
|  */
 | |
| #define SHAPER_LATENCY	(5*HZ)
 | |
| #define SHAPER_MAXSLIP	2
 | |
| #define SHAPER_BURST	(HZ/50)		/* Good for >128K then */
 | |
| 
 | |
| struct shaper
 | |
| {
 | |
| 	struct sk_buff_head sendq;
 | |
| 	__u32 bytespertick;
 | |
| 	__u32 bitspersec;
 | |
| 	__u32 shapelatency;
 | |
| 	__u32 shapeclock;
 | |
| 	unsigned long recovery;	/* Time we can next clock a packet out on
 | |
| 				   an empty queue */
 | |
| 	spinlock_t lock;
 | |
|         struct net_device_stats stats;
 | |
| 	struct net_device *dev;
 | |
| 	int  (*hard_start_xmit) (struct sk_buff *skb,
 | |
| 		struct net_device *dev);
 | |
| 	int  (*hard_header) (struct sk_buff *skb,
 | |
| 		struct net_device *dev,
 | |
| 		unsigned short type,
 | |
| 		void *daddr,
 | |
| 		void *saddr,
 | |
| 		unsigned len);
 | |
| 	int  (*rebuild_header)(struct sk_buff *skb);
 | |
| 	int (*hard_header_cache)(struct neighbour *neigh, struct hh_cache *hh);
 | |
| 	void (*header_cache_update)(struct hh_cache *hh, struct net_device *dev, unsigned char *  haddr);
 | |
| 	struct net_device_stats* (*get_stats)(struct net_device *dev);
 | |
| 	struct timer_list timer;
 | |
| };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #define SHAPER_SET_DEV		0x0001
 | |
| #define SHAPER_SET_SPEED	0x0002
 | |
| #define SHAPER_GET_DEV		0x0003
 | |
| #define SHAPER_GET_SPEED	0x0004
 | |
| 
 | |
| struct shaperconf
 | |
| {
 | |
| 	__u16	ss_cmd;
 | |
| 	union
 | |
| 	{
 | |
| 		char 	ssu_name[14];
 | |
| 		__u32	ssu_speed;
 | |
| 	} ss_u;
 | |
| #define ss_speed ss_u.ssu_speed
 | |
| #define ss_name ss_u.ssu_name
 | |
| };
 | |
| 
 | |
| #endif
 |