[linux-next] LinuxNextTracking branch, master, updated. next-20171201

batman at open-mesh.org batman at open-mesh.org
Sat Dec 2 00:18:18 CET 2017


The following commit has been merged in the master branch:
commit 96c22a49ac125bc4ceddc0817dfb9ff3de8aea7d
Merge: ef0010a30935de4e0211cbc7bdffc30446cdee9b f6454f80e8a965fca203dab28723f68ec78db608
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Nov 29 13:10:25 2017 -0800

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
    
    Pull networking fixes from David Miller:
    
     1) The forcedeth conversion from pci_*() DMA interfaces to dma_*() ones
        missed one spot. From Zhu Yanjun.
    
     2) Missing CRYPTO_SHA256 Kconfig dep in cfg80211, from Johannes Berg.
    
     3) Fix checksum offloading in thunderx driver, from Sunil Goutham.
    
     4) Add SPDX to vm_sockets_diag.h, from Stephen Hemminger.
    
     5) Fix use after free of packet headers in TIPC, from Jon Maloy.
    
     6) "sizeof(ptr)" vs "sizeof(*ptr)" bug in i40e, from Gustavo A R Silva.
    
     7) Tunneling fixes in mlxsw driver, from Petr Machata.
    
     8) Fix crash in fanout_demux_rollover() of AF_PACKET, from Mike
        Maloney.
    
     9) Fix race in AF_PACKET bind() vs. NETDEV_UP notifier, from Eric
        Dumazet.
    
    10) Fix regression in sch_sfq.c due to one of the timer_setup()
        conversions. From Paolo Abeni.
    
    11) SCTP does list_for_each_entry() using wrong struct member, fix from
        Xin Long.
    
    12) Don't use big endian netlink attribute read for
        IFLA_BOND_AD_ACTOR_SYSTEM, it is in cpu endianness. Also from Xin
        Long.
    
    13) Fix mis-initialization of q->link.clock in CBQ scheduler, preventing
        adding filters there. From Jiri Pirko.
    
    * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (67 commits)
      ethernet: dwmac-stm32: Fix copyright
      net: via: via-rhine: use %p to format void * address instead of %x
      net: ethernet: xilinx: Mark XILINX_LL_TEMAC broken on 64-bit
      myri10ge: Update MAINTAINERS
      net: sched: cbq: create block for q->link.block
      atm: suni: remove extraneous space to fix indentation
      atm: lanai: use %p to format kernel addresses instead of %x
      VSOCK: Don't set sk_state to TCP_CLOSE before testing it
      atm: fore200e: use %pK to format kernel addresses instead of %x
      ambassador: fix incorrect indentation of assignment statement
      vxlan: use __be32 type for the param vni in __vxlan_fdb_delete
      bonding: use nla_get_u64 to extract the value for IFLA_BOND_AD_ACTOR_SYSTEM
      sctp: use right member as the param of list_for_each_entry
      sch_sfq: fix null pointer dereference at timer expiration
      cls_bpf: don't decrement net's refcount when offload fails
      net/packet: fix a race in packet_bind() and packet_notifier()
      packet: fix crash in fanout_demux_rollover()
      sctp: remove extern from stream sched
      sctp: force the params with right types for sctp csum apis
      sctp: force SCTP_ERROR_INV_STRM with __u32 when calling sctp_chunk_fail
      ...

diff --combined drivers/atm/ambassador.c
index dd286ad404f8,bfc514015b0b..9287ec958b70
--- a/drivers/atm/ambassador.c
+++ b/drivers/atm/ambassador.c
@@@ -293,7 -293,7 +293,7 @@@ static inline void __init show_version 
    
  */
  
 -static void do_housekeeping (unsigned long arg);
 +static void do_housekeeping (struct timer_list *t);
  /********** globals **********/
  
  static unsigned short debug = 0;
