Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) Fix netpoll OOPS in r8169, from Ville Syrjälä. 2) Fix bpf instruction alignment on powerpc et al., from Eric Dumazet. 3) Don't ignore IFLA_MTU attribute when creating new ipvlan links. From Xin Long. 4) Fix use after free in AF_PACKET, from Eric Dumazet. 5) Mis-matched RTNL unlock in xen-netfront, from Ross Lagerwall. 6) Fix VSOCK loopback on big-endian, from Claudio Imbrenda. 7) Missing RX buffer offset correction when computing DMA addresses in mvneta driver, from Antoine Tenart. 8) Fix crashes in DCCP's ccid3_hc_rx_send_feedback, from Eric Dumazet. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (34 commits) sfc: make function efx_rps_hash_bucket static strparser: Corrected typo in documentation. qmi_wwan: add support for the Dell Wireless 5821e module cxgb4: when disabling dcb set txq dcb priority to 0 net_sched: remove a bogus warning in hfsc net: dccp: switch rx_tstamp_last_feedback to monotonic clock net: dccp: avoid crash in ccid3_hc_rx_send_feedback() net: Remove depends on HAS_DMA in case of platform dependency MAINTAINERS: Add file patterns for dsa device tree bindings net: mscc: make sparse happy net: mvneta: fix the Rx desc DMA address in the Rx path Documentation: e1000: Fix docs build error Documentation: e100: Fix docs build error Documentation: e1000: Use correct heading adornment Documentation: e100: Use correct heading adornment ipv6: mcast: fix unsolicited report interval after receiving querys vhost_net: validate sock before trying to put its fd VSOCK: fix loopback on big-endian systems net: ethernet: ti: davinci_cpdma: make function cpdma_desc_pool_create static xen-netfront: Update features after registering netdev ...
Šī revīzija ir iekļauta:
@@ -22,7 +22,7 @@ endif
|
||||
quiet_cmd_copy_umh = GEN $@
|
||||
cmd_copy_umh = echo ':' > $(obj)/.bpfilter_umh.o.cmd; \
|
||||
$(OBJCOPY) -I binary \
|
||||
`LC_ALL=C objdump -f net/bpfilter/bpfilter_umh \
|
||||
`LC_ALL=C $(OBJDUMP) -f net/bpfilter/bpfilter_umh \
|
||||
|awk -F' |,' '/file format/{print "-O",$$NF} \
|
||||
/^architecture:/{print "-B",$$2}'` \
|
||||
--rename-section .data=.init.rodata $< $@
|
||||
|
@@ -600,7 +600,7 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk,
|
||||
{
|
||||
struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk);
|
||||
struct dccp_sock *dp = dccp_sk(sk);
|
||||
ktime_t now = ktime_get_real();
|
||||
ktime_t now = ktime_get();
|
||||
s64 delta = 0;
|
||||
|
||||
switch (fbtype) {
|
||||
@@ -625,15 +625,14 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk,
|
||||
case CCID3_FBACK_PERIODIC:
|
||||
delta = ktime_us_delta(now, hc->rx_tstamp_last_feedback);
|
||||
if (delta <= 0)
|
||||
DCCP_BUG("delta (%ld) <= 0", (long)delta);
|
||||
else
|
||||
hc->rx_x_recv = scaled_div32(hc->rx_bytes_recv, delta);
|
||||
delta = 1;
|
||||
hc->rx_x_recv = scaled_div32(hc->rx_bytes_recv, delta);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
ccid3_pr_debug("Interval %ldusec, X_recv=%u, 1/p=%u\n", (long)delta,
|
||||
ccid3_pr_debug("Interval %lldusec, X_recv=%u, 1/p=%u\n", delta,
|
||||
hc->rx_x_recv, hc->rx_pinv);
|
||||
|
||||
hc->rx_tstamp_last_feedback = now;
|
||||
@@ -680,7 +679,8 @@ static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
|
||||
static u32 ccid3_first_li(struct sock *sk)
|
||||
{
|
||||
struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk);
|
||||
u32 x_recv, p, delta;
|
||||
u32 x_recv, p;
|
||||
s64 delta;
|
||||
u64 fval;
|
||||
|
||||
if (hc->rx_rtt == 0) {
|
||||
@@ -688,7 +688,9 @@ static u32 ccid3_first_li(struct sock *sk)
|
||||
hc->rx_rtt = DCCP_FALLBACK_RTT;
|
||||
}
|
||||
|
||||
delta = ktime_to_us(net_timedelta(hc->rx_tstamp_last_feedback));
|
||||
delta = ktime_us_delta(ktime_get(), hc->rx_tstamp_last_feedback);
|
||||
if (delta <= 0)
|
||||
delta = 1;
|
||||
x_recv = scaled_div32(hc->rx_bytes_recv, delta);
|
||||
if (x_recv == 0) { /* would also trigger divide-by-zero */
|
||||
DCCP_WARN("X_recv==0\n");
|
||||
|
@@ -2082,7 +2082,8 @@ void ipv6_mc_dad_complete(struct inet6_dev *idev)
|
||||
mld_send_initial_cr(idev);
|
||||
idev->mc_dad_count--;
|
||||
if (idev->mc_dad_count)
|
||||
mld_dad_start_timer(idev, idev->mc_maxdelay);
|
||||
mld_dad_start_timer(idev,
|
||||
unsolicited_report_interval(idev));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2094,7 +2095,8 @@ static void mld_dad_timer_expire(struct timer_list *t)
|
||||
if (idev->mc_dad_count) {
|
||||
idev->mc_dad_count--;
|
||||
if (idev->mc_dad_count)
|
||||
mld_dad_start_timer(idev, idev->mc_maxdelay);
|
||||
mld_dad_start_timer(idev,
|
||||
unsolicited_report_interval(idev));
|
||||
}
|
||||
in6_dev_put(idev);
|
||||
}
|
||||
@@ -2452,7 +2454,8 @@ static void mld_ifc_timer_expire(struct timer_list *t)
|
||||
if (idev->mc_ifc_count) {
|
||||
idev->mc_ifc_count--;
|
||||
if (idev->mc_ifc_count)
|
||||
mld_ifc_start_timer(idev, idev->mc_maxdelay);
|
||||
mld_ifc_start_timer(idev,
|
||||
unsolicited_report_interval(idev));
|
||||
}
|
||||
in6_dev_put(idev);
|
||||
}
|
||||
|
@@ -2262,6 +2262,13 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
if (po->stats.stats1.tp_drops)
|
||||
status |= TP_STATUS_LOSING;
|
||||
}
|
||||
|
||||
if (do_vnet &&
|
||||
virtio_net_hdr_from_skb(skb, h.raw + macoff -
|
||||
sizeof(struct virtio_net_hdr),
|
||||
vio_le(), true, 0))
|
||||
goto drop_n_account;
|
||||
|
||||
po->stats.stats1.tp_packets++;
|
||||
if (copy_skb) {
|
||||
status |= TP_STATUS_COPY;
|
||||
@@ -2269,15 +2276,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
}
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
|
||||
if (do_vnet) {
|
||||
if (virtio_net_hdr_from_skb(skb, h.raw + macoff -
|
||||
sizeof(struct virtio_net_hdr),
|
||||
vio_le(), true, 0)) {
|
||||
spin_lock(&sk->sk_receive_queue.lock);
|
||||
goto drop_n_account;
|
||||
}
|
||||
}
|
||||
|
||||
skb_copy_bits(skb, 0, h.raw + macoff, snaplen);
|
||||
|
||||
if (!(ts_status = tpacket_get_timestamp(skb, &ts, po->tp_tstamp)))
|
||||
|
@@ -66,7 +66,7 @@ struct fl_flow_mask {
|
||||
struct rhashtable_params filter_ht_params;
|
||||
struct flow_dissector dissector;
|
||||
struct list_head filters;
|
||||
struct rcu_head rcu;
|
||||
struct rcu_work rwork;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
@@ -203,6 +203,20 @@ static int fl_init(struct tcf_proto *tp)
|
||||
return rhashtable_init(&head->ht, &mask_ht_params);
|
||||
}
|
||||
|
||||
static void fl_mask_free(struct fl_flow_mask *mask)
|
||||
{
|
||||
rhashtable_destroy(&mask->ht);
|
||||
kfree(mask);
|
||||
}
|
||||
|
||||
static void fl_mask_free_work(struct work_struct *work)
|
||||
{
|
||||
struct fl_flow_mask *mask = container_of(to_rcu_work(work),
|
||||
struct fl_flow_mask, rwork);
|
||||
|
||||
fl_mask_free(mask);
|
||||
}
|
||||
|
||||
static bool fl_mask_put(struct cls_fl_head *head, struct fl_flow_mask *mask,
|
||||
bool async)
|
||||
{
|
||||
@@ -210,12 +224,11 @@ static bool fl_mask_put(struct cls_fl_head *head, struct fl_flow_mask *mask,
|
||||
return false;
|
||||
|
||||
rhashtable_remove_fast(&head->ht, &mask->ht_node, mask_ht_params);
|
||||
rhashtable_destroy(&mask->ht);
|
||||
list_del_rcu(&mask->list);
|
||||
if (async)
|
||||
kfree_rcu(mask, rcu);
|
||||
tcf_queue_work(&mask->rwork, fl_mask_free_work);
|
||||
else
|
||||
kfree(mask);
|
||||
fl_mask_free(mask);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@@ -1385,8 +1385,8 @@ hfsc_schedule_watchdog(struct Qdisc *sch)
|
||||
if (next_time == 0 || next_time > q->root.cl_cfmin)
|
||||
next_time = q->root.cl_cfmin;
|
||||
}
|
||||
WARN_ON(next_time == 0);
|
||||
qdisc_watchdog_schedule(&q->watchdog, next_time);
|
||||
if (next_time)
|
||||
qdisc_watchdog_schedule(&q->watchdog, next_time);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@@ -237,7 +237,9 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
|
||||
/* Account for a different sized first fragment */
|
||||
if (msg_len >= first_len) {
|
||||
msg->can_delay = 0;
|
||||
SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_FRAGUSRMSGS);
|
||||
if (msg_len > first_len)
|
||||
SCTP_INC_STATS(sock_net(asoc->base.sk),
|
||||
SCTP_MIB_FRAGUSRMSGS);
|
||||
} else {
|
||||
/* Which may be the only one... */
|
||||
first_len = msg_len;
|
||||
|
@@ -392,7 +392,7 @@ static int strp_read_sock(struct strparser *strp)
|
||||
/* Lower sock lock held */
|
||||
void strp_data_ready(struct strparser *strp)
|
||||
{
|
||||
if (unlikely(strp->stopped))
|
||||
if (unlikely(strp->stopped) || strp->paused)
|
||||
return;
|
||||
|
||||
/* This check is needed to synchronize with do_strp_work.
|
||||
@@ -407,9 +407,6 @@ void strp_data_ready(struct strparser *strp)
|
||||
return;
|
||||
}
|
||||
|
||||
if (strp->paused)
|
||||
return;
|
||||
|
||||
if (strp->need_bytes) {
|
||||
if (strp_peek_len(strp) < strp->need_bytes)
|
||||
return;
|
||||
|
@@ -201,7 +201,7 @@ virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (le32_to_cpu(pkt->hdr.dst_cid) == vsock->guest_cid)
|
||||
if (le64_to_cpu(pkt->hdr.dst_cid) == vsock->guest_cid)
|
||||
return virtio_transport_send_pkt_loopback(vsock, pkt);
|
||||
|
||||
if (pkt->reply)
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user