Commit a9925628 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull networking fixes from Jakub Kicinski:
 "Networking fixes for 5.11-rc7, including fixes from bpf and mac80211
  trees.

  Current release - regressions:

   - ip_tunnel: fix mtu calculation

   - mlx5: fix function calculation for page trees

  Previous releases - regressions:

   - vsock: fix the race conditions in multi-transport support

   - neighbour: prevent a dead entry from updating gc_list

   - dsa: mv88e6xxx: override existent unicast portvec in port_fdb_add

  Previous releases - always broken:

   - bpf, cgroup: two copy_{from,to}_user() warn_on_once splats for BPF
     cgroup getsockopt infra when user space is trying to race against
     optlen, from Loris Reiff.

   - bpf: add missing fput() in BPF inode storage map update helper

   - udp: ipv4: manipulate network header of NATed UDP GRO fraglist

   - mac80211: fix station rate table updates on assoc

   - r8169: work around RTL8125 UDP HW bug

   - igc: report speed and duplex as unknown when device is runtime
     suspended

   - rxrpc: fix deadlock around release of dst cached on udp tunnel"

* tag 'net-5.11-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (36 commits)
  net: hsr: align sup_multicast_addr in struct hsr_priv to u16 boundary
  net: ipa: fix two format specifier errors
  net: ipa: use the right accessor in ipa_endpoint_status_skip()
  net: ipa: be explicit about endianness
  net: ipa: add a missing __iomem attribute
  net: ipa: pass correct dma_handle to dma_free_coherent()
  r8169: fix WoL on shutdown if CONFIG_DEBUG_SHIRQ is set
  net/rds: restrict iovecs length for RDS_CMSG_RDMA_ARGS
  net: mvpp2: TCAM entry enable should be written after SRAM data
  net: lapb: Copy the skb before sending a packet
  net/mlx5e: Release skb in case of failure in tc update skb
  net/mlx5e: Update max_opened_tc also when channels are closed
  net/mlx5: Fix leak upon failure of rule creation
  net/mlx5: Fix function calculation for page trees
  docs: networking: swap words in icmp_errors_use_inbound_ifaddr doc
  udp: ipv4: manipulate network header of NATed UDP GRO fraglist
  net: ip_tunnel: fix mtu calculation
  vsock: fix the race conditions in multi-transport support
  net: sched: replaced invalid qdisc tree flush helper in qdisc_replace
  ibmvnic: device remove has higher precedence over reset
  ...
parents 88bb507a 6c9f18f2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1196,7 +1196,7 @@ icmp_errors_use_inbound_ifaddr - BOOLEAN

	If non-zero, the message will be sent with the primary address of
	the interface that received the packet that caused the icmp error.
	This is the behaviour network many administrators will expect from
	This is the behaviour many network administrators will expect from
	a router. And it can make debugging complicated network layouts
	much easier.

+2 −2
Original line number Diff line number Diff line
@@ -332,7 +332,7 @@ static int __init arc_rimi_init(void)
		dev->irq = 9;

	if (arcrimi_probe(dev)) {
		free_netdev(dev);
		free_arcdev(dev);
		return -EIO;
	}

@@ -349,7 +349,7 @@ static void __exit arc_rimi_exit(void)
	iounmap(lp->mem_start);
	release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
	free_irq(dev->irq, dev);
	free_netdev(dev);
	free_arcdev(dev);
}

