mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Merge tag 'v4.4.119' into linux-linaro-lsk-v4.4
This is the 4.4.119 stable release
This commit is contained in:
commit
825f312805
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 118
|
||||
SUBLEVEL = 119
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ static const char *handler[]= {
|
|||
"Error"
|
||||
};
|
||||
|
||||
int show_unhandled_signals = 1;
|
||||
int show_unhandled_signals = 0;
|
||||
|
||||
/*
|
||||
* Dump out the contents of some memory nicely...
|
||||
|
|
|
|||
|
|
@ -835,6 +835,7 @@ static int __init disable_hardlockup_detector(void)
|
|||
return 0;
|
||||
}
|
||||
early_initcall(disable_hardlockup_detector);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
static enum l1d_flush_type enabled_flush_types;
|
||||
|
|
@ -973,4 +974,3 @@ ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, cha
|
|||
return sprintf(buf, "Vulnerable\n");
|
||||
}
|
||||
#endif /* CONFIG_PPC_BOOK3S_64 */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -471,7 +471,7 @@ static int nmi_setup(void)
|
|||
goto fail;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
if (!cpu)
|
||||
if (!IS_ENABLED(CONFIG_SMP) || !cpu)
|
||||
continue;
|
||||
|
||||
memcpy(per_cpu(cpu_msrs, cpu).counters,
|
||||
|
|
|
|||
|
|
@ -2622,8 +2622,10 @@ static unsigned int binder_poll(struct file *filp,
|
|||
binder_lock(__func__);
|
||||
|
||||
thread = binder_get_thread(proc);
|
||||
if (!thread)
|
||||
if (!thread) {
|
||||
binder_unlock(__func__);
|
||||
return POLLERR;
|
||||
}
|
||||
|
||||
wait_for_proc_work = thread->transaction_stack == NULL &&
|
||||
list_empty(&thread->todo) && thread->return_error == BR_OK;
|
||||
|
|
|
|||
|
|
@ -1467,8 +1467,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
|||
* ignore it */
|
||||
vga_client_register(adev->pdev, adev, NULL, amdgpu_vga_set_decode);
|
||||
|
||||
if (amdgpu_runtime_pm == 1)
|
||||
runtime = true;
|
||||
if (amdgpu_device_is_px(ddev))
|
||||
runtime = true;
|
||||
vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime);
|
||||
|
|
|
|||
|
|
@ -106,6 +106,9 @@ static struct edid_quirk {
|
|||
/* AEO model 0 reports 8 bpc, but is a 6 bpc panel */
|
||||
{ "AEO", 0, EDID_QUIRK_FORCE_6BPC },
|
||||
|
||||
/* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */
|
||||
{ "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC },
|
||||
|
||||
/* Belinea 10 15 55 */
|
||||
{ "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 },
|
||||
{ "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 },
|
||||
|
|
|
|||
|
|
@ -2386,6 +2386,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
|
||||
|
|
|
|||
|
|
@ -570,6 +570,9 @@
|
|||
#define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038
|
||||
#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040
|
||||
#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042
|
||||
#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043
|
||||
#define USB_DEVICE_ID_LD_JWM 0x1080
|
||||
#define USB_DEVICE_ID_LD_DMMP 0x1081
|
||||
#define USB_DEVICE_ID_LD_UMIP 0x1090
|
||||
|
|
|
|||
|
|
@ -47,6 +47,10 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
|
|||
if (adis->trig == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
adis->trig->dev.parent = &adis->spi->dev;
|
||||
adis->trig->ops = &adis_trigger_ops;
|
||||
iio_trigger_set_drvdata(adis->trig, adis);
|
||||
|
||||
ret = request_irq(adis->spi->irq,
|
||||
&iio_trigger_generic_data_rdy_poll,
|
||||
IRQF_TRIGGER_RISING,
|
||||
|
|
@ -55,9 +59,6 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
|
|||
if (ret)
|
||||
goto error_free_trig;
|
||||
|
||||
adis->trig->dev.parent = &adis->spi->dev;
|
||||
adis->trig->ops = &adis_trigger_ops;
|
||||
iio_trigger_set_drvdata(adis->trig, adis);
|
||||
ret = iio_trigger_register(adis->trig);
|
||||
|
||||
indio_dev->trig = iio_trigger_get(adis->trig);
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ unsigned int iio_buffer_poll(struct file *filp,
|
|||
struct iio_dev *indio_dev = filp->private_data;
|
||||
struct iio_buffer *rb = indio_dev->buffer;
|
||||
|
||||
if (!indio_dev->info)
|
||||
if (!indio_dev->info || rb == NULL)
|
||||
return 0;
|
||||
|
||||
poll_wait(filp, &rb->pollq, wait);
|
||||
|
|
|
|||
|
|
@ -604,7 +604,7 @@ static void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
|
|||
* Ensure that stores to Normal memory are visible to the
|
||||
* other CPUs before issuing the IPI.
|
||||
*/
|
||||
smp_wmb();
|
||||
wmb();
|
||||
|
||||
for_each_cpu(cpu, mask) {
|
||||
unsigned long cluster_id = cpu_logical_map(cpu) & ~0xffUL;
|
||||
|
|
|
|||
|
|
@ -179,14 +179,16 @@ static int ks_pcie_get_irq_controller_info(struct keystone_pcie *ks_pcie,
|
|||
}
|
||||
|
||||
/* interrupt controller is in a child node */
|
||||
*np_temp = of_find_node_by_name(np_pcie, controller);
|
||||
*np_temp = of_get_child_by_name(np_pcie, controller);
|
||||
if (!(*np_temp)) {
|
||||
dev_err(dev, "Node for %s is absent\n", controller);
|
||||
goto out;
|
||||
}
|
||||
temp = of_irq_count(*np_temp);
|
||||
if (!temp)
|
||||
if (!temp) {
|
||||
of_node_put(*np_temp);
|
||||
goto out;
|
||||
}
|
||||
if (temp > max_host_irqs)
|
||||
dev_warn(dev, "Too many %s interrupts defined %u\n",
|
||||
(legacy ? "legacy" : "MSI"), temp);
|
||||
|
|
@ -200,6 +202,9 @@ static int ks_pcie_get_irq_controller_info(struct keystone_pcie *ks_pcie,
|
|||
if (!host_irqs[temp])
|
||||
break;
|
||||
}
|
||||
|
||||
of_node_put(*np_temp);
|
||||
|
||||
if (temp) {
|
||||
*num_irqs = temp;
|
||||
ret = 0;
|
||||
|
|
|
|||
|
|
@ -366,7 +366,7 @@ enum ibmvfc_fcp_rsp_info_codes {
|
|||
};
|
||||
|
||||
struct ibmvfc_fcp_rsp_info {
|
||||
__be16 reserved;
|
||||
u8 reserved[3];
|
||||
u8 rsp_code;
|
||||
u8 reserved2[4];
|
||||
}__attribute__((packed, aligned (2)));
|
||||
|
|
|
|||
|
|
@ -225,6 +225,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
{ USB_DEVICE(0x1a0a, 0x0200), .driver_info =
|
||||
USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
|
||||
|
||||
/* Corsair K70 RGB */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* Corsair Strafe RGB */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
|
|
|
|||
|
|
@ -2393,6 +2393,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
|
|||
break;
|
||||
}
|
||||
|
||||
dwc->eps[1]->endpoint.maxpacket = dwc->gadget.ep0->maxpacket;
|
||||
|
||||
/* Enable USB2 LPM Capability */
|
||||
|
||||
if ((dwc->revision > DWC3_REVISION_194A)
|
||||
|
|
|
|||
|
|
@ -2756,10 +2756,8 @@ static int _ffs_func_bind(struct usb_configuration *c,
|
|||
struct ffs_data *ffs = func->ffs;
|
||||
|
||||
const int full = !!func->ffs->fs_descs_count;
|
||||
const int high = gadget_is_dualspeed(func->gadget) &&
|
||||
func->ffs->hs_descs_count;
|
||||
const int super = gadget_is_superspeed(func->gadget) &&
|
||||
func->ffs->ss_descs_count;
|
||||
const int high = !!func->ffs->hs_descs_count;
|
||||
const int super = !!func->ffs->ss_descs_count;
|
||||
|
||||
int fs_len, hs_len, ss_len, ret, i;
|
||||
struct ffs_ep *eps_ptr;
|
||||
|
|
|
|||
|
|
@ -1018,6 +1018,8 @@ static void finish_unlinks(struct ohci_hcd *ohci)
|
|||
* have modified this list. normally it's just prepending
|
||||
* entries (which we'd ignore), but paranoia won't hurt.
|
||||
*/
|
||||
*last = ed->ed_next;
|
||||
ed->ed_next = NULL;
|
||||
modified = 0;
|
||||
|
||||
/* unlink urbs as requested, but rescan the list after
|
||||
|
|
@ -1076,21 +1078,22 @@ static void finish_unlinks(struct ohci_hcd *ohci)
|
|||
goto rescan_this;
|
||||
|
||||
/*
|
||||
* If no TDs are queued, take ED off the ed_rm_list.
|
||||
* If no TDs are queued, ED is now idle.
|
||||
* Otherwise, if the HC is running, reschedule.
|
||||
* If not, leave it on the list for further dequeues.
|
||||
* If the HC isn't running, add ED back to the
|
||||
* start of the list for later processing.
|
||||
*/
|
||||
if (list_empty(&ed->td_list)) {
|
||||
*last = ed->ed_next;
|
||||
ed->ed_next = NULL;
|
||||
ed->state = ED_IDLE;
|
||||
list_del(&ed->in_use_list);
|
||||
} else if (ohci->rh_state == OHCI_RH_RUNNING) {
|
||||
*last = ed->ed_next;
|
||||
ed->ed_next = NULL;
|
||||
ed_schedule(ohci, ed);
|
||||
} else {
|
||||
last = &ed->ed_next;
|
||||
ed->ed_next = ohci->ed_rm_list;
|
||||
ohci->ed_rm_list = ed;
|
||||
/* Don't loop on the same ED */
|
||||
if (last == &ohci->ed_rm_list)
|
||||
last = &ed->ed_next;
|
||||
}
|
||||
|
||||
if (modified)
|
||||
|
|
|
|||
|
|
@ -46,6 +46,9 @@
|
|||
#define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 /* USB Product ID of Micro-CASSY Time (reserved) */
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 /* USB Product ID of Micro-CASSY Temperature */
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 /* USB Product ID of Micro-CASSY pH */
|
||||
#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040 /* USB Product ID of Power Analyser CASSY */
|
||||
#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042 /* USB Product ID of Converter Controller CASSY */
|
||||
#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043 /* USB Product ID of Machine Test CASSY */
|
||||
#define USB_DEVICE_ID_LD_JWM 0x1080 /* USB Product ID of Joule and Wattmeter */
|
||||
#define USB_DEVICE_ID_LD_DMMP 0x1081 /* USB Product ID of Digital Multimeter P (reserved) */
|
||||
#define USB_DEVICE_ID_LD_UMIP 0x1090 /* USB Product ID of UMI P */
|
||||
|
|
@ -88,6 +91,9 @@ static const struct usb_device_id ld_usb_table[] = {
|
|||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
|
||||
|
|
|
|||
|
|
@ -999,6 +999,10 @@ static int usbhsf_dma_prepare_pop_with_usb_dmac(struct usbhs_pkt *pkt,
|
|||
if ((uintptr_t)pkt->buf & (USBHS_USB_DMAC_XFER_SIZE - 1))
|
||||
goto usbhsf_pio_prepare_pop;
|
||||
|
||||
/* return at this time if the pipe is running */
|
||||
if (usbhs_pipe_is_running(pipe))
|
||||
return 0;
|
||||
|
||||
usbhs_pipe_config_change_bfre(pipe, 1);
|
||||
|
||||
ret = usbhsf_fifo_select(pipe, fifo, 0);
|
||||
|
|
@ -1189,6 +1193,7 @@ static int usbhsf_dma_pop_done_with_usb_dmac(struct usbhs_pkt *pkt,
|
|||
usbhsf_fifo_clear(pipe, fifo);
|
||||
pkt->actual = usbhs_dma_calc_received_size(pkt, chan, rcv_len);
|
||||
|
||||
usbhs_pipe_running(pipe, 0);
|
||||
usbhsf_dma_stop(pipe, fifo);
|
||||
usbhsf_dma_unmap(pkt);
|
||||
usbhsf_fifo_unselect(pipe, pipe->fifo);
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include <net/netns/generic.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <net/lwtunnel.h>
|
||||
#include <net/dst_cache.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
#include <net/ipv6.h>
|
||||
|
|
@ -85,11 +86,6 @@ struct ip_tunnel_prl_entry {
|
|||
struct rcu_head rcu_head;
|
||||
};
|
||||
|
||||
struct ip_tunnel_dst {
|
||||
struct dst_entry __rcu *dst;
|
||||
__be32 saddr;
|
||||
};
|
||||
|
||||
struct metadata_dst;
|
||||
|
||||
struct ip_tunnel {
|
||||
|
|
@ -108,7 +104,7 @@ struct ip_tunnel {
|
|||
int tun_hlen; /* Precalculated header length */
|
||||
int mlink;
|
||||
|
||||
struct ip_tunnel_dst __percpu *dst_cache;
|
||||
struct dst_cache dst_cache;
|
||||
|
||||
struct ip_tunnel_parm parms;
|
||||
|
||||
|
|
@ -248,7 +244,6 @@ int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
|
|||
int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
|
||||
struct ip_tunnel_parm *p);
|
||||
void ip_tunnel_setup(struct net_device *dev, int net_id);
|
||||
void ip_tunnel_dst_reset_all(struct ip_tunnel *t);
|
||||
int ip_tunnel_encap_setup(struct ip_tunnel *t,
|
||||
struct ip_tunnel_encap *ipencap);
|
||||
|
||||
|
|
|
|||
|
|
@ -186,6 +186,7 @@ config NET_IPGRE_DEMUX
|
|||
|
||||
config NET_IP_TUNNEL
|
||||
tristate
|
||||
select DST_CACHE
|
||||
default n
|
||||
|
||||
config NET_IPGRE
|
||||
|
|
|
|||
|
|
@ -1527,10 +1527,7 @@ int ip_getsockopt(struct sock *sk, int level,
|
|||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
err = nf_getsockopt(sk, PF_INET, optname, optval,
|
||||
&len);
|
||||
release_sock(sk);
|
||||
err = nf_getsockopt(sk, PF_INET, optname, optval, &len);
|
||||
if (err >= 0)
|
||||
err = put_user(len, optlen);
|
||||
return err;
|
||||
|
|
@ -1562,9 +1559,7 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname,
|
|||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
err = compat_nf_getsockopt(sk, PF_INET, optname, optval, &len);
|
||||
release_sock(sk);
|
||||
if (err >= 0)
|
||||
err = put_user(len, optlen);
|
||||
return err;
|
||||
|
|
|
|||
|
|
@ -69,61 +69,6 @@ static unsigned int ip_tunnel_hash(__be32 key, __be32 remote)
|
|||
IP_TNL_HASH_BITS);
|
||||
}
|
||||
|
||||
static void __tunnel_dst_set(struct ip_tunnel_dst *idst,
|
||||
struct dst_entry *dst, __be32 saddr)
|
||||
{
|
||||
struct dst_entry *old_dst;
|
||||
|
||||
dst_clone(dst);
|
||||
old_dst = xchg((__force struct dst_entry **)&idst->dst, dst);
|
||||
dst_release(old_dst);
|
||||
idst->saddr = saddr;
|
||||
}
|
||||
|
||||
static noinline void tunnel_dst_set(struct ip_tunnel *t,
|
||||
struct dst_entry *dst, __be32 saddr)
|
||||
{
|
||||
__tunnel_dst_set(raw_cpu_ptr(t->dst_cache), dst, saddr);
|
||||
}
|
||||
|
||||
static void tunnel_dst_reset(struct ip_tunnel *t)
|
||||
{
|
||||
tunnel_dst_set(t, NULL, 0);
|
||||
}
|
||||
|
||||
void ip_tunnel_dst_reset_all(struct ip_tunnel *t)
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_possible_cpu(i)
|
||||
__tunnel_dst_set(per_cpu_ptr(t->dst_cache, i), NULL, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(ip_tunnel_dst_reset_all);
|
||||
|
||||
static struct rtable *tunnel_rtable_get(struct ip_tunnel *t,
|
||||
u32 cookie, __be32 *saddr)
|
||||
{
|
||||
struct ip_tunnel_dst *idst;
|
||||
struct dst_entry *dst;
|
||||
|
||||
rcu_read_lock();
|
||||
idst = raw_cpu_ptr(t->dst_cache);
|
||||
dst = rcu_dereference(idst->dst);
|
||||
if (dst && !atomic_inc_not_zero(&dst->__refcnt))
|
||||
dst = NULL;
|
||||
if (dst) {
|
||||
if (!dst->obsolete || dst->ops->check(dst, cookie)) {
|
||||
*saddr = idst->saddr;
|
||||
} else {
|
||||
tunnel_dst_reset(t);
|
||||
dst_release(dst);
|
||||
dst = NULL;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
return (struct rtable *)dst;
|
||||
}
|
||||
|
||||
static bool ip_tunnel_key_match(const struct ip_tunnel_parm *p,
|
||||
__be16 flags, __be32 key)
|
||||
{
|
||||
|
|
@ -382,11 +327,12 @@ static int ip_tunnel_bind_dev(struct net_device *dev)
|
|||
|
||||
if (!IS_ERR(rt)) {
|
||||
tdev = rt->dst.dev;
|
||||
tunnel_dst_set(tunnel, &rt->dst, fl4.saddr);
|
||||
ip_rt_put(rt);
|
||||
}
|
||||
if (dev->type != ARPHRD_ETHER)
|
||||
dev->flags |= IFF_POINTOPOINT;
|
||||
|
||||
dst_cache_reset(&tunnel->dst_cache);
|
||||
}
|
||||
|
||||
if (!tdev && tunnel->parms.link)
|
||||
|
|
@ -733,7 +679,8 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
|||
if (ip_tunnel_encap(skb, tunnel, &protocol, &fl4) < 0)
|
||||
goto tx_error;
|
||||
|
||||
rt = connected ? tunnel_rtable_get(tunnel, 0, &fl4.saddr) : NULL;
|
||||
rt = connected ? dst_cache_get_ip4(&tunnel->dst_cache, &fl4.saddr) :
|
||||
NULL;
|
||||
|
||||
if (!rt) {
|
||||
rt = ip_route_output_key(tunnel->net, &fl4);
|
||||
|
|
@ -743,7 +690,8 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
|||
goto tx_error;
|
||||
}
|
||||
if (connected)
|
||||
tunnel_dst_set(tunnel, &rt->dst, fl4.saddr);
|
||||
dst_cache_set_ip4(&tunnel->dst_cache, &rt->dst,
|
||||
fl4.saddr);
|
||||
}
|
||||
|
||||
if (rt->dst.dev == dev) {
|
||||
|
|
@ -841,7 +789,7 @@ static void ip_tunnel_update(struct ip_tunnel_net *itn,
|
|||
if (set_mtu)
|
||||
dev->mtu = mtu;
|
||||
}
|
||||
ip_tunnel_dst_reset_all(t);
|
||||
dst_cache_reset(&t->dst_cache);
|
||||
netdev_state_change(dev);
|
||||
}
|
||||
|
||||
|
|
@ -980,7 +928,7 @@ static void ip_tunnel_dev_free(struct net_device *dev)
|
|||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||
|
||||
gro_cells_destroy(&tunnel->gro_cells);
|
||||
free_percpu(tunnel->dst_cache);
|
||||
dst_cache_destroy(&tunnel->dst_cache);
|
||||
free_percpu(dev->tstats);
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
|
@ -1174,15 +1122,15 @@ int ip_tunnel_init(struct net_device *dev)
|
|||
if (!dev->tstats)
|
||||
return -ENOMEM;
|
||||
|
||||
tunnel->dst_cache = alloc_percpu(struct ip_tunnel_dst);
|
||||
if (!tunnel->dst_cache) {
|
||||
err = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
|
||||
if (err) {
|
||||
free_percpu(dev->tstats);
|
||||
return -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
|
||||
err = gro_cells_init(&tunnel->gro_cells, dev);
|
||||
if (err) {
|
||||
free_percpu(tunnel->dst_cache);
|
||||
dst_cache_destroy(&tunnel->dst_cache);
|
||||
free_percpu(dev->tstats);
|
||||
return err;
|
||||
}
|
||||
|
|
@ -1212,7 +1160,7 @@ void ip_tunnel_uninit(struct net_device *dev)
|
|||
if (itn->fb_tunnel_dev != dev)
|
||||
ip_tunnel_del(itn, netdev_priv(dev));
|
||||
|
||||
ip_tunnel_dst_reset_all(tunnel);
|
||||
dst_cache_reset(&tunnel->dst_cache);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip_tunnel_uninit);
|
||||
|
||||
|
|
|
|||
|
|
@ -1340,10 +1340,7 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
err = nf_getsockopt(sk, PF_INET6, optname, optval,
|
||||
&len);
|
||||
release_sock(sk);
|
||||
err = nf_getsockopt(sk, PF_INET6, optname, optval, &len);
|
||||
if (err >= 0)
|
||||
err = put_user(len, optlen);
|
||||
}
|
||||
|
|
@ -1382,10 +1379,7 @@ int compat_ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
err = compat_nf_getsockopt(sk, PF_INET6,
|
||||
optname, optval, &len);
|
||||
release_sock(sk);
|
||||
err = compat_nf_getsockopt(sk, PF_INET6, optname, optval, &len);
|
||||
if (err >= 0)
|
||||
err = put_user(len, optlen);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ static void ipip6_tunnel_uninit(struct net_device *dev)
|
|||
ipip6_tunnel_unlink(sitn, tunnel);
|
||||
ipip6_tunnel_del_prl(tunnel, NULL);
|
||||
}
|
||||
ip_tunnel_dst_reset_all(tunnel);
|
||||
dst_cache_reset(&tunnel->dst_cache);
|
||||
dev_put(dev);
|
||||
}
|
||||
|
||||
|
|
@ -1098,7 +1098,7 @@ static void ipip6_tunnel_update(struct ip_tunnel *t, struct ip_tunnel_parm *p)
|
|||
t->parms.link = p->link;
|
||||
ipip6_tunnel_bind_dev(t->dev);
|
||||
}
|
||||
ip_tunnel_dst_reset_all(t);
|
||||
dst_cache_reset(&t->dst_cache);
|
||||
netdev_state_change(t->dev);
|
||||
}
|
||||
|
||||
|
|
@ -1129,7 +1129,7 @@ static int ipip6_tunnel_update_6rd(struct ip_tunnel *t,
|
|||
t->ip6rd.relay_prefix = relay_prefix;
|
||||
t->ip6rd.prefixlen = ip6rd->prefixlen;
|
||||
t->ip6rd.relay_prefixlen = ip6rd->relay_prefixlen;
|
||||
ip_tunnel_dst_reset_all(t);
|
||||
dst_cache_reset(&t->dst_cache);
|
||||
netdev_state_change(t->dev);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1283,7 +1283,7 @@ ipip6_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL);
|
||||
break;
|
||||
}
|
||||
ip_tunnel_dst_reset_all(t);
|
||||
dst_cache_reset(&t->dst_cache);
|
||||
netdev_state_change(dev);
|
||||
break;
|
||||
|
||||
|
|
@ -1344,7 +1344,7 @@ static void ipip6_dev_free(struct net_device *dev)
|
|||
{
|
||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||
|
||||
free_percpu(tunnel->dst_cache);
|
||||
dst_cache_destroy(&tunnel->dst_cache);
|
||||
free_percpu(dev->tstats);
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
|
@ -1377,6 +1377,7 @@ static void ipip6_tunnel_setup(struct net_device *dev)
|
|||
static int ipip6_tunnel_init(struct net_device *dev)
|
||||
{
|
||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
tunnel->dev = dev;
|
||||
tunnel->net = dev_net(dev);
|
||||
|
|
@ -1387,11 +1388,11 @@ static int ipip6_tunnel_init(struct net_device *dev)
|
|||
if (!dev->tstats)
|
||||
return -ENOMEM;
|
||||
|
||||
tunnel->dst_cache = alloc_percpu(struct ip_tunnel_dst);
|
||||
if (!tunnel->dst_cache) {
|
||||
err = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
|
||||
if (err) {
|
||||
free_percpu(dev->tstats);
|
||||
dev->tstats = NULL;
|
||||
return -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -2877,7 +2877,7 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
|
|||
}
|
||||
if (beacon->probe_resp_len) {
|
||||
new_beacon->probe_resp_len = beacon->probe_resp_len;
|
||||
beacon->probe_resp = pos;
|
||||
new_beacon->probe_resp = pos;
|
||||
memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
|
||||
pos += beacon->probe_resp_len;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user