@@@ -1493,8 -1493,8 +1493,8 @@@ static const struct atmdev_ops amb_ops 
  };
  
  /********** housekeeping **********/
 -static void do_housekeeping (unsigned long arg) {
 -  amb_dev * dev = (amb_dev *) arg;
 +static void do_housekeeping (struct timer_list *t) {
 +  amb_dev * dev = from_timer(dev, t, housekeeping);
    
    // could collect device-specific (not driver/atm-linux) stats here
        
@@@ -2258,7 -2258,7 +2258,7 @@@ static int amb_probe(struct pci_dev *pc
  
  	PRINTD (DBG_INFO, "registered Madge ATM adapter (no. %d) (%p) at %p",
  		dev->atm_dev->number, dev, dev->atm_dev);
- 		dev->atm_dev->dev_data = (void *) dev;
+ 	dev->atm_dev->dev_data = (void *) dev;
  
  	// register our address
  	amb_esi (dev, dev->atm_dev->esi);
@@@ -2267,7 -2267,8 +2267,7 @@@
  	dev->atm_dev->ci_range.vpi_bits = NUM_VPI_BITS;
  	dev->atm_dev->ci_range.vci_bits = NUM_VCI_BITS;
  
 -	setup_timer(&dev->housekeeping, do_housekeeping,
 -		    (unsigned long)dev);
 +	timer_setup(&dev->housekeeping, do_housekeeping, 0);
  	mod_timer(&dev->housekeeping, jiffies);
  
  	// enable host interrupts
diff --combined drivers/atm/lanai.c
index 6664aa50789e,7e4c2ea3e3f2..5f8e009b2da1
--- a/drivers/atm/lanai.c
+++ b/drivers/atm/lanai.c
@@@ -1586,8 -1586,8 +1586,8 @@@ static int service_buffer_allocate(stru
  	    lanai->pci);
  	if (unlikely(lanai->service.start == NULL))
  		return -ENOMEM;
- 	DPRINTK("allocated service buffer at 0x%08lX, size %zu(%d)\n",
- 	    (unsigned long) lanai->service.start,
+ 	DPRINTK("allocated service buffer at %p, size %zu(%d)\n",
+ 	    lanai->service.start,
  	    lanai_buf_size(&lanai->service),
  	    lanai_buf_size_cardorder(&lanai->service));
  	/* Clear ServWrite register to be safe */
@@@ -1761,9 -1761,9 +1761,9 @@@ static void iter_dequeue(struct lanai_d
  }
  #endif /* !DEBUG_RW */
  
 -static void lanai_timed_poll(unsigned long arg)
 +static void lanai_timed_poll(struct timer_list *t)
  {
 -	struct lanai_dev *lanai = (struct lanai_dev *) arg;
 +	struct lanai_dev *lanai = from_timer(lanai, t, timer);
  #ifndef DEBUG_RW
  	unsigned long flags;
  #ifdef USE_POWERDOWN
@@@ -1790,8 -1790,10 +1790,8 @@@
  
  static inline void lanai_timed_poll_start(struct lanai_dev *lanai)
  {
 -	init_timer(&lanai->timer);
 +	timer_setup(&lanai->timer, lanai_timed_poll, 0);
  	lanai->timer.expires = jiffies + LANAI_POLL_PERIOD;
 -	lanai->timer.data = (unsigned long) lanai;
 -	lanai->timer.function = lanai_timed_poll;
  	add_timer(&lanai->timer);
  }
  
@@@ -2218,9 -2220,9 +2218,9 @@@ static int lanai_dev_open(struct atm_de
  #endif
  	memcpy(atmdev->esi, eeprom_mac(lanai), ESI_LEN);
  	lanai_timed_poll_start(lanai);
- 	printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d, base=0x%lx, irq=%u "
+ 	printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d, base=%p, irq=%u "
  		"(%pMF)\n", lanai->number, (int) lanai->pci->revision,
- 		(unsigned long) lanai->base, lanai->pci->irq, atmdev->esi);
+ 		lanai->base, lanai->pci->irq, atmdev->esi);
  	printk(KERN_NOTICE DEV_LABEL "(itf %d): LANAI%s, serialno=%u(0x%X), "
  	    "board_rev=%d\n", lanai->number,
  	    lanai->type==lanai2 ? "2" : "HB", (unsigned int) lanai->serialno,
diff --combined drivers/net/xen-netfront.c
index 18c85e55e76a,391432e2725d..c5a34671abda
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@@ -87,6 -87,8 +87,8 @@@ struct netfront_cb 
  /* IRQ name is queue name with "-tx" or "-rx" appended */
  #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3)
  
+ static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
+ 
  struct netfront_stats {
  	u64			packets;
  	u64			bytes;
@@@ -228,9 -230,9 +230,9 @@@ static bool xennet_can_sg(struct net_de
  }
  
  
 -static void rx_refill_timeout(unsigned long data)
 +static void rx_refill_timeout(struct timer_list *t)
  {
 -	struct netfront_queue *queue = (struct netfront_queue *)data;
 +	struct netfront_queue *queue = from_timer(queue, t, rx_refill_timer);
  	napi_schedule(&queue->napi);
  }
  
@@@ -1605,7 -1607,8 +1607,7 @@@ static int xennet_init_queue(struct net
  	spin_lock_init(&queue->tx_lock);
  	spin_lock_init(&queue->rx_lock);
  
 -	setup_timer(&queue->rx_refill_timer, rx_refill_timeout,
 -		    (unsigned long)queue);
 +	timer_setup(&queue->rx_refill_timer, rx_refill_timeout, 0);
  
  	snprintf(queue->name, sizeof(queue->name), "%s-q%u",
  		 queue->info->netdev->name, queue->id);
@@@ -2020,10 -2023,12 +2022,12 @@@ static void netback_changed(struct xenb
  		break;
  
  	case XenbusStateClosed:
+ 		wake_up_all(&module_unload_q);
  		if (dev->state == XenbusStateClosed)
  			break;
  		/* Missed the backend's CLOSING state -- fallthrough */
  	case XenbusStateClosing:
+ 		wake_up_all(&module_unload_q);
  		xenbus_frontend_closed(dev);
  		break;
  	}
@@@ -2129,6 -2134,20 +2133,20 @@@ static int xennet_remove(struct xenbus_
  
  	dev_dbg(&dev->dev, "%s\n", dev->nodename);
  
+ 	if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) {
+ 		xenbus_switch_state(dev, XenbusStateClosing);
+ 		wait_event(module_unload_q,
+ 			   xenbus_read_driver_state(dev->otherend) ==
+ 			   XenbusStateClosing);
+ 
+ 		xenbus_switch_state(dev, XenbusStateClosed);
+ 		wait_event(module_unload_q,
+ 			   xenbus_read_driver_state(dev->otherend) ==
+ 			   XenbusStateClosed ||
+ 			   xenbus_read_driver_state(dev->otherend) ==
+ 			   XenbusStateUnknown);
+ 	}
+ 
  	xennet_disconnect_backend(info);
  
  	unregister_netdev(info->netdev);
diff --combined net/rxrpc/call_object.c
index 994dc2df57e4,7ee3d6ce5aa2..0b2db38dd32d
--- a/net/rxrpc/call_object.c
+++ b/net/rxrpc/call_object.c
@@@ -45,16 -45,20 +45,20 @@@ const char *const rxrpc_call_completion
  
  struct kmem_cache *rxrpc_call_jar;
  
 -static void rxrpc_call_timer_expired(unsigned long _call)
 +static void rxrpc_call_timer_expired(struct timer_list *t)
  {
 -	struct rxrpc_call *call = (struct rxrpc_call *)_call;
 +	struct rxrpc_call *call = from_timer(call, t, timer);
  
  	_enter("%d", call->debug_id);
  
- 	if (call->state < RXRPC_CALL_COMPLETE)
- 		rxrpc_set_timer(call, rxrpc_timer_expired, ktime_get_real());
+ 	if (call->state < RXRPC_CALL_COMPLETE) {
+ 		trace_rxrpc_timer(call, rxrpc_timer_expired, jiffies);
+ 		rxrpc_queue_call(call);
+ 	}
  }
  
+ static struct lock_class_key rxrpc_call_user_mutex_lock_class_key;
+ 
  /*
   * find an extant server call
   * - called in process context with IRQs enabled
@@@ -95,7 -99,7 +99,7 @@@ found_extant_call
  /*
   * allocate a new call
   */
- struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
+ struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp)
  {
  	struct rxrpc_call *call;
  
@@@ -114,7 -118,16 +118,15 @@@
  		goto nomem_2;
  
  	mutex_init(&call->user_mutex);
+ 
+ 	/* Prevent lockdep reporting a deadlock false positive between the afs
+ 	 * filesystem and sys_sendmsg() via the mmap sem.
+ 	 */
+ 	if (rx->sk.sk_kern_sock)
+ 		lockdep_set_class(&call->user_mutex,
+ 				  &rxrpc_call_user_mutex_lock_class_key);
+ 
 -	setup_timer(&call->timer, rxrpc_call_timer_expired,
 -		    (unsigned long)call);
 +	timer_setup(&call->timer, rxrpc_call_timer_expired, 0);
  	INIT_WORK(&call->processor, &rxrpc_process_call);
  	INIT_LIST_HEAD(&call->link);
  	INIT_LIST_HEAD(&call->chan_wait_link);
@@@ -128,6 -141,8 +140,8 @@@
  	atomic_set(&call->usage, 1);
  	call->debug_id = atomic_inc_return(&rxrpc_debug_id);
  	call->tx_total_len = -1;
+ 	call->next_rx_timo = 20 * HZ;
+ 	call->next_req_timo = 1 * HZ;
  
  	memset(&call->sock_node, 0xed, sizeof(call->sock_node));
  
@@@ -150,7 -165,8 +164,8 @@@ nomem
  /*
   * Allocate a new client call.
   */
- static struct rxrpc_call *rxrpc_alloc_client_call(struct sockaddr_rxrpc *srx,
+ static struct rxrpc_call *rxrpc_alloc_client_call(struct rxrpc_sock *rx,
+ 						  struct sockaddr_rxrpc *srx,
  						  gfp_t gfp)
  {
  	struct rxrpc_call *call;
@@@ -158,7 -174,7 +173,7 @@@
  
  	_enter("");
  
- 	call = rxrpc_alloc_call(gfp);
+ 	call = rxrpc_alloc_call(rx, gfp);
  	if (!call)
  		return ERR_PTR(-ENOMEM);
  	call->state = RXRPC_CALL_CLIENT_AWAIT_CONN;
@@@ -177,15 -193,17 +192,17 @@@
   */
  static void rxrpc_start_call_timer(struct rxrpc_call *call)
  {
- 	ktime_t now = ktime_get_real(), expire_at;
- 
- 	expire_at = ktime_add_ms(now, rxrpc_max_call_lifetime);
- 	call->expire_at = expire_at;
- 	call->ack_at = expire_at;
- 	call->ping_at = expire_at;
- 	call->resend_at = expire_at;
- 	call->timer.expires = jiffies + LONG_MAX / 2;
- 	rxrpc_set_timer(call, rxrpc_timer_begin, now);
+ 	unsigned long now = jiffies;
+ 	unsigned long j = now + MAX_JIFFY_OFFSET;
+ 
+ 	call->ack_at = j;
+ 	call->ack_lost_at = j;
+ 	call->resend_at = j;
+ 	call->ping_at = j;
+ 	call->expect_rx_by = j;
+ 	call->expect_req_by = j;
+ 	call->expect_term_by = j;
+ 	call->timer.expires = now;
  }
  
  /*
@@@ -196,8 -214,7 +213,7 @@@
  struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
  					 struct rxrpc_conn_parameters *cp,
  					 struct sockaddr_rxrpc *srx,
- 					 unsigned long user_call_ID,
- 					 s64 tx_total_len,
+ 					 struct rxrpc_call_params *p,
  					 gfp_t gfp)
  	__releases(&rx->sk.sk_lock.slock)
  {
@@@ -207,18 -224,18 +223,18 @@@
  	const void *here = __builtin_return_address(0);
  	int ret;
  
- 	_enter("%p,%lx", rx, user_call_ID);
+ 	_enter("%p,%lx", rx, p->user_call_ID);
  
- 	call = rxrpc_alloc_client_call(srx, gfp);
+ 	call = rxrpc_alloc_client_call(rx, srx, gfp);
  	if (IS_ERR(call)) {
  		release_sock(&rx->sk);
  		_leave(" = %ld", PTR_ERR(call));
  		return call;
  	}
  
- 	call->tx_total_len = tx_total_len;
+ 	call->tx_total_len = p->tx_total_len;
  	trace_rxrpc_call(call, rxrpc_call_new_client, atomic_read(&call->usage),
- 			 here, (const void *)user_call_ID);
+ 			 here, (const void *)p->user_call_ID);
  
  	/* We need to protect a partially set up call against the user as we
  	 * will be acting outside the socket lock.
@@@ -234,16 -251,16 +250,16 @@@
  		parent = *pp;
  		xcall = rb_entry(parent, struct rxrpc_call, sock_node);
  
- 		if (user_call_ID < xcall->user_call_ID)
+ 		if (p->user_call_ID < xcall->user_call_ID)
  			pp = &(*pp)->rb_left;
- 		else if (user_call_ID > xcall->user_call_ID)
+ 		else if (p->user_call_ID > xcall->user_call_ID)
  			pp = &(*pp)->rb_right;
  		else
  			goto error_dup_user_ID;
  	}
  
  	rcu_assign_pointer(call->socket, rx);
- 	call->user_call_ID = user_call_ID;
+ 	call->user_call_ID = p->user_call_ID;
  	__set_bit(RXRPC_CALL_HAS_USERID, &call->flags);
  	rxrpc_get_call(call, rxrpc_call_got_userid);
  	rb_link_node(&call->sock_node, parent, pp);

-- 
LinuxNextTracking


More information about the linux-merge mailing list