#ifndef MODULE
+6 −0
Original line number Diff line number Diff line
@@ -298,6 +298,10 @@ struct arcnet_local {

	int excnak_pending;    /* We just got an excesive nak interrupt */

	/* RESET flag handling */
	int reset_in_progress;
	struct work_struct reset_work;

	struct {
		uint16_t sequence;	/* sequence number (incs with each packet) */
		__be16 aborted_seq;
@@ -350,7 +354,9 @@ void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc)

void arcnet_unregister_proto(struct ArcProto *proto);
irqreturn_t arcnet_interrupt(int irq, void *dev_id);

struct net_device *alloc_arcdev(const char *name);
void free_arcdev(struct net_device *dev);

int arcnet_open(struct net_device *dev);
int arcnet_close(struct net_device *dev);
+62 −4
Original line number Diff line number Diff line
@@ -387,10 +387,44 @@ static void arcnet_timer(struct timer_list *t)
	struct arcnet_local *lp = from_timer(lp, t, timer);
	struct net_device *dev = lp->dev;

	if (!netif_carrier_ok(dev)) {
	spin_lock_irq(&lp->lock);

	if (!lp->reset_in_progress && !netif_carrier_ok(dev)) {
		netif_carrier_on(dev);
		netdev_info(dev, "link up\n");
	}

	spin_unlock_irq(&lp->lock);
}

static void reset_device_work(struct work_struct *work)
{
	struct arcnet_local *lp;
	struct net_device *dev;

	lp = container_of(work, struct arcnet_local, reset_work);
	dev = lp->dev;

	/* Do not bring the network interface back up if an ifdown
	 * was already done.
	 */
	if (!netif_running(dev) || !lp->reset_in_progress)
		return;

	rtnl_lock();

	/* Do another check, in case of an ifdown that was triggered in
	 * the small race window between the exit condition above and
	 * acquiring RTNL.
	 */
	if (!netif_running(dev) || !lp->reset_in_progress)
		goto out;

	dev_close(dev);
	dev_open(dev, NULL);

out:
	rtnl_unlock();
}

static void arcnet_reply_tasklet(unsigned long data)
@@ -452,12 +486,25 @@ struct net_device *alloc_arcdev(const char *name)
		lp->dev = dev;
		spin_lock_init(&lp->lock);
		timer_setup(&lp->timer, arcnet_timer, 0);
		INIT_WORK(&lp->reset_work, reset_device_work);
	}

	return dev;
}
EXPORT_SYMBOL(alloc_arcdev);

void free_arcdev(struct net_device *dev)
{
	struct arcnet_local *lp = netdev_priv(dev);

	/* Do not cancel this at ->ndo_close(), as the workqueue itself
	 * indirectly calls the ifdown path through dev_close().
	 */
	cancel_work_sync(&lp->reset_work);
	free_netdev(dev);
}
EXPORT_SYMBOL(free_arcdev);

/* Open/initialize the board.  This is called sometime after booting when
 * the 'ifconfig' program is run.
 *
@@ -587,6 +634,10 @@ int arcnet_close(struct net_device *dev)

	/* shut down the card */
	lp->hw.close(dev);

	/* reset counters */
	lp->reset_in_progress = 0;

	module_put(lp->hw.owner);
	return 0;
}
@@ -820,6 +871,9 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id)

	spin_lock_irqsave(&lp->lock, flags);

	if (lp->reset_in_progress)
		goto out;

	/* RESET flag was enabled - if device is not running, we must
	 * clear it right away (but nothing else).
	 */
@@ -852,11 +906,14 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id)
		if (status & RESETflag) {
			arc_printk(D_NORMAL, dev, "spurious reset (status=%Xh)\n",
				   status);
			arcnet_close(dev);
			arcnet_open(dev);

			lp->reset_in_progress = 1;
			netif_stop_queue(dev);
			netif_carrier_off(dev);
			schedule_work(&lp->reset_work);

			/* get out of the interrupt handler! */
			break;
			goto out;
		}
		/* RX is inhibited - we must have received something.
		 * Prepare to receive into the next buffer.
@@ -1052,6 +1109,7 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id)
	udelay(1);
	lp->hw.intmask(dev, lp->intmask);

out:
	spin_unlock_irqrestore(&lp->lock, flags);
	return retval;
}
+2 −2
Original line number Diff line number Diff line
@@ -169,7 +169,7 @@ static int __init com20020_init(void)
		dev->irq = 9;

	if (com20020isa_probe(dev)) {
		free_netdev(dev);
		free_arcdev(dev);
		return -EIO;
	}

@@ -182,7 +182,7 @@ static void __exit com20020_exit(void)
	unregister_netdev(my_dev);
	free_irq(my_dev->irq, my_dev);
	release_region(my_dev->base_addr, ARCNET_TOTAL_SIZE);
	free_netdev(my_dev);
	free_arcdev(my_dev);
}

#ifndef MODULE
Loading