mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Merge branch 'linux-linaro-lsk-v4.4-android' of git://git.linaro.org/kernel/linux-linaro-stable.git
* linux-linaro-lsk-v4.4-android: Linux 4.4.15 usb: dwc3: exynos: Fix deferred probing storm. usb: host: ehci-tegra: Grab the correct UTMI pads reset usb: gadget: fix spinlock dead lock in gadgetfs USB: mos7720: delete parport xhci: Fix handling timeouted commands on hosts in weird states. USB: xhci: Add broken streams quirk for Frescologic device id 1009 usb: xhci-plat: properly handle probe deferral for devm_clk_get() xhci: Cleanup only when releasing primary hcd usb: musb: host: correct cppi dma channel for isoch transfer usb: musb: Ensure rx reinit occurs for shared_fifo endpoints usb: musb: Stop bulk endpoint while queue is rotated usb: musb: only restore devctl when session was set in backup usb: quirks: Add no-lpm quirk for Acer C120 LED Projector usb: quirks: Fix sorting USB: uas: Fix slave queue_depth not being set crypto: user - re-add size check for CRYPTO_MSG_GETALG crypto: ux500 - memmove the right size crypto: vmx - Increase priority of aes-cbc cipher AX.25: Close socket connection on session completion bpf: try harder on clones when writing into skb net: alx: Work around the DMA RX overflow issue net: macb: fix default configuration for GMAC on AT91 neigh: Explicitly declare RCU-bh read side critical section in neigh_xmit() bpf, perf: delay release of BPF prog after grace period sock_diag: do not broadcast raw socket destruction Bridge: Fix ipv6 mc snooping if bridge has no ipv6 address ipmr/ip6mr: Initialize the last assert time of mfc entries. netem: fix a use after free esp: Fix ESN generation under UDP encapsulation sit: correct IP protocol used in ipip6_err net: Don't forget pr_fmt on net_dbg_ratelimited for CONFIG_DYNAMIC_DEBUG net_sched: fix pfifo_head_drop behavior vs backlog sdcardfs: Truncate packages_gid.list on overflow UPSTREAM: cdc_ncm: do not call usbnet_link_change from cdc_ncm_bind BACKPORT: proc: add /proc/<pid>/timerslack_ns interface BACKPORT: timer: convert timer_slack_ns from unsigned long to u64 netfilter: xt_quota2: make quota2_log work well Revert "usb: gadget: prevent change of Host MAC address of 'usb0' interface" BACKPORT: PM / sleep: Go direct_complete if driver has no callbacks ANDROID: base-cfg: enable UID_CPUTIME UPSTREAM: USB: usbfs: fix potential infoleak in devio UPSTREAM: ALSA: timer: Fix leak in events via snd_timer_user_ccallback UPSTREAM: ALSA: timer: Fix leak in events via snd_timer_user_tinterrupt UPSTREAM: ALSA: timer: Fix leak in SNDRV_TIMER_IOCTL_PARAMS ANDROID: configs: remove unused configs ANDROID: cpu: send KOBJ_ONLINE event when enabling cpus ANDROID: dm verity fec: initialize recursion level ANDROID: dm verity fec: fix RS block calculation
This commit is contained in:
commit
425dd637bb
|
|
@ -43,6 +43,7 @@ Table of Contents
|
|||
3.7 /proc/<pid>/task/<tid>/children - Information about task children
|
||||
3.8 /proc/<pid>/fdinfo/<fd> - Information about opened file
|
||||
3.9 /proc/<pid>/map_files - Information about memory mapped files
|
||||
3.10 /proc/<pid>/timerslack_ns - Task timerslack value
|
||||
|
||||
4 Configuring procfs
|
||||
4.1 Mount options
|
||||
|
|
@ -1856,6 +1857,23 @@ time one can open(2) mappings from the listings of two processes and
|
|||
comparing their inode numbers to figure out which anonymous memory areas
|
||||
are actually shared.
|
||||
|
||||
3.10 /proc/<pid>/timerslack_ns - Task timerslack value
|
||||
---------------------------------------------------------
|
||||
This file provides the value of the task's timerslack value in nanoseconds.
|
||||
This value specifies a amount of time that normal timers may be deferred
|
||||
in order to coalesce timers and avoid unnecessary wakeups.
|
||||
|
||||
This allows a task's interactivity vs power consumption trade off to be
|
||||
adjusted.
|
||||
|
||||
Writing 0 to the file will set the tasks timerslack to the default value.
|
||||
|
||||
Valid values are from 0 - ULLONG_MAX
|
||||
|
||||
An application setting the value must have PTRACE_MODE_ATTACH_FSCREDS level
|
||||
permissions on the task specified to change its timerslack_ns value.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Configuring procfs
|
||||
------------------------------------------------------------------------------
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 14
|
||||
SUBLEVEL = 15
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ CONFIG_IP6_NF_IPTABLES=y
|
|||
CONFIG_IP6_NF_MANGLE=y
|
||||
CONFIG_IP6_NF_RAW=y
|
||||
CONFIG_IP6_NF_TARGET_REJECT=y
|
||||
CONFIG_IP6_NF_TARGET_REJECT_SKERR=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_MIP6=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
|
|
@ -64,7 +63,6 @@ CONFIG_IP_NF_TARGET_MASQUERADE=y
|
|||
CONFIG_IP_NF_TARGET_NETMAP=y
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=y
|
||||
CONFIG_IP_NF_TARGET_REJECT=y
|
||||
CONFIG_IP_NF_TARGET_REJECT_SKERR=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NETFILTER=y
|
||||
|
|
@ -139,8 +137,8 @@ CONFIG_PPP_BSDCOMP=y
|
|||
CONFIG_PPP_DEFLATE=y
|
||||
CONFIG_PPP_MPPE=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_QUOTA=y
|
||||
CONFIG_RESOURCE_COUNTERS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RT_GROUP_SCHED=y
|
||||
CONFIG_SECURITY=y
|
||||
|
|
@ -152,6 +150,7 @@ CONFIG_STAGING=y
|
|||
CONFIG_SWP_EMULATION=y
|
||||
CONFIG_SYNC=y
|
||||
CONFIG_TUN=y
|
||||
CONFIG_UID_CPUTIME=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_CONFIGFS=y
|
||||
|
|
|
|||
|
|
@ -110,7 +110,6 @@ CONFIG_TABLET_USB_AIPTEK=y
|
|||
CONFIG_TABLET_USB_GTCO=y
|
||||
CONFIG_TABLET_USB_HANWANG=y
|
||||
CONFIG_TABLET_USB_KBTAB=y
|
||||
CONFIG_TABLET_USB_WACOM=y
|
||||
CONFIG_TASKSTATS=y
|
||||
CONFIG_TASK_DELAY_ACCT=y
|
||||
CONFIG_TASK_IO_ACCOUNTING=y
|
||||
|
|
|
|||
|
|
@ -455,6 +455,7 @@ static const int crypto_msg_min[CRYPTO_NR_MSGTYPES] = {
|
|||
[CRYPTO_MSG_NEWALG - CRYPTO_MSG_BASE] = MSGSIZE(crypto_user_alg),
|
||||
[CRYPTO_MSG_DELALG - CRYPTO_MSG_BASE] = MSGSIZE(crypto_user_alg),
|
||||
[CRYPTO_MSG_UPDATEALG - CRYPTO_MSG_BASE] = MSGSIZE(crypto_user_alg),
|
||||
[CRYPTO_MSG_GETALG - CRYPTO_MSG_BASE] = MSGSIZE(crypto_user_alg),
|
||||
[CRYPTO_MSG_DELRNG - CRYPTO_MSG_BASE] = 0,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -205,6 +205,8 @@ static void driver_bound(struct device *dev)
|
|||
|
||||
klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);
|
||||
|
||||
device_pm_check_callbacks(dev);
|
||||
|
||||
/*
|
||||
* Make sure the device is no longer in one of the deferred lists and
|
||||
* kick off retrying all pending devices
|
||||
|
|
@ -697,6 +699,7 @@ static void __device_release_driver(struct device *dev)
|
|||
dev->pm_domain->dismiss(dev);
|
||||
|
||||
klist_remove(&dev->p->knode_driver);
|
||||
device_pm_check_callbacks(dev);
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_UNBOUND_DRIVER,
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@ void device_pm_add(struct device *dev)
|
|||
{
|
||||
pr_debug("PM: Adding info for %s:%s\n",
|
||||
dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
|
||||
device_pm_check_callbacks(dev);
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
if (dev->parent && dev->parent->power.is_prepared)
|
||||
dev_warn(dev, "parent %s should not be sleeping\n",
|
||||
|
|
@ -148,6 +149,7 @@ void device_pm_remove(struct device *dev)
|
|||
mutex_unlock(&dpm_list_mtx);
|
||||
device_wakeup_disable(dev);
|
||||
pm_runtime_remove(dev);
|
||||
device_pm_check_callbacks(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1575,6 +1577,11 @@ static int device_prepare(struct device *dev, pm_message_t state)
|
|||
|
||||
dev->power.wakeup_path = device_may_wakeup(dev);
|
||||
|
||||
if (dev->power.no_pm_callbacks) {
|
||||
ret = 1; /* Let device go direct_complete */
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (dev->pm_domain) {
|
||||
info = "preparing power domain ";
|
||||
callback = dev->pm_domain->ops.prepare;
|
||||
|
|
@ -1597,6 +1604,7 @@ static int device_prepare(struct device *dev, pm_message_t state)
|
|||
if (callback)
|
||||
ret = callback(dev);
|
||||
|
||||
unlock:
|
||||
device_unlock(dev);
|
||||
|
||||
if (ret < 0) {
|
||||
|
|
@ -1725,3 +1733,30 @@ void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *))
|
|||
device_pm_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dpm_for_each_dev);
|
||||
|
||||
static bool pm_ops_is_empty(const struct dev_pm_ops *ops)
|
||||
{
|
||||
if (!ops)
|
||||
return true;
|
||||
|
||||
return !ops->prepare &&
|
||||
!ops->suspend &&
|
||||
!ops->suspend_late &&
|
||||
!ops->suspend_noirq &&
|
||||
!ops->resume_noirq &&
|
||||
!ops->resume_early &&
|
||||
!ops->resume &&
|
||||
!ops->complete;
|
||||
}
|
||||
|
||||
void device_pm_check_callbacks(struct device *dev)
|
||||
{
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.no_pm_callbacks =
|
||||
(!dev->bus || pm_ops_is_empty(dev->bus->pm)) &&
|
||||
(!dev->class || pm_ops_is_empty(dev->class->pm)) &&
|
||||
(!dev->type || pm_ops_is_empty(dev->type->pm)) &&
|
||||
(!dev->pm_domain || pm_ops_is_empty(&dev->pm_domain->ops)) &&
|
||||
(!dev->driver || pm_ops_is_empty(dev->driver->pm));
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -123,6 +123,7 @@ extern void device_pm_remove(struct device *);
|
|||
extern void device_pm_move_before(struct device *, struct device *);
|
||||
extern void device_pm_move_after(struct device *, struct device *);
|
||||
extern void device_pm_move_last(struct device *);
|
||||
extern void device_pm_check_callbacks(struct device *dev);
|
||||
|
||||
#else /* !CONFIG_PM_SLEEP */
|
||||
|
||||
|
|
@ -141,6 +142,8 @@ static inline void device_pm_move_after(struct device *deva,
|
|||
struct device *devb) {}
|
||||
static inline void device_pm_move_last(struct device *dev) {}
|
||||
|
||||
static inline void device_pm_check_callbacks(struct device *dev) {}
|
||||
|
||||
#endif /* !CONFIG_PM_SLEEP */
|
||||
|
||||
static inline void device_pm_init(struct device *dev)
|
||||
|
|
|
|||
|
|
@ -797,7 +797,7 @@ static int hash_process_data(struct hash_device_data *device_data,
|
|||
&device_data->state);
|
||||
memmove(req_ctx->state.buffer,
|
||||
device_data->state.buffer,
|
||||
HASH_BLOCK_SIZE / sizeof(u32));
|
||||
HASH_BLOCK_SIZE);
|
||||
if (ret) {
|
||||
dev_err(device_data->dev,
|
||||
"%s: hash_resume_state() failed!\n",
|
||||
|
|
@ -848,7 +848,7 @@ static int hash_process_data(struct hash_device_data *device_data,
|
|||
|
||||
memmove(device_data->state.buffer,
|
||||
req_ctx->state.buffer,
|
||||
HASH_BLOCK_SIZE / sizeof(u32));
|
||||
HASH_BLOCK_SIZE);
|
||||
if (ret) {
|
||||
dev_err(device_data->dev, "%s: hash_save_state() failed!\n",
|
||||
__func__);
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ struct crypto_alg p8_aes_cbc_alg = {
|
|||
.cra_name = "cbc(aes)",
|
||||
.cra_driver_name = "p8_aes_cbc",
|
||||
.cra_module = THIS_MODULE,
|
||||
.cra_priority = 1000,
|
||||
.cra_priority = 2000,
|
||||
.cra_type = &crypto_blkcipher_type,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_NEED_FALLBACK,
|
||||
.cra_alignmask = 0,
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ struct crypto_alg p8_aes_ctr_alg = {
|
|||
.cra_name = "ctr(aes)",
|
||||
.cra_driver_name = "p8_aes_ctr",
|
||||
.cra_module = THIS_MODULE,
|
||||
.cra_priority = 1000,
|
||||
.cra_priority = 2000,
|
||||
.cra_type = &crypto_blkcipher_type,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_NEED_FALLBACK,
|
||||
.cra_alignmask = 0,
|
||||
|
|
|
|||
|
|
@ -463,9 +463,7 @@ int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io,
|
|||
*/
|
||||
|
||||
offset = block << v->data_dev_block_bits;
|
||||
|
||||
res = offset;
|
||||
div64_u64(res, v->fec->rounds << v->data_dev_block_bits);
|
||||
res = div64_u64(offset, v->fec->rounds << v->data_dev_block_bits);
|
||||
|
||||
/*
|
||||
* The base RS block we can feed to the interleaver to find out all
|
||||
|
|
@ -534,6 +532,7 @@ void verity_fec_init_io(struct dm_verity_io *io)
|
|||
memset(fio->bufs, 0, sizeof(fio->bufs));
|
||||
fio->nbufs = 0;
|
||||
fio->output = NULL;
|
||||
fio->level = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -86,9 +86,14 @@ static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp)
|
|||
while (!cur_buf->skb && next != rxq->read_idx) {
|
||||
struct alx_rfd *rfd = &rxq->rfd[cur];
|
||||
|
||||
skb = __netdev_alloc_skb(alx->dev, alx->rxbuf_size, gfp);
|
||||
skb = __netdev_alloc_skb(alx->dev, alx->rxbuf_size + 64, gfp);
|
||||
if (!skb)
|
||||
break;
|
||||
|
||||
/* Workround for the HW RX DMA overflow issue */
|
||||
if (((unsigned long)skb->data & 0xfff) == 0xfc0)
|
||||
skb_reserve(skb, 64);
|
||||
|
||||
dma = dma_map_single(&alx->hw.pdev->dev,
|
||||
skb->data, alx->rxbuf_size,
|
||||
DMA_FROM_DEVICE);
|
||||
|
|
|
|||
|
|
@ -2405,9 +2405,9 @@ static int macb_init(struct platform_device *pdev)
|
|||
if (bp->phy_interface == PHY_INTERFACE_MODE_RGMII)
|
||||
val = GEM_BIT(RGMII);
|
||||
else if (bp->phy_interface == PHY_INTERFACE_MODE_RMII &&
|
||||
(bp->caps & MACB_CAPS_USRIO_DEFAULT_IS_MII))
|
||||
(bp->caps & MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII))
|
||||
val = MACB_BIT(RMII);
|
||||
else if (!(bp->caps & MACB_CAPS_USRIO_DEFAULT_IS_MII))
|
||||
else if (!(bp->caps & MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII))
|
||||
val = MACB_BIT(MII);
|
||||
|
||||
if (bp->caps & MACB_CAPS_USRIO_HAS_CLKEN)
|
||||
|
|
@ -2738,7 +2738,7 @@ static int at91ether_init(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
static const struct macb_config at91sam9260_config = {
|
||||
.caps = MACB_CAPS_USRIO_HAS_CLKEN | MACB_CAPS_USRIO_DEFAULT_IS_MII,
|
||||
.caps = MACB_CAPS_USRIO_HAS_CLKEN | MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII,
|
||||
.clk_init = macb_clk_init,
|
||||
.init = macb_init,
|
||||
};
|
||||
|
|
@ -2751,21 +2751,22 @@ static const struct macb_config pc302gem_config = {
|
|||
};
|
||||
|
||||
static const struct macb_config sama5d2_config = {
|
||||
.caps = 0,
|
||||
.caps = MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII,
|
||||
.dma_burst_length = 16,
|
||||
.clk_init = macb_clk_init,
|
||||
.init = macb_init,
|
||||
};
|
||||
|
||||
static const struct macb_config sama5d3_config = {
|
||||
.caps = MACB_CAPS_SG_DISABLED | MACB_CAPS_GIGABIT_MODE_AVAILABLE,
|
||||
.caps = MACB_CAPS_SG_DISABLED | MACB_CAPS_GIGABIT_MODE_AVAILABLE
|
||||
| MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII,
|
||||
.dma_burst_length = 16,
|
||||
.clk_init = macb_clk_init,
|
||||
.init = macb_init,
|
||||
};
|
||||
|
||||
static const struct macb_config sama5d4_config = {
|
||||
.caps = 0,
|
||||
.caps = MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII,
|
||||
.dma_burst_length = 4,
|
||||
.clk_init = macb_clk_init,
|
||||
.init = macb_init,
|
||||
|
|
|
|||
|
|
@ -398,7 +398,7 @@
|
|||
/* Capability mask bits */
|
||||
#define MACB_CAPS_ISR_CLEAR_ON_WRITE 0x00000001
|
||||
#define MACB_CAPS_USRIO_HAS_CLKEN 0x00000002
|
||||
#define MACB_CAPS_USRIO_DEFAULT_IS_MII 0x00000004
|
||||
#define MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII 0x00000004
|
||||
#define MACB_CAPS_NO_GIGABIT_HALF 0x00000008
|
||||
#define MACB_CAPS_FIFO_MODE 0x10000000
|
||||
#define MACB_CAPS_GIGABIT_MODE_AVAILABLE 0x20000000
|
||||
|
|
|
|||
|
|
@ -945,8 +945,6 @@ EXPORT_SYMBOL_GPL(cdc_ncm_select_altsetting);
|
|||
|
||||
static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* MBIM backwards compatible function? */
|
||||
if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM)
|
||||
return -ENODEV;
|
||||
|
|
@ -955,16 +953,7 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||
* Additionally, generic NCM devices are assumed to accept arbitrarily
|
||||
* placed NDP.
|
||||
*/
|
||||
ret = cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM, 0);
|
||||
|
||||
/*
|
||||
* We should get an event when network connection is "connected" or
|
||||
* "disconnected". Set network connection in "disconnected" state
|
||||
* (carrier is OFF) during attach, so the IP network stack does not
|
||||
* start IPv6 negotiation and more.
|
||||
*/
|
||||
usbnet_link_change(dev, 0, 0);
|
||||
return ret;
|
||||
return cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM, 0);
|
||||
}
|
||||
|
||||
static void cdc_ncm_align_tail(struct sk_buff *skb, size_t modulus, size_t remainder, size_t max)
|
||||
|
|
@ -1547,7 +1536,8 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb)
|
|||
|
||||
static const struct driver_info cdc_ncm_info = {
|
||||
.description = "CDC NCM",
|
||||
.flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET,
|
||||
.flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
|
||||
| FLAG_LINK_INTR,
|
||||
.bind = cdc_ncm_bind,
|
||||
.unbind = cdc_ncm_unbind,
|
||||
.manage_power = usbnet_manage_power,
|
||||
|
|
@ -1560,7 +1550,7 @@ static const struct driver_info cdc_ncm_info = {
|
|||
static const struct driver_info wwan_info = {
|
||||
.description = "Mobile Broadband Network Device",
|
||||
.flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
|
||||
| FLAG_WWAN,
|
||||
| FLAG_LINK_INTR | FLAG_WWAN,
|
||||
.bind = cdc_ncm_bind,
|
||||
.unbind = cdc_ncm_unbind,
|
||||
.manage_power = usbnet_manage_power,
|
||||
|
|
@ -1573,7 +1563,7 @@ static const struct driver_info wwan_info = {
|
|||
static const struct driver_info wwan_noarp_info = {
|
||||
.description = "Mobile Broadband Network Device (NO ARP)",
|
||||
.flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
|
||||
| FLAG_WWAN | FLAG_NOARP,
|
||||
| FLAG_LINK_INTR | FLAG_WWAN | FLAG_NOARP,
|
||||
.bind = cdc_ncm_bind,
|
||||
.unbind = cdc_ncm_unbind,
|
||||
.manage_power = usbnet_manage_power,
|
||||
|
|
|
|||
|
|
@ -1203,10 +1203,11 @@ static int proc_getdriver(struct usb_dev_state *ps, void __user *arg)
|
|||
|
||||
static int proc_connectinfo(struct usb_dev_state *ps, void __user *arg)
|
||||
{
|
||||
struct usbdevfs_connectinfo ci = {
|
||||
.devnum = ps->dev->devnum,
|
||||
.slow = ps->dev->speed == USB_SPEED_LOW
|
||||
};
|
||||
struct usbdevfs_connectinfo ci;
|
||||
|
||||
memset(&ci, 0, sizeof(ci));
|
||||
ci.devnum = ps->dev->devnum;
|
||||
ci.slow = ps->dev->speed == USB_SPEED_LOW;
|
||||
|
||||
if (copy_to_user(arg, &ci, sizeof(ci)))
|
||||
return -EFAULT;
|
||||
|
|
|
|||
|
|
@ -44,6 +44,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
/* Creative SB Audigy 2 NX */
|
||||
{ USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* USB3503 */
|
||||
{ USB_DEVICE(0x0424, 0x3503), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Microsoft Wireless Laser Mouse 6000 Receiver */
|
||||
{ USB_DEVICE(0x045e, 0x00e1), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
|
|
@ -173,6 +176,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
/* MAYA44USB sound device */
|
||||
{ USB_DEVICE(0x0a92, 0x0091), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* ASUS Base Station(T100) */
|
||||
{ USB_DEVICE(0x0b05, 0x17e0), .driver_info =
|
||||
USB_QUIRK_IGNORE_REMOTE_WAKEUP },
|
||||
|
||||
/* Action Semiconductor flash disk */
|
||||
{ USB_DEVICE(0x10d6, 0x2200), .driver_info =
|
||||
USB_QUIRK_STRING_FETCH_255 },
|
||||
|
|
@ -188,26 +195,22 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
{ USB_DEVICE(0x1908, 0x1315), .driver_info =
|
||||
USB_QUIRK_HONOR_BNUMINTERFACES },
|
||||
|
||||
/* INTEL VALUE SSD */
|
||||
{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* USB3503 */
|
||||
{ USB_DEVICE(0x0424, 0x3503), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* ASUS Base Station(T100) */
|
||||
{ USB_DEVICE(0x0b05, 0x17e0), .driver_info =
|
||||
USB_QUIRK_IGNORE_REMOTE_WAKEUP },
|
||||
|
||||
/* Protocol and OTG Electrical Test Device */
|
||||
{ USB_DEVICE(0x1a0a, 0x0200), .driver_info =
|
||||
USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
|
||||
|
||||
/* Acer C120 LED Projector */
|
||||
{ USB_DEVICE(0x1de1, 0xc102), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* Blackmagic Design Intensity Shuttle */
|
||||
{ USB_DEVICE(0x1edb, 0xbd3b), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* Blackmagic Design UltraStudio SDI */
|
||||
{ USB_DEVICE(0x1edb, 0xbd4f), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* INTEL VALUE SSD */
|
||||
{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
{ } /* terminating entry must be last */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -128,12 +128,6 @@ static int dwc3_exynos_probe(struct platform_device *pdev)
|
|||
|
||||
platform_set_drvdata(pdev, exynos);
|
||||
|
||||
ret = dwc3_exynos_register_phys(exynos);
|
||||
if (ret) {
|
||||
dev_err(dev, "couldn't register PHYs\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
exynos->dev = dev;
|
||||
|
||||
exynos->clk = devm_clk_get(dev, "usbdrd30");
|
||||
|
|
@ -183,20 +177,29 @@ static int dwc3_exynos_probe(struct platform_device *pdev)
|
|||
goto err3;
|
||||
}
|
||||
|
||||
ret = dwc3_exynos_register_phys(exynos);
|
||||
if (ret) {
|
||||
dev_err(dev, "couldn't register PHYs\n");
|
||||
goto err4;
|
||||
}
|
||||
|
||||
if (node) {
|
||||
ret = of_platform_populate(node, NULL, NULL, dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to add dwc3 core\n");
|
||||
goto err4;
|
||||
goto err5;
|
||||
}
|
||||
} else {
|
||||
dev_err(dev, "no device node, failed to add dwc3 core\n");
|
||||
ret = -ENODEV;
|
||||
goto err4;
|
||||
goto err5;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err5:
|
||||
platform_device_unregister(exynos->usb2_phy);
|
||||
platform_device_unregister(exynos->usb3_phy);
|
||||
err4:
|
||||
regulator_disable(exynos->vdd10);
|
||||
err3:
|
||||
|
|
|
|||
|
|
@ -863,8 +863,6 @@ static int eth_stop(struct net_device *net)
|
|||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static u8 host_ethaddr[ETH_ALEN];
|
||||
|
||||
static int get_ether_addr(const char *str, u8 *dev_addr)
|
||||
{
|
||||
if (str) {
|
||||
|
|
@ -895,17 +893,6 @@ static int get_ether_addr_str(u8 dev_addr[ETH_ALEN], char *str, int len)
|
|||
return 18;
|
||||
}
|
||||
|
||||
static int get_host_ether_addr(u8 *str, u8 *dev_addr)
|
||||
{
|
||||
memcpy(dev_addr, str, ETH_ALEN);
|
||||
if (is_valid_ether_addr(dev_addr))
|
||||
return 0;
|
||||
|
||||
random_ether_addr(dev_addr);
|
||||
memcpy(str, dev_addr, ETH_ALEN);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const struct net_device_ops eth_netdev_ops = {
|
||||
.ndo_open = eth_open,
|
||||
.ndo_stop = eth_stop,
|
||||
|
|
@ -963,11 +950,9 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g,
|
|||
if (get_ether_addr(dev_addr, net->dev_addr))
|
||||
dev_warn(&g->dev,
|
||||
"using random %s ethernet address\n", "self");
|
||||
|
||||
if (get_host_ether_addr(host_ethaddr, dev->host_mac))
|
||||
dev_warn(&g->dev, "using random %s ethernet address\n", "host");
|
||||
else
|
||||
dev_warn(&g->dev, "using previous %s ethernet address\n", "host");
|
||||
if (get_ether_addr(host_addr, dev->host_mac))
|
||||
dev_warn(&g->dev,
|
||||
"using random %s ethernet address\n", "host");
|
||||
|
||||
if (ethaddr)
|
||||
memcpy(ethaddr, dev->host_mac, ETH_ALEN);
|
||||
|
|
|
|||
|
|
@ -937,8 +937,11 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr)
|
|||
struct usb_ep *ep = dev->gadget->ep0;
|
||||
struct usb_request *req = dev->req;
|
||||
|
||||
if ((retval = setup_req (ep, req, 0)) == 0)
|
||||
retval = usb_ep_queue (ep, req, GFP_ATOMIC);
|
||||
if ((retval = setup_req (ep, req, 0)) == 0) {
|
||||
spin_unlock_irq (&dev->lock);
|
||||
retval = usb_ep_queue (ep, req, GFP_KERNEL);
|
||||
spin_lock_irq (&dev->lock);
|
||||
}
|
||||
dev->state = STATE_DEV_CONNECTED;
|
||||
|
||||
/* assume that was SET_CONFIGURATION */
|
||||
|
|
@ -1456,8 +1459,11 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
|
|||
w_length);
|
||||
if (value < 0)
|
||||
break;
|
||||
|
||||
spin_unlock (&dev->lock);
|
||||
value = usb_ep_queue (gadget->ep0, dev->req,
|
||||
GFP_ATOMIC);
|
||||
GFP_KERNEL);
|
||||
spin_lock (&dev->lock);
|
||||
if (value < 0) {
|
||||
clean_req (gadget->ep0, dev->req);
|
||||
break;
|
||||
|
|
@ -1480,11 +1486,14 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
|
|||
if (value >= 0 && dev->state != STATE_DEV_SETUP) {
|
||||
req->length = value;
|
||||
req->zero = value < w_length;
|
||||
value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC);
|
||||
|
||||
spin_unlock (&dev->lock);
|
||||
value = usb_ep_queue (gadget->ep0, req, GFP_KERNEL);
|
||||
if (value < 0) {
|
||||
DBG (dev, "ep_queue --> %d\n", value);
|
||||
req->status = 0;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/* device stalls when value < 0 */
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ static int tegra_reset_usb_controller(struct platform_device *pdev)
|
|||
if (!usb1_reset_attempted) {
|
||||
struct reset_control *usb1_reset;
|
||||
|
||||
usb1_reset = of_reset_control_get(phy_np, "usb");
|
||||
usb1_reset = of_reset_control_get(phy_np, "utmi-pads");
|
||||
if (IS_ERR(usb1_reset)) {
|
||||
dev_warn(&pdev->dev,
|
||||
"can't get utmi-pads reset from the PHY\n");
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
/* Device for a quirk */
|
||||
#define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73
|
||||
#define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000
|
||||
#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1009 0x1009
|
||||
#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1400 0x1400
|
||||
|
||||
#define PCI_VENDOR_ID_ETRON 0x1b6f
|
||||
|
|
@ -115,6 +116,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
|||
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
||||
}
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
|
||||
pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1009)
|
||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_NEC)
|
||||
xhci->quirks |= XHCI_NEC_HOST;
|
||||
|
||||
|
|
|
|||
|
|
@ -142,6 +142,9 @@ static int xhci_plat_probe(struct platform_device *pdev)
|
|||
ret = clk_prepare_enable(clk);
|
||||
if (ret)
|
||||
goto put_hcd;
|
||||
} else if (PTR_ERR(clk) == -EPROBE_DEFER) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto put_hcd;
|
||||
}
|
||||
|
||||
if (of_device_is_compatible(pdev->dev.of_node,
|
||||
|
|
|
|||
|
|
@ -289,6 +289,14 @@ static int xhci_abort_cmd_ring(struct xhci_hcd *xhci)
|
|||
|
||||
temp_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
|
||||
xhci->cmd_ring_state = CMD_RING_STATE_ABORTED;
|
||||
|
||||
/*
|
||||
* Writing the CMD_RING_ABORT bit should cause a cmd completion event,
|
||||
* however on some host hw the CMD_RING_RUNNING bit is correctly cleared
|
||||
* but the completion event in never sent. Use the cmd timeout timer to
|
||||
* handle those cases. Use twice the time to cover the bit polling retry
|
||||
*/
|
||||
mod_timer(&xhci->cmd_timer, jiffies + (2 * XHCI_CMD_DEFAULT_TIMEOUT));
|
||||
xhci_write_64(xhci, temp_64 | CMD_RING_ABORT,
|
||||
&xhci->op_regs->cmd_ring);
|
||||
|
||||
|
|
@ -313,6 +321,7 @@ static int xhci_abort_cmd_ring(struct xhci_hcd *xhci)
|
|||
|
||||
xhci_err(xhci, "Stopped the command ring failed, "
|
||||
"maybe the host is dead\n");
|
||||
del_timer(&xhci->cmd_timer);
|
||||
xhci->xhc_state |= XHCI_STATE_DYING;
|
||||
xhci_quiesce(xhci);
|
||||
xhci_halt(xhci);
|
||||
|
|
@ -1252,22 +1261,21 @@ void xhci_handle_command_timeout(unsigned long data)
|
|||
int ret;
|
||||
unsigned long flags;
|
||||
u64 hw_ring_state;
|
||||
struct xhci_command *cur_cmd = NULL;
|
||||
bool second_timeout = false;
|
||||
xhci = (struct xhci_hcd *) data;
|
||||
|
||||
/* mark this command to be cancelled */
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
if (xhci->current_cmd) {
|
||||
cur_cmd = xhci->current_cmd;
|
||||
cur_cmd->status = COMP_CMD_ABORT;
|
||||
if (xhci->current_cmd->status == COMP_CMD_ABORT)
|
||||
second_timeout = true;
|
||||
xhci->current_cmd->status = COMP_CMD_ABORT;
|
||||
}
|
||||
|
||||
|
||||
/* Make sure command ring is running before aborting it */
|
||||
hw_ring_state = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
|
||||
if ((xhci->cmd_ring_state & CMD_RING_STATE_RUNNING) &&
|
||||
(hw_ring_state & CMD_RING_RUNNING)) {
|
||||
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
xhci_dbg(xhci, "Command timeout\n");
|
||||
ret = xhci_abort_cmd_ring(xhci);
|
||||
|
|
@ -1279,6 +1287,15 @@ void xhci_handle_command_timeout(unsigned long data)
|
|||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* command ring failed to restart, or host removed. Bail out */
|
||||
if (second_timeout || xhci->xhc_state & XHCI_STATE_REMOVING) {
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
xhci_dbg(xhci, "command timed out twice, ring start fail?\n");
|
||||
xhci_cleanup_command_queue(xhci);
|
||||
return;
|
||||
}
|
||||
|
||||
/* command timeout on stopped ring, ring can't be aborted */
|
||||
xhci_dbg(xhci, "Command timeout on stopped ring\n");
|
||||
xhci_handle_stopped_cmd_ring(xhci, xhci->current_cmd);
|
||||
|
|
@ -2727,7 +2744,8 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
|
|||
writel(irq_pending, &xhci->ir_set->irq_pending);
|
||||
}
|
||||
|
||||
if (xhci->xhc_state & XHCI_STATE_DYING) {
|
||||
if (xhci->xhc_state & XHCI_STATE_DYING ||
|
||||
xhci->xhc_state & XHCI_STATE_HALTED) {
|
||||
xhci_dbg(xhci, "xHCI dying, ignoring interrupt. "
|
||||
"Shouldn't IRQs be disabled?\n");
|
||||
/* Clear the event handler busy flag (RW1C);
|
||||
|
|
|
|||
|
|
@ -680,20 +680,23 @@ void xhci_stop(struct usb_hcd *hcd)
|
|||
u32 temp;
|
||||
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
||||
|
||||
if (xhci->xhc_state & XHCI_STATE_HALTED)
|
||||
return;
|
||||
|
||||
mutex_lock(&xhci->mutex);
|
||||
spin_lock_irq(&xhci->lock);
|
||||
xhci->xhc_state |= XHCI_STATE_HALTED;
|
||||
xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
|
||||
|
||||
/* Make sure the xHC is halted for a USB3 roothub
|
||||
* (xhci_stop() could be called as part of failed init).
|
||||
*/
|
||||
xhci_halt(xhci);
|
||||
xhci_reset(xhci);
|
||||
spin_unlock_irq(&xhci->lock);
|
||||
if (!(xhci->xhc_state & XHCI_STATE_HALTED)) {
|
||||
spin_lock_irq(&xhci->lock);
|
||||
|
||||
xhci->xhc_state |= XHCI_STATE_HALTED;
|
||||
xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
|
||||
xhci_halt(xhci);
|
||||
xhci_reset(xhci);
|
||||
|
||||
spin_unlock_irq(&xhci->lock);
|
||||
}
|
||||
|
||||
if (!usb_hcd_is_primary_hcd(hcd)) {
|
||||
mutex_unlock(&xhci->mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
xhci_cleanup_msix(xhci);
|
||||
|
||||
|
|
|
|||
|
|
@ -2401,7 +2401,8 @@ static void musb_restore_context(struct musb *musb)
|
|||
musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe);
|
||||
musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe);
|
||||
musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe);
|
||||
musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl);
|
||||
if (musb->context.devctl & MUSB_DEVCTL_SESSION)
|
||||
musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl);
|
||||
|
||||
for (i = 0; i < musb->config->num_eps; ++i) {
|
||||
struct musb_hw_ep *hw_ep;
|
||||
|
|
|
|||
|
|
@ -594,14 +594,13 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, u8 epnum)
|
|||
musb_writew(ep->regs, MUSB_TXCSR, 0);
|
||||
|
||||
/* scrub all previous state, clearing toggle */
|
||||
} else {
|
||||
csr = musb_readw(ep->regs, MUSB_RXCSR);
|
||||
if (csr & MUSB_RXCSR_RXPKTRDY)
|
||||
WARNING("rx%d, packet/%d ready?\n", ep->epnum,
|
||||
musb_readw(ep->regs, MUSB_RXCOUNT));
|
||||
|
||||
musb_h_flush_rxfifo(ep, MUSB_RXCSR_CLRDATATOG);
|
||||
}
|
||||
csr = musb_readw(ep->regs, MUSB_RXCSR);
|
||||
if (csr & MUSB_RXCSR_RXPKTRDY)
|
||||
WARNING("rx%d, packet/%d ready?\n", ep->epnum,
|
||||
musb_readw(ep->regs, MUSB_RXCOUNT));
|
||||
|
||||
musb_h_flush_rxfifo(ep, MUSB_RXCSR_CLRDATATOG);
|
||||
|
||||
/* target addr and (for multipoint) hub addr/port */
|
||||
if (musb->is_multipoint) {
|
||||
|
|
@ -995,9 +994,15 @@ static void musb_bulk_nak_timeout(struct musb *musb, struct musb_hw_ep *ep,
|
|||
if (is_in) {
|
||||
dma = is_dma_capable() ? ep->rx_channel : NULL;
|
||||
|
||||
/* clear nak timeout bit */
|
||||
/*
|
||||
* Need to stop the transaction by clearing REQPKT first
|
||||
* then the NAK Timeout bit ref MUSBMHDRC USB 2.0 HIGH-SPEED
|
||||
* DUAL-ROLE CONTROLLER Programmer's Guide, section 9.2.2
|
||||
*/
|
||||
rx_csr = musb_readw(epio, MUSB_RXCSR);
|
||||
rx_csr |= MUSB_RXCSR_H_WZC_BITS;
|
||||
rx_csr &= ~MUSB_RXCSR_H_REQPKT;
|
||||
musb_writew(epio, MUSB_RXCSR, rx_csr);
|
||||
rx_csr &= ~MUSB_RXCSR_DATAERROR;
|
||||
musb_writew(epio, MUSB_RXCSR, rx_csr);
|
||||
|
||||
|
|
@ -1551,7 +1556,7 @@ static int musb_rx_dma_iso_cppi41(struct dma_controller *dma,
|
|||
struct urb *urb,
|
||||
size_t len)
|
||||
{
|
||||
struct dma_channel *channel = hw_ep->tx_channel;
|
||||
struct dma_channel *channel = hw_ep->rx_channel;
|
||||
void __iomem *epio = hw_ep->regs;
|
||||
dma_addr_t *buf;
|
||||
u32 length, res;
|
||||
|
|
|
|||
|
|
@ -2007,6 +2007,7 @@ static void mos7720_release(struct usb_serial *serial)
|
|||
urblist_entry)
|
||||
usb_unlink_urb(urbtrack->urb);
|
||||
spin_unlock_irqrestore(&mos_parport->listlock, flags);
|
||||
parport_del_port(mos_parport->pp);
|
||||
|
||||
kref_put(&mos_parport->ref_count, destroy_mos_parport);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -811,6 +811,7 @@ static int uas_slave_configure(struct scsi_device *sdev)
|
|||
if (devinfo->flags & US_FL_BROKEN_FUA)
|
||||
sdev->broken_fua = 1;
|
||||
|
||||
scsi_change_queue_depth(sdev, devinfo->qdepth - 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1588,7 +1588,7 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,
|
|||
{
|
||||
int res = 0, eavail, timed_out = 0;
|
||||
unsigned long flags;
|
||||
long slack = 0;
|
||||
u64 slack = 0;
|
||||
wait_queue_t wait;
|
||||
ktime_t expires, *to = NULL;
|
||||
|
||||
|
|
|
|||
|
|
@ -2245,6 +2245,72 @@ static const struct file_operations proc_timers_operations = {
|
|||
.release = seq_release_private,
|
||||
};
|
||||
|
||||
static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *offset)
|
||||
{
|
||||
struct inode *inode = file_inode(file);
|
||||
struct task_struct *p;
|
||||
u64 slack_ns;
|
||||
int err;
|
||||
|
||||
err = kstrtoull_from_user(buf, count, 10, &slack_ns);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
p = get_proc_task(inode);
|
||||
if (!p)
|
||||
return -ESRCH;
|
||||
|
||||
if (ptrace_may_access(p, PTRACE_MODE_ATTACH_FSCREDS)) {
|
||||
task_lock(p);
|
||||
if (slack_ns == 0)
|
||||
p->timer_slack_ns = p->default_timer_slack_ns;
|
||||
else
|
||||
p->timer_slack_ns = slack_ns;
|
||||
task_unlock(p);
|
||||
} else
|
||||
count = -EPERM;
|
||||
|
||||
put_task_struct(p);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int timerslack_ns_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct inode *inode = m->private;
|
||||
struct task_struct *p;
|
||||
int err = 0;
|
||||
|
||||
p = get_proc_task(inode);
|
||||
if (!p)
|
||||
return -ESRCH;
|
||||
|
||||
if (ptrace_may_access(p, PTRACE_MODE_ATTACH_FSCREDS)) {
|
||||
task_lock(p);
|
||||
seq_printf(m, "%llu\n", p->timer_slack_ns);
|
||||
task_unlock(p);
|
||||
} else
|
||||
err = -EPERM;
|
||||
|
||||
put_task_struct(p);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int timerslack_ns_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
return single_open(filp, timerslack_ns_show, inode);
|
||||
}
|
||||
|
||||
static const struct file_operations proc_pid_set_timerslack_ns_operations = {
|
||||
.open = timerslack_ns_open,
|
||||
.read = seq_read,
|
||||
.write = timerslack_ns_write,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int proc_pident_instantiate(struct inode *dir,
|
||||
struct dentry *dentry, struct task_struct *task, const void *ptr)
|
||||
{
|
||||
|
|
@ -2822,6 +2888,7 @@ static const struct pid_entry tgid_base_stuff[] = {
|
|||
#ifdef CONFIG_CHECKPOINT_RESTORE
|
||||
REG("timers", S_IRUGO, proc_timers_operations),
|
||||
#endif
|
||||
REG("timerslack_ns", S_IRUGO|S_IWUGO, proc_pid_set_timerslack_ns_operations),
|
||||
};
|
||||
|
||||
static int proc_tgid_base_readdir(struct file *file, struct dir_context *ctx)
|
||||
|
|
|
|||
|
|
@ -335,12 +335,19 @@ static ssize_t packages_attr_show(struct config_item *item,
|
|||
struct hashtable_entry *hash_cur;
|
||||
struct hlist_node *h_t;
|
||||
int i;
|
||||
int count = 0;
|
||||
mutex_lock(&pkgl_data_all->hashtable_lock);
|
||||
hash_for_each_safe(pkgl_data_all->package_to_appid, i, h_t, hash_cur, hlist)
|
||||
count += snprintf(page + count, PAGE_SIZE - count, "%s %d\n", (char *)hash_cur->key, hash_cur->value);
|
||||
mutex_unlock(&pkgl_data_all->hashtable_lock);
|
||||
int count = 0, written = 0;
|
||||
char errormsg[] = "<truncated>\n";
|
||||
|
||||
mutex_lock(&pkgl_data_all->hashtable_lock);
|
||||
hash_for_each_safe(pkgl_data_all->package_to_appid, i, h_t, hash_cur, hlist) {
|
||||
written = scnprintf(page + count, PAGE_SIZE - sizeof(errormsg) - count, "%s %d\n", (char *)hash_cur->key, hash_cur->value);
|
||||
if (count + written == PAGE_SIZE - sizeof(errormsg)) {
|
||||
count += scnprintf(page + count, PAGE_SIZE - count, errormsg);
|
||||
break;
|
||||
}
|
||||
count += written;
|
||||
}
|
||||
mutex_unlock(&pkgl_data_all->hashtable_lock);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,9 +70,9 @@ static long __estimate_accuracy(struct timespec *tv)
|
|||
return slack;
|
||||
}
|
||||
|
||||
long select_estimate_accuracy(struct timespec *tv)
|
||||
u64 select_estimate_accuracy(struct timespec *tv)
|
||||
{
|
||||
unsigned long ret;
|
||||
u64 ret;
|
||||
struct timespec now;
|
||||
|
||||
/*
|
||||
|
|
@ -402,7 +402,7 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time)
|
|||
struct poll_wqueues table;
|
||||
poll_table *wait;
|
||||
int retval, i, timed_out = 0;
|
||||
unsigned long slack = 0;
|
||||
u64 slack = 0;
|
||||
unsigned int busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
|
||||
unsigned long busy_end = 0;
|
||||
|
||||
|
|
@ -784,7 +784,7 @@ static int do_poll(unsigned int nfds, struct poll_list *list,
|
|||
poll_table* pt = &wait->pt;
|
||||
ktime_t expire, *to = NULL;
|
||||
int timed_out = 0, count = 0;
|
||||
unsigned long slack = 0;
|
||||
u64 slack = 0;
|
||||
unsigned int busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
|
||||
unsigned long busy_end = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -198,6 +198,10 @@ static inline struct bpf_prog *bpf_prog_get(u32 ufd)
|
|||
static inline void bpf_prog_put(struct bpf_prog *prog)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void bpf_prog_put_rcu(struct bpf_prog *prog)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_BPF_SYSCALL */
|
||||
|
||||
/* verifier prototypes for helper functions called from eBPF programs */
|
||||
|
|
|
|||
|
|
@ -231,7 +231,7 @@ static inline long freezable_schedule_timeout_killable_unsafe(long timeout)
|
|||
* call this with locks held.
|
||||
*/
|
||||
static inline int freezable_schedule_hrtimeout_range(ktime_t *expires,
|
||||
unsigned long delta, const enum hrtimer_mode mode)
|
||||
u64 delta, const enum hrtimer_mode mode)
|
||||
{
|
||||
int __retval;
|
||||
freezer_do_not_count();
|
||||
|
|
|
|||
|
|
@ -220,7 +220,7 @@ static inline void hrtimer_set_expires_range(struct hrtimer *timer, ktime_t time
|
|||
timer->node.expires = ktime_add_safe(time, delta);
|
||||
}
|
||||
|
||||
static inline void hrtimer_set_expires_range_ns(struct hrtimer *timer, ktime_t time, unsigned long delta)
|
||||
static inline void hrtimer_set_expires_range_ns(struct hrtimer *timer, ktime_t time, u64 delta)
|
||||
{
|
||||
timer->_softexpires = time;
|
||||
timer->node.expires = ktime_add_safe(time, ns_to_ktime(delta));
|
||||
|
|
@ -378,7 +378,7 @@ static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { }
|
|||
|
||||
/* Basic timer operations: */
|
||||
extern void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
||||
unsigned long range_ns, const enum hrtimer_mode mode);
|
||||
u64 range_ns, const enum hrtimer_mode mode);
|
||||
|
||||
/**
|
||||
* hrtimer_start - (re)start an hrtimer on the current CPU
|
||||
|
|
@ -399,7 +399,7 @@ extern int hrtimer_try_to_cancel(struct hrtimer *timer);
|
|||
static inline void hrtimer_start_expires(struct hrtimer *timer,
|
||||
enum hrtimer_mode mode)
|
||||
{
|
||||
unsigned long delta;
|
||||
u64 delta;
|
||||
ktime_t soft, hard;
|
||||
soft = hrtimer_get_softexpires(timer);
|
||||
hard = hrtimer_get_expires(timer);
|
||||
|
|
@ -477,10 +477,12 @@ extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);
|
|||
extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
|
||||
struct task_struct *tsk);
|
||||
|
||||
extern int schedule_hrtimeout_range(ktime_t *expires, unsigned long delta,
|
||||
extern int schedule_hrtimeout_range(ktime_t *expires, u64 delta,
|
||||
const enum hrtimer_mode mode);
|
||||
extern int schedule_hrtimeout_range_clock(ktime_t *expires,
|
||||
unsigned long delta, const enum hrtimer_mode mode, int clock);
|
||||
u64 delta,
|
||||
const enum hrtimer_mode mode,
|
||||
int clock);
|
||||
extern int schedule_hrtimeout(ktime_t *expires, const enum hrtimer_mode mode);
|
||||
|
||||
/* Soft interrupt function to run the hrtimer queues: */
|
||||
|
|
|
|||
|
|
@ -251,7 +251,8 @@ do { \
|
|||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) && \
|
||||
net_ratelimit()) \
|
||||
__dynamic_pr_debug(&descriptor, fmt, ##__VA_ARGS__); \
|
||||
__dynamic_pr_debug(&descriptor, pr_fmt(fmt), \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
#elif defined(DEBUG)
|
||||
#define net_dbg_ratelimited(fmt, ...) \
|
||||
|
|
|
|||
|
|
@ -573,6 +573,7 @@ struct dev_pm_info {
|
|||
struct wakeup_source *wakeup;
|
||||
bool wakeup_path:1;
|
||||
bool syscore:1;
|
||||
bool no_pm_callbacks:1; /* Owned by the PM core */
|
||||
#else
|
||||
unsigned int should_wakeup:1;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ extern void poll_initwait(struct poll_wqueues *pwq);
|
|||
extern void poll_freewait(struct poll_wqueues *pwq);
|
||||
extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
|
||||
ktime_t *expires, unsigned long slack);
|
||||
extern long select_estimate_accuracy(struct timespec *tv);
|
||||
extern u64 select_estimate_accuracy(struct timespec *tv);
|
||||
|
||||
|
||||
static inline int poll_schedule(struct poll_wqueues *pwq, int state)
|
||||
|
|
|
|||
|
|
@ -1799,8 +1799,8 @@ struct task_struct {
|
|||
* time slack values; these are used to round up poll() and
|
||||
* select() etc timeout values. These are in nanoseconds.
|
||||
*/
|
||||
unsigned long timer_slack_ns;
|
||||
unsigned long default_timer_slack_ns;
|
||||
u64 timer_slack_ns;
|
||||
u64 default_timer_slack_ns;
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
unsigned int kasan_depth;
|
||||
|
|
|
|||
|
|
@ -2564,6 +2564,13 @@ static inline int skb_clone_writable(const struct sk_buff *skb, unsigned int len
|
|||
skb_headroom(skb) + len <= skb->hdr_len;
|
||||
}
|
||||
|
||||
static inline int skb_try_make_writable(struct sk_buff *skb,
|
||||
unsigned int write_len)
|
||||
{
|
||||
return skb_cloned(skb) && !skb_clone_writable(skb, write_len) &&
|
||||
pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom,
|
||||
int cloned)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -36,6 +36,9 @@ enum sknetlink_groups sock_diag_destroy_group(const struct sock *sk)
|
|||
{
|
||||
switch (sk->sk_family) {
|
||||
case AF_INET:
|
||||
if (sk->sk_type == SOCK_RAW)
|
||||
return SKNLGRP_NONE;
|
||||
|
||||
switch (sk->sk_protocol) {
|
||||
case IPPROTO_TCP:
|
||||
return SKNLGRP_INET_TCP_DESTROY;
|
||||
|
|
@ -45,6 +48,9 @@ enum sknetlink_groups sock_diag_destroy_group(const struct sock *sk)
|
|||
return SKNLGRP_NONE;
|
||||
}
|
||||
case AF_INET6:
|
||||
if (sk->sk_type == SOCK_RAW)
|
||||
return SKNLGRP_NONE;
|
||||
|
||||
switch (sk->sk_protocol) {
|
||||
case IPPROTO_TCP:
|
||||
return SKNLGRP_INET6_TCP_DESTROY;
|
||||
|
|
|
|||
|
|
@ -627,6 +627,7 @@ void __weak arch_enable_nonboot_cpus_end(void)
|
|||
void enable_nonboot_cpus(void)
|
||||
{
|
||||
int cpu, error;
|
||||
struct device *cpu_device;
|
||||
|
||||
/* Allow everyone to use the CPU hotplug again */
|
||||
cpu_maps_update_begin();
|
||||
|
|
@ -644,6 +645,12 @@ void enable_nonboot_cpus(void)
|
|||
trace_suspend_resume(TPS("CPU_ON"), cpu, false);
|
||||
if (!error) {
|
||||
pr_info("CPU%d is up\n", cpu);
|
||||
cpu_device = get_cpu_device(cpu);
|
||||
if (!cpu_device)
|
||||
pr_err("%s: failed to get cpu%d device\n",
|
||||
__func__, cpu);
|
||||
else
|
||||
kobject_uevent(&cpu_device->kobj, KOBJ_ONLINE);
|
||||
continue;
|
||||
}
|
||||
pr_warn("Error taking CPU%d up: %d\n", cpu, error);
|
||||
|
|
|
|||
|
|
@ -7231,7 +7231,7 @@ static void perf_event_free_bpf_prog(struct perf_event *event)
|
|||
prog = event->tp_event->prog;
|
||||
if (prog) {
|
||||
event->tp_event->prog = NULL;
|
||||
bpf_prog_put(prog);
|
||||
bpf_prog_put_rcu(prog);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2319,7 +2319,10 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
|
|||
error = perf_event_task_enable();
|
||||
break;
|
||||
case PR_GET_TIMERSLACK:
|
||||
error = current->timer_slack_ns;
|
||||
if (current->timer_slack_ns > ULONG_MAX)
|
||||
error = ULONG_MAX;
|
||||
else
|
||||
error = current->timer_slack_ns;
|
||||
break;
|
||||
case PR_SET_TIMERSLACK:
|
||||
if (arg2 <= 0)
|
||||
|
|
|
|||
|
|
@ -979,7 +979,7 @@ static inline ktime_t hrtimer_update_lowres(struct hrtimer *timer, ktime_t tim,
|
|||
* relative (HRTIMER_MODE_REL)
|
||||
*/
|
||||
void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
||||
unsigned long delta_ns, const enum hrtimer_mode mode)
|
||||
u64 delta_ns, const enum hrtimer_mode mode)
|
||||
{
|
||||
struct hrtimer_clock_base *base, *new_base;
|
||||
unsigned long flags;
|
||||
|
|
@ -1548,7 +1548,7 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
|
|||
struct restart_block *restart;
|
||||
struct hrtimer_sleeper t;
|
||||
int ret = 0;
|
||||
unsigned long slack;
|
||||
u64 slack;
|
||||
|
||||
slack = current->timer_slack_ns;
|
||||
if (dl_task(current) || rt_task(current))
|
||||
|
|
@ -1724,7 +1724,7 @@ void __init hrtimers_init(void)
|
|||
* @clock: timer clock, CLOCK_MONOTONIC or CLOCK_REALTIME
|
||||
*/
|
||||
int __sched
|
||||
schedule_hrtimeout_range_clock(ktime_t *expires, unsigned long delta,
|
||||
schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta,
|
||||
const enum hrtimer_mode mode, int clock)
|
||||
{
|
||||
struct hrtimer_sleeper t;
|
||||
|
|
@ -1792,7 +1792,7 @@ schedule_hrtimeout_range_clock(ktime_t *expires, unsigned long delta,
|
|||
*
|
||||
* Returns 0 when the timer has expired otherwise -EINTR
|
||||
*/
|
||||
int __sched schedule_hrtimeout_range(ktime_t *expires, unsigned long delta,
|
||||
int __sched schedule_hrtimeout_range(ktime_t *expires, u64 delta,
|
||||
const enum hrtimer_mode mode)
|
||||
{
|
||||
return schedule_hrtimeout_range_clock(expires, delta, mode,
|
||||
|
|
|
|||
|
|
@ -1698,10 +1698,10 @@ EXPORT_SYMBOL(msleep_interruptible);
|
|||
static void __sched do_usleep_range(unsigned long min, unsigned long max)
|
||||
{
|
||||
ktime_t kmin;
|
||||
unsigned long delta;
|
||||
u64 delta;
|
||||
|
||||
kmin = ktime_set(0, min * NSEC_PER_USEC);
|
||||
delta = (max - min) * NSEC_PER_USEC;
|
||||
delta = (u64)(max - min) * NSEC_PER_USEC;
|
||||
schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -976,7 +976,8 @@ static int ax25_release(struct socket *sock)
|
|||
release_sock(sk);
|
||||
ax25_disconnect(ax25, 0);
|
||||
lock_sock(sk);
|
||||
ax25_destroy_socket(ax25);
|
||||
if (!sock_flag(ax25->sk, SOCK_DESTROY))
|
||||
ax25_destroy_socket(ax25);
|
||||
break;
|
||||
|
||||
case AX25_STATE_3:
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25)
|
|||
switch (ax25->state) {
|
||||
|
||||
case AX25_STATE_0:
|
||||
case AX25_STATE_2:
|
||||
/* Magic here: If we listen() and a new link dies before it
|
||||
is accepted() it isn't 'dead' so doesn't get removed. */
|
||||
if (!sk || sock_flag(sk, SOCK_DESTROY) ||
|
||||
|
|
@ -111,6 +112,7 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25)
|
|||
sock_hold(sk);
|
||||
ax25_destroy_socket(ax25);
|
||||
bh_unlock_sock(sk);
|
||||
/* Ungrab socket and destroy it */
|
||||
sock_put(sk);
|
||||
} else
|
||||
ax25_destroy_socket(ax25);
|
||||
|
|
@ -213,7 +215,8 @@ void ax25_ds_t1_timeout(ax25_cb *ax25)
|
|||
case AX25_STATE_2:
|
||||
if (ax25->n2count == ax25->n2) {
|
||||
ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
|
||||
ax25_disconnect(ax25, ETIMEDOUT);
|
||||
if (!sock_flag(ax25->sk, SOCK_DESTROY))
|
||||
ax25_disconnect(ax25, ETIMEDOUT);
|
||||
return;
|
||||
} else {
|
||||
ax25->n2count++;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ void ax25_std_heartbeat_expiry(ax25_cb *ax25)
|
|||
|
||||
switch (ax25->state) {
|
||||
case AX25_STATE_0:
|
||||
case AX25_STATE_2:
|
||||
/* Magic here: If we listen() and a new link dies before it
|
||||
is accepted() it isn't 'dead' so doesn't get removed. */
|
||||
if (!sk || sock_flag(sk, SOCK_DESTROY) ||
|
||||
|
|
@ -47,6 +48,7 @@ void ax25_std_heartbeat_expiry(ax25_cb *ax25)
|
|||
sock_hold(sk);
|
||||
ax25_destroy_socket(ax25);
|
||||
bh_unlock_sock(sk);
|
||||
/* Ungrab socket and destroy it */
|
||||
sock_put(sk);
|
||||
} else
|
||||
ax25_destroy_socket(ax25);
|
||||
|
|
@ -144,7 +146,8 @@ void ax25_std_t1timer_expiry(ax25_cb *ax25)
|
|||
case AX25_STATE_2:
|
||||
if (ax25->n2count == ax25->n2) {
|
||||
ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
|
||||
ax25_disconnect(ax25, ETIMEDOUT);
|
||||
if (!sock_flag(ax25->sk, SOCK_DESTROY))
|
||||
ax25_disconnect(ax25, ETIMEDOUT);
|
||||
return;
|
||||
} else {
|
||||
ax25->n2count++;
|
||||
|
|
|
|||
|
|
@ -264,7 +264,8 @@ void ax25_disconnect(ax25_cb *ax25, int reason)
|
|||
{
|
||||
ax25_clear_queues(ax25);
|
||||
|
||||
ax25_stop_heartbeat(ax25);
|
||||
if (!sock_flag(ax25->sk, SOCK_DESTROY))
|
||||
ax25_stop_heartbeat(ax25);
|
||||
ax25_stop_t1timer(ax25);
|
||||
ax25_stop_t2timer(ax25);
|
||||
ax25_stop_t3timer(ax25);
|
||||
|
|
|
|||
|
|
@ -464,8 +464,11 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br,
|
|||
if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0,
|
||||
&ip6h->saddr)) {
|
||||
kfree_skb(skb);
|
||||
br->has_ipv6_addr = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
br->has_ipv6_addr = 1;
|
||||
ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest);
|
||||
|
||||
hopopt = (u8 *)(ip6h + 1);
|
||||
|
|
@ -1736,6 +1739,7 @@ void br_multicast_init(struct net_bridge *br)
|
|||
br->ip6_other_query.delay_time = 0;
|
||||
br->ip6_querier.port = NULL;
|
||||
#endif
|
||||
br->has_ipv6_addr = 1;
|
||||
|
||||
spin_lock_init(&br->multicast_lock);
|
||||
setup_timer(&br->multicast_router_timer,
|
||||
|
|
|
|||
|
|
@ -301,6 +301,7 @@ struct net_bridge
|
|||
u8 multicast_disabled:1;
|
||||
u8 multicast_querier:1;
|
||||
u8 multicast_query_use_ifaddr:1;
|
||||
u8 has_ipv6_addr:1;
|
||||
|
||||
u32 hash_elasticity;
|
||||
u32 hash_max;
|
||||
|
|
@ -574,10 +575,22 @@ static inline bool br_multicast_is_router(struct net_bridge *br)
|
|||
|
||||
static inline bool
|
||||
__br_multicast_querier_exists(struct net_bridge *br,
|
||||
struct bridge_mcast_other_query *querier)
|
||||
struct bridge_mcast_other_query *querier,
|
||||
const bool is_ipv6)
|
||||
{
|
||||
bool own_querier_enabled;
|
||||
|
||||
if (br->multicast_querier) {
|
||||
if (is_ipv6 && !br->has_ipv6_addr)
|
||||
own_querier_enabled = false;
|
||||
else
|
||||
own_querier_enabled = true;
|
||||
} else {
|
||||
own_querier_enabled = false;
|
||||
}
|
||||
|
||||
return time_is_before_jiffies(querier->delay_time) &&
|
||||
(br->multicast_querier || timer_pending(&querier->timer));
|
||||
(own_querier_enabled || timer_pending(&querier->timer));
|
||||
}
|
||||
|
||||
static inline bool br_multicast_querier_exists(struct net_bridge *br,
|
||||
|
|
@ -585,10 +598,12 @@ static inline bool br_multicast_querier_exists(struct net_bridge *br,
|
|||
{
|
||||
switch (eth->h_proto) {
|
||||
case (htons(ETH_P_IP)):
|
||||
return __br_multicast_querier_exists(br, &br->ip4_other_query);
|
||||
return __br_multicast_querier_exists(br,
|
||||
&br->ip4_other_query, false);
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
case (htons(ETH_P_IPV6)):
|
||||
return __br_multicast_querier_exists(br, &br->ip6_other_query);
|
||||
return __br_multicast_querier_exists(br,
|
||||
&br->ip6_other_query, true);
|
||||
#endif
|
||||
default:
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -1275,9 +1275,7 @@ static u64 bpf_skb_store_bytes(u64 r1, u64 r2, u64 r3, u64 r4, u64 flags)
|
|||
*/
|
||||
if (unlikely((u32) offset > 0xffff || len > sizeof(buf)))
|
||||
return -EFAULT;
|
||||
|
||||
if (unlikely(skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, offset + len)))
|
||||
if (unlikely(skb_try_make_writable(skb, offset + len)))
|
||||
return -EFAULT;
|
||||
|
||||
ptr = skb_header_pointer(skb, offset, len, buf);
|
||||
|
|
@ -1321,8 +1319,7 @@ static u64 bpf_l3_csum_replace(u64 r1, u64 r2, u64 from, u64 to, u64 flags)
|
|||
if (unlikely((u32) offset > 0xffff))
|
||||
return -EFAULT;
|
||||
|
||||
if (unlikely(skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, offset + sizeof(sum))))
|
||||
if (unlikely(skb_try_make_writable(skb, offset + sizeof(sum))))
|
||||
return -EFAULT;
|
||||
|
||||
ptr = skb_header_pointer(skb, offset, sizeof(sum), &sum);
|
||||
|
|
@ -1367,9 +1364,7 @@ static u64 bpf_l4_csum_replace(u64 r1, u64 r2, u64 from, u64 to, u64 flags)
|
|||
|
||||
if (unlikely((u32) offset > 0xffff))
|
||||
return -EFAULT;
|
||||
|
||||
if (unlikely(skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, offset + sizeof(sum))))
|
||||
if (unlikely(skb_try_make_writable(skb, offset + sizeof(sum))))
|
||||
return -EFAULT;
|
||||
|
||||
ptr = skb_header_pointer(skb, offset, sizeof(sum), &sum);
|
||||
|
|
@ -1554,6 +1549,13 @@ bool bpf_helper_changes_skb_data(void *func)
|
|||
return true;
|
||||
if (func == bpf_skb_vlan_pop)
|
||||
return true;
|
||||
if (func == bpf_skb_store_bytes)
|
||||
return true;
|
||||
if (func == bpf_l3_csum_replace)
|
||||
return true;
|
||||
if (func == bpf_l4_csum_replace)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2467,13 +2467,17 @@ int neigh_xmit(int index, struct net_device *dev,
|
|||
tbl = neigh_tables[index];
|
||||
if (!tbl)
|
||||
goto out;
|
||||
rcu_read_lock_bh();
|
||||
neigh = __neigh_lookup_noref(tbl, addr, dev);
|
||||
if (!neigh)
|
||||
neigh = __neigh_create(tbl, addr, dev, false);
|
||||
err = PTR_ERR(neigh);
|
||||
if (IS_ERR(neigh))
|
||||
if (IS_ERR(neigh)) {
|
||||
rcu_read_unlock_bh();
|
||||
goto out_kfree_skb;
|
||||
}
|
||||
err = neigh->output(neigh, skb);
|
||||
rcu_read_unlock_bh();
|
||||
}
|
||||
else if (index == NEIGH_LINK_TABLE) {
|
||||
err = dev_hard_header(skb, dev, ntohs(skb->protocol),
|
||||
|
|
|
|||
|
|
@ -23,6 +23,11 @@ struct esp_skb_cb {
|
|||
void *tmp;
|
||||
};
|
||||
|
||||
struct esp_output_extra {
|
||||
__be32 seqhi;
|
||||
u32 esphoff;
|
||||
};
|
||||
|
||||
#define ESP_SKB_CB(__skb) ((struct esp_skb_cb *)&((__skb)->cb[0]))
|
||||
|
||||
static u32 esp4_get_mtu(struct xfrm_state *x, int mtu);
|
||||
|
|
@ -35,11 +40,11 @@ static u32 esp4_get_mtu(struct xfrm_state *x, int mtu);
|
|||
*
|
||||
* TODO: Use spare space in skb for this where possible.
|
||||
*/
|
||||
static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int seqhilen)
|
||||
static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int extralen)
|
||||
{
|
||||
unsigned int len;
|
||||
|
||||
len = seqhilen;
|
||||
len = extralen;
|
||||
|
||||
len += crypto_aead_ivsize(aead);
|
||||
|
||||
|
|
@ -57,15 +62,16 @@ static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int seqhilen)
|
|||
return kmalloc(len, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
static inline __be32 *esp_tmp_seqhi(void *tmp)
|
||||
static inline void *esp_tmp_extra(void *tmp)
|
||||
{
|
||||
return PTR_ALIGN((__be32 *)tmp, __alignof__(__be32));
|
||||
return PTR_ALIGN(tmp, __alignof__(struct esp_output_extra));
|
||||
}
|
||||
static inline u8 *esp_tmp_iv(struct crypto_aead *aead, void *tmp, int seqhilen)
|
||||
|
||||
static inline u8 *esp_tmp_iv(struct crypto_aead *aead, void *tmp, int extralen)
|
||||
{
|
||||
return crypto_aead_ivsize(aead) ?
|
||||
PTR_ALIGN((u8 *)tmp + seqhilen,
|
||||
crypto_aead_alignmask(aead) + 1) : tmp + seqhilen;
|
||||
PTR_ALIGN((u8 *)tmp + extralen,
|
||||
crypto_aead_alignmask(aead) + 1) : tmp + extralen;
|
||||
}
|
||||
|
||||
static inline struct aead_request *esp_tmp_req(struct crypto_aead *aead, u8 *iv)
|
||||
|
|
@ -99,7 +105,7 @@ static void esp_restore_header(struct sk_buff *skb, unsigned int offset)
|
|||
{
|
||||
struct ip_esp_hdr *esph = (void *)(skb->data + offset);
|
||||
void *tmp = ESP_SKB_CB(skb)->tmp;
|
||||
__be32 *seqhi = esp_tmp_seqhi(tmp);
|
||||
__be32 *seqhi = esp_tmp_extra(tmp);
|
||||
|
||||
esph->seq_no = esph->spi;
|
||||
esph->spi = *seqhi;
|
||||
|
|
@ -107,7 +113,11 @@ static void esp_restore_header(struct sk_buff *skb, unsigned int offset)
|
|||
|
||||
static void esp_output_restore_header(struct sk_buff *skb)
|
||||
{
|
||||
esp_restore_header(skb, skb_transport_offset(skb) - sizeof(__be32));
|
||||
void *tmp = ESP_SKB_CB(skb)->tmp;
|
||||
struct esp_output_extra *extra = esp_tmp_extra(tmp);
|
||||
|
||||
esp_restore_header(skb, skb_transport_offset(skb) + extra->esphoff -
|
||||
sizeof(__be32));
|
||||
}
|
||||
|
||||
static void esp_output_done_esn(struct crypto_async_request *base, int err)
|
||||
|
|
@ -121,6 +131,7 @@ static void esp_output_done_esn(struct crypto_async_request *base, int err)
|
|||
static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
|
||||
{
|
||||
int err;
|
||||
struct esp_output_extra *extra;
|
||||
struct ip_esp_hdr *esph;
|
||||
struct crypto_aead *aead;
|
||||
struct aead_request *req;
|
||||
|
|
@ -137,8 +148,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
|
|||
int tfclen;
|
||||
int nfrags;
|
||||
int assoclen;
|
||||
int seqhilen;
|
||||
__be32 *seqhi;
|
||||
int extralen;
|
||||
__be64 seqno;
|
||||
|
||||
/* skb is pure payload to encrypt */
|
||||
|
|
@ -166,21 +176,21 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
|
|||
nfrags = err;
|
||||
|
||||
assoclen = sizeof(*esph);
|
||||
seqhilen = 0;
|
||||
extralen = 0;
|
||||
|
||||
if (x->props.flags & XFRM_STATE_ESN) {
|
||||
seqhilen += sizeof(__be32);
|
||||
assoclen += seqhilen;
|
||||
extralen += sizeof(*extra);
|
||||
assoclen += sizeof(__be32);
|
||||
}
|
||||
|
||||
tmp = esp_alloc_tmp(aead, nfrags, seqhilen);
|
||||
tmp = esp_alloc_tmp(aead, nfrags, extralen);
|
||||
if (!tmp) {
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
seqhi = esp_tmp_seqhi(tmp);
|
||||
iv = esp_tmp_iv(aead, tmp, seqhilen);
|
||||
extra = esp_tmp_extra(tmp);
|
||||
iv = esp_tmp_iv(aead, tmp, extralen);
|
||||
req = esp_tmp_req(aead, iv);
|
||||
sg = esp_req_sg(aead, req);
|
||||
|
||||
|
|
@ -247,8 +257,10 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
|
|||
* encryption.
|
||||
*/
|
||||
if ((x->props.flags & XFRM_STATE_ESN)) {
|
||||
esph = (void *)(skb_transport_header(skb) - sizeof(__be32));
|
||||
*seqhi = esph->spi;
|
||||
extra->esphoff = (unsigned char *)esph -
|
||||
skb_transport_header(skb);
|
||||
esph = (struct ip_esp_hdr *)((unsigned char *)esph - 4);
|
||||
extra->seqhi = esph->spi;
|
||||
esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.hi);
|
||||
aead_request_set_callback(req, 0, esp_output_done_esn, skb);
|
||||
}
|
||||
|
|
@ -445,7 +457,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
|
|||
goto out;
|
||||
|
||||
ESP_SKB_CB(skb)->tmp = tmp;
|
||||
seqhi = esp_tmp_seqhi(tmp);
|
||||
seqhi = esp_tmp_extra(tmp);
|
||||
iv = esp_tmp_iv(aead, tmp, seqhilen);
|
||||
req = esp_tmp_req(aead, iv);
|
||||
sg = esp_req_sg(aead, req);
|
||||
|
|
|
|||
|
|
@ -882,8 +882,10 @@ static struct mfc_cache *ipmr_cache_alloc(void)
|
|||
{
|
||||
struct mfc_cache *c = kmem_cache_zalloc(mrt_cachep, GFP_KERNEL);
|
||||
|
||||
if (c)
|
||||
if (c) {
|
||||
c->mfc_un.res.last_assert = jiffies - MFC_ASSERT_THRESH - 1;
|
||||
c->mfc_un.res.minvif = MAXVIFS;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1074,6 +1074,7 @@ static struct mfc6_cache *ip6mr_cache_alloc(void)
|
|||
struct mfc6_cache *c = kmem_cache_zalloc(mrt_cachep, GFP_KERNEL);
|
||||
if (!c)
|
||||
return NULL;
|
||||
c->mfc_un.res.last_assert = jiffies - MFC_ASSERT_THRESH - 1;
|
||||
c->mfc_un.res.minvif = MAXMIFS;
|
||||
return c;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -560,13 +560,13 @@ static int ipip6_err(struct sk_buff *skb, u32 info)
|
|||
|
||||
if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
|
||||
ipv4_update_pmtu(skb, dev_net(skb->dev), info,
|
||||
t->parms.link, 0, IPPROTO_IPV6, 0);
|
||||
t->parms.link, 0, iph->protocol, 0);
|
||||
err = 0;
|
||||
goto out;
|
||||
}
|
||||
if (type == ICMP_REDIRECT) {
|
||||
ipv4_redirect(skb, dev_net(skb->dev), t->parms.link, 0,
|
||||
IPPROTO_IPV6, 0);
|
||||
iph->protocol, 0);
|
||||
err = 0;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1354,7 +1354,6 @@ config NETFILTER_XT_MATCH_QUOTA2
|
|||
config NETFILTER_XT_MATCH_QUOTA2_LOG
|
||||
bool '"quota2" Netfilter LOG support'
|
||||
depends on NETFILTER_XT_MATCH_QUOTA2
|
||||
depends on IP_NF_TARGET_ULOG=n # not yes, not module, just no
|
||||
default n
|
||||
help
|
||||
This option allows `quota2' to log ONCE when a quota limit
|
||||
|
|
|
|||
|
|
@ -21,8 +21,27 @@
|
|||
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/xt_quota2.h>
|
||||
|
||||
#ifdef CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG
|
||||
#include <linux/netfilter_ipv4/ipt_ULOG.h>
|
||||
/* For compatibility, these definitions are copied from the
|
||||
* deprecated header file <linux/netfilter_ipv4/ipt_ULOG.h> */
|
||||
#define ULOG_MAC_LEN 80
|
||||
#define ULOG_PREFIX_LEN 32
|
||||
|
||||
/* Format of the ULOG packets passed through netlink */
|
||||
typedef struct ulog_packet_msg {
|
||||
unsigned long mark;
|
||||
long timestamp_sec;
|
||||
long timestamp_usec;
|
||||
unsigned int hook;
|
||||
char indev_name[IFNAMSIZ];
|
||||
char outdev_name[IFNAMSIZ];
|
||||
size_t data_len;
|
||||
char prefix[ULOG_PREFIX_LEN];
|
||||
unsigned char mac_len;
|
||||
unsigned char mac[ULOG_MAC_LEN];
|
||||
unsigned char payload[0];
|
||||
} ulog_packet_msg_t;
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -105,9 +105,7 @@ static void *tcf_csum_skb_nextlayer(struct sk_buff *skb,
|
|||
int hl = ihl + jhl;
|
||||
|
||||
if (!pskb_may_pull(skb, ipl + ntkoff) || (ipl < hl) ||
|
||||
(skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, hl + ntkoff) &&
|
||||
pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
|
||||
skb_try_make_writable(skb, hl + ntkoff))
|
||||
return NULL;
|
||||
else
|
||||
return (void *)(skb_network_header(skb) + ihl);
|
||||
|
|
@ -365,9 +363,7 @@ static int tcf_csum_ipv4(struct sk_buff *skb, u32 update_flags)
|
|||
}
|
||||
|
||||
if (update_flags & TCA_CSUM_UPDATE_FLAG_IPV4HDR) {
|
||||
if (skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, sizeof(*iph) + ntkoff) &&
|
||||
pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
|
||||
if (skb_try_make_writable(skb, sizeof(*iph) + ntkoff))
|
||||
goto fail;
|
||||
|
||||
ip_send_check(ip_hdr(skb));
|
||||
|
|
|
|||
|
|
@ -126,9 +126,7 @@ static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,
|
|||
addr = iph->daddr;
|
||||
|
||||
if (!((old_addr ^ addr) & mask)) {
|
||||
if (skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, sizeof(*iph) + noff) &&
|
||||
pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
|
||||
if (skb_try_make_writable(skb, sizeof(*iph) + noff))
|
||||
goto drop;
|
||||
|
||||
new_addr &= mask;
|
||||
|
|
@ -156,9 +154,7 @@ static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,
|
|||
struct tcphdr *tcph;
|
||||
|
||||
if (!pskb_may_pull(skb, ihl + sizeof(*tcph) + noff) ||
|
||||
(skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, ihl + sizeof(*tcph) + noff) &&
|
||||
pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
|
||||
skb_try_make_writable(skb, ihl + sizeof(*tcph) + noff))
|
||||
goto drop;
|
||||
|
||||
tcph = (void *)(skb_network_header(skb) + ihl);
|
||||
|
|
@ -171,9 +167,7 @@ static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,
|
|||
struct udphdr *udph;
|
||||
|
||||
if (!pskb_may_pull(skb, ihl + sizeof(*udph) + noff) ||
|
||||
(skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, ihl + sizeof(*udph) + noff) &&
|
||||
pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
|
||||
skb_try_make_writable(skb, ihl + sizeof(*udph) + noff))
|
||||
goto drop;
|
||||
|
||||
udph = (void *)(skb_network_header(skb) + ihl);
|
||||
|
|
@ -213,10 +207,8 @@ static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,
|
|||
if ((old_addr ^ addr) & mask)
|
||||
break;
|
||||
|
||||
if (skb_cloned(skb) &&
|
||||
!skb_clone_writable(skb, ihl + sizeof(*icmph) +
|
||||
sizeof(*iph) + noff) &&
|
||||
pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
|
||||
if (skb_try_make_writable(skb, ihl + sizeof(*icmph) +
|
||||
sizeof(*iph) + noff))
|
||||
goto drop;
|
||||
|
||||
icmph = (void *)(skb_network_header(skb) + ihl);
|
||||
|
|
|
|||
|
|
@ -37,14 +37,18 @@ static int pfifo_enqueue(struct sk_buff *skb, struct Qdisc *sch)
|
|||
|
||||
static int pfifo_tail_enqueue(struct sk_buff *skb, struct Qdisc *sch)
|
||||
{
|
||||
unsigned int prev_backlog;
|
||||
|
||||
if (likely(skb_queue_len(&sch->q) < sch->limit))
|
||||
return qdisc_enqueue_tail(skb, sch);
|
||||
|
||||
prev_backlog = sch->qstats.backlog;
|
||||
/* queue full, remove one skb to fulfill the limit */
|
||||
__qdisc_queue_drop_head(sch, &sch->q);
|
||||
qdisc_qstats_drop(sch);
|
||||
qdisc_enqueue_tail(skb, sch);
|
||||
|
||||
qdisc_tree_reduce_backlog(sch, 0, prev_backlog - sch->qstats.backlog);
|
||||
return NET_XMIT_CN;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -650,14 +650,14 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch)
|
|||
#endif
|
||||
|
||||
if (q->qdisc) {
|
||||
unsigned int pkt_len = qdisc_pkt_len(skb);
|
||||
int err = qdisc_enqueue(skb, q->qdisc);
|
||||
|
||||
if (unlikely(err != NET_XMIT_SUCCESS)) {
|
||||
if (net_xmit_drop_count(err)) {
|
||||
qdisc_qstats_drop(sch);
|
||||
qdisc_tree_reduce_backlog(sch, 1,
|
||||
qdisc_pkt_len(skb));
|
||||
}
|
||||
if (err != NET_XMIT_SUCCESS &&
|
||||
net_xmit_drop_count(err)) {
|
||||
qdisc_qstats_drop(sch);
|
||||
qdisc_tree_reduce_backlog(sch, 1,
|
||||
pkt_len);
|
||||
}
|
||||
goto tfifo_dequeue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1247,6 +1247,7 @@ static void snd_timer_user_ccallback(struct snd_timer_instance *timeri,
|
|||
tu->tstamp = *tstamp;
|
||||
if ((tu->filter & (1 << event)) == 0 || !tu->tread)
|
||||
return;
|
||||
memset(&r1, 0, sizeof(r1));
|
||||
r1.event = event;
|
||||
r1.tstamp = *tstamp;
|
||||
r1.val = resolution;
|
||||
|
|
@ -1281,6 +1282,7 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
|
|||
}
|
||||
if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) &&
|
||||
tu->last_resolution != resolution) {
|
||||
memset(&r1, 0, sizeof(r1));
|
||||
r1.event = SNDRV_TIMER_EVENT_RESOLUTION;
|
||||
r1.tstamp = tstamp;
|
||||
r1.val = resolution;
|
||||
|
|
@ -1746,6 +1748,7 @@ static int snd_timer_user_params(struct file *file,
|
|||
if (tu->timeri->flags & SNDRV_TIMER_IFLG_EARLY_EVENT) {
|
||||
if (tu->tread) {
|
||||
struct snd_timer_tread tread;
|
||||
memset(&tread, 0, sizeof(tread));
|
||||
tread.event = SNDRV_TIMER_EVENT_EARLY;
|
||||
tread.tstamp.tv_sec = 0;
|
||||
tread.tstamp.tv_nsec = 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user