Merge remote-tracking branch 'common/android-4.9' into hikey-4.9

Change-Id: I597ae4c0264cb498b3a76901316ec8e5a3ac1a0a
This commit is contained in:
Dmitry Shmidt
2017-12-18 11:01:46 -08:00
30 changed files with 190 additions and 181 deletions
+12 -11
View File
@@ -1,6 +1,6 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 9 PATCHLEVEL = 9
SUBLEVEL = 69 SUBLEVEL = 70
EXTRAVERSION = EXTRAVERSION =
NAME = Roaring Lionus NAME = Roaring Lionus
@@ -370,9 +370,6 @@ LDFLAGS_MODULE =
CFLAGS_KERNEL = CFLAGS_KERNEL =
AFLAGS_KERNEL = AFLAGS_KERNEL =
LDFLAGS_vmlinux = LDFLAGS_vmlinux =
CFLAGS_GCOV := -fprofile-arcs -ftest-coverage -fno-tree-loop-im $(call cc-disable-warning,maybe-uninitialized,)
CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,)
# Use USERINCLUDE when you must reference the UAPI directories only. # Use USERINCLUDE when you must reference the UAPI directories only.
USERINCLUDE := \ USERINCLUDE := \
@@ -393,21 +390,19 @@ LINUXINCLUDE := \
LINUXINCLUDE += $(filter-out $(LINUXINCLUDE),$(USERINCLUDE)) LINUXINCLUDE += $(filter-out $(LINUXINCLUDE),$(USERINCLUDE))
KBUILD_CPPFLAGS := -D__KERNEL__ KBUILD_AFLAGS := -D__ASSEMBLY__
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common \ -fno-strict-aliasing -fno-common \
-Werror-implicit-function-declaration \ -Werror-implicit-function-declaration \
-Wno-format-security \ -Wno-format-security \
-std=gnu89 $(call cc-option,-fno-PIE) -std=gnu89
KBUILD_CPPFLAGS := -D__KERNEL__
KBUILD_AFLAGS_KERNEL := KBUILD_AFLAGS_KERNEL :=
KBUILD_CFLAGS_KERNEL := KBUILD_CFLAGS_KERNEL :=
KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
KBUILD_AFLAGS_MODULE := -DMODULE KBUILD_AFLAGS_MODULE := -DMODULE
KBUILD_CFLAGS_MODULE := -DMODULE KBUILD_CFLAGS_MODULE := -DMODULE
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
GCC_PLUGINS_CFLAGS :=
# Read KERNELRELEASE from include/config/kernel.release (if it exists) # Read KERNELRELEASE from include/config/kernel.release (if it exists)
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
@@ -420,7 +415,7 @@ export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KCOV CFLAGS_KASAN CFLAGS_UBSAN export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_KASAN CFLAGS_UBSAN
export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
@@ -620,6 +615,12 @@ endif
# Defaults to vmlinux, but the arch makefile usually adds further targets # Defaults to vmlinux, but the arch makefile usually adds further targets
all: vmlinux all: vmlinux
KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
KBUILD_AFLAGS += $(call cc-option,-fno-PIE)
CFLAGS_GCOV := -fprofile-arcs -ftest-coverage -fno-tree-loop-im $(call cc-disable-warning,maybe-uninitialized,)
CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,)
export CFLAGS_GCOV CFLAGS_KCOV
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default # The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
# values of the respective KBUILD_* variables # values of the respective KBUILD_* variables
ARCH_CPPFLAGS := ARCH_CPPFLAGS :=
+12 -5
View File
@@ -53,17 +53,25 @@ static inline __sum16 csum_fold(__wsum sum)
return (__force __sum16)(~((__force u32)sum + tmp) >> 16); return (__force __sum16)(~((__force u32)sum + tmp) >> 16);
} }
static inline u32 from64to32(u64 x)
{
/* add up 32-bit and 32-bit for 32+c bit */
x = (x & 0xffffffff) + (x >> 32);
/* add up carry.. */
x = (x & 0xffffffff) + (x >> 32);
return (u32)x;
}
static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len, static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len,
__u8 proto, __wsum sum) __u8 proto, __wsum sum)
{ {
#ifdef __powerpc64__ #ifdef __powerpc64__
unsigned long s = (__force u32)sum; u64 s = (__force u32)sum;
s += (__force u32)saddr; s += (__force u32)saddr;
s += (__force u32)daddr; s += (__force u32)daddr;
s += proto + len; s += proto + len;
s += (s >> 32); return (__force __wsum) from64to32(s);
return (__force __wsum) s;
#else #else
__asm__("\n\ __asm__("\n\
addc %0,%0,%1 \n\ addc %0,%0,%1 \n\
@@ -123,8 +131,7 @@ static inline __wsum ip_fast_csum_nofold(const void *iph, unsigned int ihl)
for (i = 0; i < ihl - 1; i++, ptr++) for (i = 0; i < ihl - 1; i++, ptr++)
s += *ptr; s += *ptr;
s += (s >> 32); return (__force __wsum)from64to32(s);
return (__force __wsum)s;
#else #else
__wsum sum, tmp; __wsum sum, tmp;
+9 -10
View File
@@ -29,17 +29,16 @@ static inline void restore_access_regs(unsigned int *acrs)
} }
#define switch_to(prev,next,last) do { \ #define switch_to(prev,next,last) do { \
if (prev->mm) { \ /* save_fpu_regs() sets the CIF_FPU flag, which enforces \
save_fpu_regs(); \ * a restore of the floating point / vector registers as \
save_access_regs(&prev->thread.acrs[0]); \ * soon as the next task returns to user space \
save_ri_cb(prev->thread.ri_cb); \ */ \
} \ save_fpu_regs(); \
save_access_regs(&prev->thread.acrs[0]); \
save_ri_cb(prev->thread.ri_cb); \
update_cr_regs(next); \ update_cr_regs(next); \
if (next->mm) { \ restore_access_regs(&next->thread.acrs[0]); \
set_cpu_flag(CIF_FPU); \ restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb); \
restore_access_regs(&next->thread.acrs[0]); \
restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb); \
} \
prev = __switch_to(prev,next); \ prev = __switch_to(prev,next); \
} while (0) } while (0)
+23 -21
View File
@@ -241,6 +241,9 @@ struct smi_info {
/* The timer for this si. */ /* The timer for this si. */
struct timer_list si_timer; struct timer_list si_timer;
/* This flag is set, if the timer can be set */
bool timer_can_start;
/* This flag is set, if the timer is running (timer_pending() isn't enough) */ /* This flag is set, if the timer is running (timer_pending() isn't enough) */
bool timer_running; bool timer_running;
@@ -416,6 +419,8 @@ out:
static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val) static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val)
{ {
if (!smi_info->timer_can_start)
return;
smi_info->last_timeout_jiffies = jiffies; smi_info->last_timeout_jiffies = jiffies;
mod_timer(&smi_info->si_timer, new_val); mod_timer(&smi_info->si_timer, new_val);
smi_info->timer_running = true; smi_info->timer_running = true;
@@ -435,21 +440,18 @@ static void start_new_msg(struct smi_info *smi_info, unsigned char *msg,
smi_info->handlers->start_transaction(smi_info->si_sm, msg, size); smi_info->handlers->start_transaction(smi_info->si_sm, msg, size);
} }
static void start_check_enables(struct smi_info *smi_info, bool start_timer) static void start_check_enables(struct smi_info *smi_info)
{ {
unsigned char msg[2]; unsigned char msg[2];
msg[0] = (IPMI_NETFN_APP_REQUEST << 2); msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
msg[1] = IPMI_GET_BMC_GLOBAL_ENABLES_CMD; msg[1] = IPMI_GET_BMC_GLOBAL_ENABLES_CMD;
if (start_timer) start_new_msg(smi_info, msg, 2);
start_new_msg(smi_info, msg, 2);
else
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
smi_info->si_state = SI_CHECKING_ENABLES; smi_info->si_state = SI_CHECKING_ENABLES;
} }
static void start_clear_flags(struct smi_info *smi_info, bool start_timer) static void start_clear_flags(struct smi_info *smi_info)
{ {
unsigned char msg[3]; unsigned char msg[3];
@@ -458,10 +460,7 @@ static void start_clear_flags(struct smi_info *smi_info, bool start_timer)
msg[1] = IPMI_CLEAR_MSG_FLAGS_CMD; msg[1] = IPMI_CLEAR_MSG_FLAGS_CMD;
msg[2] = WDT_PRE_TIMEOUT_INT; msg[2] = WDT_PRE_TIMEOUT_INT;
if (start_timer) start_new_msg(smi_info, msg, 3);
start_new_msg(smi_info, msg, 3);
else
smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3);
smi_info->si_state = SI_CLEARING_FLAGS; smi_info->si_state = SI_CLEARING_FLAGS;
} }
@@ -496,11 +495,11 @@ static void start_getting_events(struct smi_info *smi_info)
* Note that we cannot just use disable_irq(), since the interrupt may * Note that we cannot just use disable_irq(), since the interrupt may
* be shared. * be shared.
*/ */
static inline bool disable_si_irq(struct smi_info *smi_info, bool start_timer) static inline bool disable_si_irq(struct smi_info *smi_info)
{ {
if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { if ((smi_info->irq) && (!smi_info->interrupt_disabled)) {
smi_info->interrupt_disabled = true; smi_info->interrupt_disabled = true;
start_check_enables(smi_info, start_timer); start_check_enables(smi_info);
return true; return true;
} }
return false; return false;
@@ -510,7 +509,7 @@ static inline bool enable_si_irq(struct smi_info *smi_info)
{ {
if ((smi_info->irq) && (smi_info->interrupt_disabled)) { if ((smi_info->irq) && (smi_info->interrupt_disabled)) {
smi_info->interrupt_disabled = false; smi_info->interrupt_disabled = false;
start_check_enables(smi_info, true); start_check_enables(smi_info);
return true; return true;
} }
return false; return false;
@@ -528,7 +527,7 @@ static struct ipmi_smi_msg *alloc_msg_handle_irq(struct smi_info *smi_info)
msg = ipmi_alloc_smi_msg(); msg = ipmi_alloc_smi_msg();
if (!msg) { if (!msg) {
if (!disable_si_irq(smi_info, true)) if (!disable_si_irq(smi_info))
smi_info->si_state = SI_NORMAL; smi_info->si_state = SI_NORMAL;
} else if (enable_si_irq(smi_info)) { } else if (enable_si_irq(smi_info)) {
ipmi_free_smi_msg(msg); ipmi_free_smi_msg(msg);
@@ -544,7 +543,7 @@ retry:
/* Watchdog pre-timeout */ /* Watchdog pre-timeout */
smi_inc_stat(smi_info, watchdog_pretimeouts); smi_inc_stat(smi_info, watchdog_pretimeouts);
start_clear_flags(smi_info, true); start_clear_flags(smi_info);
smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT;
if (smi_info->intf) if (smi_info->intf)
ipmi_smi_watchdog_pretimeout(smi_info->intf); ipmi_smi_watchdog_pretimeout(smi_info->intf);
@@ -927,7 +926,7 @@ restart:
* disable and messages disabled. * disable and messages disabled.
*/ */
if (smi_info->supports_event_msg_buff || smi_info->irq) { if (smi_info->supports_event_msg_buff || smi_info->irq) {
start_check_enables(smi_info, true); start_check_enables(smi_info);
} else { } else {
smi_info->curr_msg = alloc_msg_handle_irq(smi_info); smi_info->curr_msg = alloc_msg_handle_irq(smi_info);
if (!smi_info->curr_msg) if (!smi_info->curr_msg)
@@ -1234,6 +1233,7 @@ static int smi_start_processing(void *send_info,
/* Set up the timer that drives the interface. */ /* Set up the timer that drives the interface. */
setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi); setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi);
new_smi->timer_can_start = true;
smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES); smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES);
/* Try to claim any interrupts. */ /* Try to claim any interrupts. */
@@ -3448,10 +3448,12 @@ static void check_for_broken_irqs(struct smi_info *smi_info)
check_set_rcv_irq(smi_info); check_set_rcv_irq(smi_info);
} }
static inline void wait_for_timer_and_thread(struct smi_info *smi_info) static inline void stop_timer_and_thread(struct smi_info *smi_info)
{ {
if (smi_info->thread != NULL) if (smi_info->thread != NULL)
kthread_stop(smi_info->thread); kthread_stop(smi_info->thread);
smi_info->timer_can_start = false;
if (smi_info->timer_running) if (smi_info->timer_running)
del_timer_sync(&smi_info->si_timer); del_timer_sync(&smi_info->si_timer);
} }
@@ -3593,7 +3595,7 @@ static int try_smi_init(struct smi_info *new_smi)
* Start clearing the flags before we enable interrupts or the * Start clearing the flags before we enable interrupts or the
* timer to avoid racing with the timer. * timer to avoid racing with the timer.
*/ */
start_clear_flags(new_smi, false); start_clear_flags(new_smi);
/* /*
* IRQ is defined to be set when non-zero. req_events will * IRQ is defined to be set when non-zero. req_events will
@@ -3671,7 +3673,7 @@ static int try_smi_init(struct smi_info *new_smi)
return 0; return 0;
out_err_stop_timer: out_err_stop_timer:
wait_for_timer_and_thread(new_smi); stop_timer_and_thread(new_smi);
out_err: out_err:
new_smi->interrupt_disabled = true; new_smi->interrupt_disabled = true;
@@ -3865,7 +3867,7 @@ static void cleanup_one_si(struct smi_info *to_clean)
*/ */
if (to_clean->irq_cleanup) if (to_clean->irq_cleanup)
to_clean->irq_cleanup(to_clean); to_clean->irq_cleanup(to_clean);
wait_for_timer_and_thread(to_clean); stop_timer_and_thread(to_clean);
/* /*
* Timeouts are stopped, now make sure the interrupts are off * Timeouts are stopped, now make sure the interrupts are off
@@ -3876,7 +3878,7 @@ static void cleanup_one_si(struct smi_info *to_clean)
poll(to_clean); poll(to_clean);
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
} }
disable_si_irq(to_clean, false); disable_si_irq(to_clean);
while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) {
poll(to_clean); poll(to_clean);
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
+2 -2
View File
@@ -675,8 +675,8 @@ struct fw_ri_fr_nsmr_tpte_wr {
__u16 wrid; __u16 wrid;
__u8 r1[3]; __u8 r1[3];
__u8 len16; __u8 len16;
__u32 r2; __be32 r2;
__u32 stag; __be32 stag;
struct fw_ri_tpte tpte; struct fw_ri_tpte tpte;
__u64 pbl[2]; __u64 pbl[2];
}; };
+9
View File
@@ -2084,6 +2084,7 @@ int bitmap_resize(struct bitmap *bitmap, sector_t blocks,
for (k = 0; k < page; k++) { for (k = 0; k < page; k++) {
kfree(new_bp[k].map); kfree(new_bp[k].map);
} }
kfree(new_bp);
/* restore some fields from old_counts */ /* restore some fields from old_counts */
bitmap->counts.bp = old_counts.bp; bitmap->counts.bp = old_counts.bp;
@@ -2134,6 +2135,14 @@ int bitmap_resize(struct bitmap *bitmap, sector_t blocks,
block += old_blocks; block += old_blocks;
} }
if (bitmap->counts.bp != old_counts.bp) {
unsigned long k;
for (k = 0; k < old_counts.pages; k++)
if (!old_counts.bp[k].hijacked)
kfree(old_counts.bp[k].map);
kfree(old_counts.bp);
}
if (!init) { if (!init) {
int i; int i;
while (block < (chunks << chunkshift)) { while (block < (chunks << chunkshift)) {
@@ -1795,6 +1795,7 @@ static int stmmac_open(struct net_device *dev)
priv->dma_buf_sz = STMMAC_ALIGN(buf_sz); priv->dma_buf_sz = STMMAC_ALIGN(buf_sz);
priv->rx_copybreak = STMMAC_RX_COPYBREAK; priv->rx_copybreak = STMMAC_RX_COPYBREAK;
priv->mss = 0;
ret = alloc_dma_desc_resources(priv); ret = alloc_dma_desc_resources(priv);
if (ret < 0) { if (ret < 0) {
+1 -1
View File
@@ -404,7 +404,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb)
struct dst_entry *dst; struct dst_entry *dst;
int err, ret = NET_XMIT_DROP; int err, ret = NET_XMIT_DROP;
struct flowi6 fl6 = { struct flowi6 fl6 = {
.flowi6_iif = dev->ifindex, .flowi6_oif = dev->ifindex,
.daddr = ip6h->daddr, .daddr = ip6h->daddr,
.saddr = ip6h->saddr, .saddr = ip6h->saddr,
.flowi6_flags = FLOWI_FLAG_ANYSRC, .flowi6_flags = FLOWI_FLAG_ANYSRC,
+3
View File
@@ -74,9 +74,11 @@ static void qmi_wwan_netdev_setup(struct net_device *net)
net->hard_header_len = 0; net->hard_header_len = 0;
net->addr_len = 0; net->addr_len = 0;
net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
set_bit(EVENT_NO_IP_ALIGN, &dev->flags);
netdev_dbg(net, "mode: raw IP\n"); netdev_dbg(net, "mode: raw IP\n");
} else if (!net->header_ops) { /* don't bother if already set */ } else if (!net->header_ops) { /* don't bother if already set */
ether_setup(net); ether_setup(net);
clear_bit(EVENT_NO_IP_ALIGN, &dev->flags);
netdev_dbg(net, "mode: Ethernet\n"); netdev_dbg(net, "mode: Ethernet\n");
} }
@@ -936,6 +938,7 @@ static const struct usb_device_id products[] = {
{QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */ {QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */
{QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */
/* 4. Gobi 1000 devices */ /* 4. Gobi 1000 devices */
{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
+4 -1
View File
@@ -485,7 +485,10 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
return -ENOLINK; return -ENOLINK;
} }
skb = __netdev_alloc_skb_ip_align(dev->net, size, flags); if (test_bit(EVENT_NO_IP_ALIGN, &dev->flags))
skb = __netdev_alloc_skb(dev->net, size, flags);
else
skb = __netdev_alloc_skb_ip_align(dev->net, size, flags);
if (!skb) { if (!skb) {
netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); netif_dbg(dev, rx_err, dev->net, "no rx skb\n");
usbnet_defer_kevent (dev, EVENT_RX_MEMORY); usbnet_defer_kevent (dev, EVENT_RX_MEMORY);
+3
View File
@@ -1004,6 +1004,9 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *,
int qeth_set_features(struct net_device *, netdev_features_t); int qeth_set_features(struct net_device *, netdev_features_t);
int qeth_recover_features(struct net_device *); int qeth_recover_features(struct net_device *);
netdev_features_t qeth_fix_features(struct net_device *, netdev_features_t); netdev_features_t qeth_fix_features(struct net_device *, netdev_features_t);
netdev_features_t qeth_features_check(struct sk_buff *skb,
struct net_device *dev,
netdev_features_t features);
/* exports for OSN */ /* exports for OSN */
int qeth_osn_assist(struct net_device *, void *, int); int qeth_osn_assist(struct net_device *, void *, int);
+31
View File
@@ -19,6 +19,11 @@
#include <linux/mii.h> #include <linux/mii.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/if_vlan.h>
#include <linux/netdevice.h>
#include <linux/netdev_features.h>
#include <linux/skbuff.h>
#include <net/iucv/af_iucv.h> #include <net/iucv/af_iucv.h>
#include <net/dsfield.h> #include <net/dsfield.h>
@@ -6240,6 +6245,32 @@ netdev_features_t qeth_fix_features(struct net_device *dev,
} }
EXPORT_SYMBOL_GPL(qeth_fix_features); EXPORT_SYMBOL_GPL(qeth_fix_features);
netdev_features_t qeth_features_check(struct sk_buff *skb,
struct net_device *dev,
netdev_features_t features)
{
/* GSO segmentation builds skbs with
* a (small) linear part for the headers, and
* page frags for the data.
* Compared to a linear skb, the header-only part consumes an
* additional buffer element. This reduces buffer utilization, and
* hurts throughput. So compress small segments into one element.
*/
if (netif_needs_gso(skb, features)) {
/* match skb_segment(): */
unsigned int doffset = skb->data - skb_mac_header(skb);
unsigned int hsize = skb_shinfo(skb)->gso_size;
unsigned int hroom = skb_headroom(skb);
/* linearize only if resulting skb allocations are order-0: */
if (SKB_DATA_ALIGN(hroom + doffset + hsize) <= SKB_MAX_HEAD(0))
features &= ~NETIF_F_SG;
}
return vlan_features_check(skb, features);
}
EXPORT_SYMBOL_GPL(qeth_features_check);
static int __init qeth_core_init(void) static int __init qeth_core_init(void)
{ {
int rc; int rc;
+2 -2
View File
@@ -1084,6 +1084,7 @@ static const struct net_device_ops qeth_l2_netdev_ops = {
.ndo_stop = qeth_l2_stop, .ndo_stop = qeth_l2_stop,
.ndo_get_stats = qeth_get_stats, .ndo_get_stats = qeth_get_stats,
.ndo_start_xmit = qeth_l2_hard_start_xmit, .ndo_start_xmit = qeth_l2_hard_start_xmit,
.ndo_features_check = qeth_features_check,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_rx_mode = qeth_l2_set_rx_mode, .ndo_set_rx_mode = qeth_l2_set_rx_mode,
.ndo_do_ioctl = qeth_l2_do_ioctl, .ndo_do_ioctl = qeth_l2_do_ioctl,
@@ -1128,6 +1129,7 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
if (card->info.type == QETH_CARD_TYPE_OSD && !card->info.guestlan) { if (card->info.type == QETH_CARD_TYPE_OSD && !card->info.guestlan) {
card->dev->hw_features = NETIF_F_SG; card->dev->hw_features = NETIF_F_SG;
card->dev->vlan_features = NETIF_F_SG; card->dev->vlan_features = NETIF_F_SG;
card->dev->features |= NETIF_F_SG;
/* OSA 3S and earlier has no RX/TX support */ /* OSA 3S and earlier has no RX/TX support */
if (qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) { if (qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) {
card->dev->hw_features |= NETIF_F_IP_CSUM; card->dev->hw_features |= NETIF_F_IP_CSUM;
@@ -1140,8 +1142,6 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
} }
card->info.broadcast_capable = 1; card->info.broadcast_capable = 1;
qeth_l2_request_initial_mac(card); qeth_l2_request_initial_mac(card);
card->dev->gso_max_size = (QETH_MAX_BUFFER_ELEMENTS(card) - 1) *
PAGE_SIZE;
SET_NETDEV_DEV(card->dev, &card->gdev->dev); SET_NETDEV_DEV(card->dev, &card->gdev->dev);
netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT); netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT);
netif_carrier_off(card->dev); netif_carrier_off(card->dev);
+9 -4
View File
@@ -1416,6 +1416,7 @@ qeth_l3_add_mc_to_hash(struct qeth_card *card, struct in_device *in4_dev)
tmp->u.a4.addr = im4->multiaddr; tmp->u.a4.addr = im4->multiaddr;
memcpy(tmp->mac, buf, sizeof(tmp->mac)); memcpy(tmp->mac, buf, sizeof(tmp->mac));
tmp->is_multicast = 1;
ipm = qeth_l3_ip_from_hash(card, tmp); ipm = qeth_l3_ip_from_hash(card, tmp);
if (ipm) { if (ipm) {
@@ -1593,7 +1594,7 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card,
addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV4); addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV4);
if (!addr) if (!addr)
return; goto out;
spin_lock_bh(&card->ip_lock); spin_lock_bh(&card->ip_lock);
@@ -1607,6 +1608,7 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card,
spin_unlock_bh(&card->ip_lock); spin_unlock_bh(&card->ip_lock);
kfree(addr); kfree(addr);
out:
in_dev_put(in_dev); in_dev_put(in_dev);
} }
@@ -1631,7 +1633,7 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card,
addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6); addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
if (!addr) if (!addr)
return; goto out;
spin_lock_bh(&card->ip_lock); spin_lock_bh(&card->ip_lock);
@@ -1646,6 +1648,7 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card,
spin_unlock_bh(&card->ip_lock); spin_unlock_bh(&card->ip_lock);
kfree(addr); kfree(addr);
out:
in6_dev_put(in6_dev); in6_dev_put(in6_dev);
#endif /* CONFIG_QETH_IPV6 */ #endif /* CONFIG_QETH_IPV6 */
} }
@@ -3064,6 +3067,7 @@ static const struct net_device_ops qeth_l3_netdev_ops = {
.ndo_stop = qeth_l3_stop, .ndo_stop = qeth_l3_stop,
.ndo_get_stats = qeth_get_stats, .ndo_get_stats = qeth_get_stats,
.ndo_start_xmit = qeth_l3_hard_start_xmit, .ndo_start_xmit = qeth_l3_hard_start_xmit,
.ndo_features_check = qeth_features_check,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_rx_mode = qeth_l3_set_multicast_list, .ndo_set_rx_mode = qeth_l3_set_multicast_list,
.ndo_do_ioctl = qeth_l3_do_ioctl, .ndo_do_ioctl = qeth_l3_do_ioctl,
@@ -3120,6 +3124,7 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
card->dev->vlan_features = NETIF_F_SG | card->dev->vlan_features = NETIF_F_SG |
NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_RXCSUM | NETIF_F_IP_CSUM |
NETIF_F_TSO; NETIF_F_TSO;
card->dev->features |= NETIF_F_SG;
} }
} }
} else if (card->info.type == QETH_CARD_TYPE_IQD) { } else if (card->info.type == QETH_CARD_TYPE_IQD) {
@@ -3145,8 +3150,8 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_RX |
NETIF_F_HW_VLAN_CTAG_FILTER; NETIF_F_HW_VLAN_CTAG_FILTER;
netif_keep_dst(card->dev); netif_keep_dst(card->dev);
card->dev->gso_max_size = (QETH_MAX_BUFFER_ELEMENTS(card) - 1) * netif_set_gso_max_size(card->dev, (QETH_MAX_BUFFER_ELEMENTS(card) - 1) *
PAGE_SIZE; PAGE_SIZE);
SET_NETDEV_DEV(card->dev, &card->gdev->dev); SET_NETDEV_DEV(card->dev, &card->gdev->dev);
netif_napi_add(card->dev, &card->napi, qeth_l3_poll, QETH_NAPI_WEIGHT); netif_napi_add(card->dev, &card->napi, qeth_l3_poll, QETH_NAPI_WEIGHT);
+1 -1
View File
@@ -1015,7 +1015,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
else else
ret = ep->status; ret = ep->status;
goto error_mutex; goto error_mutex;
} else if (!(req = usb_ep_alloc_request(ep->ep, GFP_KERNEL))) { } else if (!(req = usb_ep_alloc_request(ep->ep, GFP_ATOMIC))) {
ret = -ENOMEM; ret = -ENOMEM;
} else { } else {
req->buf = data; req->buf = data;
-38
View File
@@ -99,44 +99,6 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n,
first->pprev = &n->next; first->pprev = &n->next;
} }
/**
* hlist_nulls_add_tail_rcu
* @n: the element to add to the hash list.
* @h: the list to add to.
*
* Description:
* Adds the specified element to the end of the specified hlist_nulls,
* while permitting racing traversals. NOTE: tail insertion requires
* list traversal.
*
* The caller must take whatever precautions are necessary
* (such as holding appropriate locks) to avoid racing
* with another list-mutation primitive, such as hlist_nulls_add_head_rcu()
* or hlist_nulls_del_rcu(), running on this same list.
* However, it is perfectly legal to run concurrently with
* the _rcu list-traversal primitives, such as
* hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency
* problems on Alpha CPUs. Regardless of the type of CPU, the
* list-traversal primitive must be guarded by rcu_read_lock().
*/
static inline void hlist_nulls_add_tail_rcu(struct hlist_nulls_node *n,
struct hlist_nulls_head *h)
{
struct hlist_nulls_node *i, *last = NULL;
for (i = hlist_nulls_first_rcu(h); !is_a_nulls(i);
i = hlist_nulls_next_rcu(i))
last = i;
if (last) {
n->next = last->next;
n->pprev = &last->next;
rcu_assign_pointer(hlist_nulls_next_rcu(last), n);
} else {
hlist_nulls_add_head_rcu(n, h);
}
}
/** /**
* hlist_nulls_for_each_entry_rcu - iterate over rcu list of given type * hlist_nulls_for_each_entry_rcu - iterate over rcu list of given type
* @tpos: the type * to use as a loop cursor. * @tpos: the type * to use as a loop cursor.
+1
View File
@@ -79,6 +79,7 @@ struct usbnet {
# define EVENT_RX_KILL 10 # define EVENT_RX_KILL 10
# define EVENT_LINK_CHANGE 11 # define EVENT_LINK_CHANGE 11
# define EVENT_SET_RX_MODE 12 # define EVENT_SET_RX_MODE 12
# define EVENT_NO_IP_ALIGN 13
}; };
static inline struct usb_driver *driver_of(struct usb_interface *intf) static inline struct usb_driver *driver_of(struct usb_interface *intf)
+1 -5
View File
@@ -649,11 +649,7 @@ static inline void sk_add_node_rcu(struct sock *sk, struct hlist_head *list)
static inline void __sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list) static inline void __sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list)
{ {
if (IS_ENABLED(CONFIG_IPV6) && sk->sk_reuseport && hlist_nulls_add_head_rcu(&sk->sk_nulls_node, list);
sk->sk_family == AF_INET6)
hlist_nulls_add_tail_rcu(&sk->sk_nulls_node, list);
else
hlist_nulls_add_head_rcu(&sk->sk_nulls_node, list);
} }
static inline void sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list) static inline void sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list)
+5 -5
View File
@@ -79,13 +79,13 @@ static int audit_initialized;
#define AUDIT_OFF 0 #define AUDIT_OFF 0
#define AUDIT_ON 1 #define AUDIT_ON 1
#define AUDIT_LOCKED 2 #define AUDIT_LOCKED 2
u32 audit_enabled; u32 audit_enabled = AUDIT_OFF;
u32 audit_ever_enabled; u32 audit_ever_enabled = !!AUDIT_OFF;
EXPORT_SYMBOL_GPL(audit_enabled); EXPORT_SYMBOL_GPL(audit_enabled);
/* Default state when kernel boots without any parameters. */ /* Default state when kernel boots without any parameters. */
static u32 audit_default; static u32 audit_default = AUDIT_OFF;
/* If auditing cannot proceed, audit_failure selects what happens. */ /* If auditing cannot proceed, audit_failure selects what happens. */
static u32 audit_failure = AUDIT_FAIL_PRINTK; static u32 audit_failure = AUDIT_FAIL_PRINTK;
@@ -1199,8 +1199,6 @@ static int __init audit_init(void)
skb_queue_head_init(&audit_skb_queue); skb_queue_head_init(&audit_skb_queue);
skb_queue_head_init(&audit_skb_hold_queue); skb_queue_head_init(&audit_skb_hold_queue);
audit_initialized = AUDIT_INITIALIZED; audit_initialized = AUDIT_INITIALIZED;
audit_enabled = audit_default;
audit_ever_enabled |= !!audit_default;
audit_log(NULL, GFP_KERNEL, AUDIT_KERNEL, "initialized"); audit_log(NULL, GFP_KERNEL, AUDIT_KERNEL, "initialized");
@@ -1217,6 +1215,8 @@ static int __init audit_enable(char *str)
audit_default = !!simple_strtol(str, NULL, 0); audit_default = !!simple_strtol(str, NULL, 0);
if (!audit_default) if (!audit_default)
audit_initialized = AUDIT_DISABLED; audit_initialized = AUDIT_DISABLED;
audit_enabled = audit_default;
audit_ever_enabled = !!audit_enabled;
pr_info("%s\n", audit_default ? pr_info("%s\n", audit_default ?
"enabled (after initialization)" : "disabled (until reboot)"); "enabled (after initialization)" : "disabled (until reboot)");
+6
View File
@@ -57,10 +57,16 @@ void dccp_time_wait(struct sock *sk, int state, int timeo)
if (state == DCCP_TIME_WAIT) if (state == DCCP_TIME_WAIT)
timeo = DCCP_TIMEWAIT_LEN; timeo = DCCP_TIMEWAIT_LEN;
/* tw_timer is pinned, so we need to make sure BH are disabled
* in following section, otherwise timer handler could run before
* we complete the initialization.
*/
local_bh_disable();
inet_twsk_schedule(tw, timeo); inet_twsk_schedule(tw, timeo);
/* Linkage updates. */ /* Linkage updates. */
__inet_twsk_hashdance(tw, sk, &dccp_hashinfo); __inet_twsk_hashdance(tw, sk, &dccp_hashinfo);
inet_twsk_put(tw); inet_twsk_put(tw);
local_bh_enable();
} else { } else {
/* Sorry, if we're out of memory, just CLOSE this /* Sorry, if we're out of memory, just CLOSE this
* socket up. We've got bigger problems than * socket up. We've got bigger problems than
+6
View File
@@ -328,10 +328,16 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
timeo = TCP_TIMEWAIT_LEN; timeo = TCP_TIMEWAIT_LEN;
} }
/* tw_timer is pinned, so we need to make sure BH are disabled
* in following section, otherwise timer handler could run before
* we complete the initialization.
*/
local_bh_disable();
inet_twsk_schedule(tw, timeo); inet_twsk_schedule(tw, timeo);
/* Linkage updates. */ /* Linkage updates. */
__inet_twsk_hashdance(tw, sk, &tcp_hashinfo); __inet_twsk_hashdance(tw, sk, &tcp_hashinfo);
inet_twsk_put(tw); inet_twsk_put(tw);
local_bh_enable();
} else { } else {
/* Sorry, if we're out of memory, just CLOSE this /* Sorry, if we're out of memory, just CLOSE this
* socket up. We've got bigger problems than * socket up. We've got bigger problems than
+1
View File
@@ -1085,6 +1085,7 @@ static void ipip6_tunnel_update(struct ip_tunnel *t, struct ip_tunnel_parm *p)
ipip6_tunnel_link(sitn, t); ipip6_tunnel_link(sitn, t);
t->parms.iph.ttl = p->iph.ttl; t->parms.iph.ttl = p->iph.ttl;
t->parms.iph.tos = p->iph.tos; t->parms.iph.tos = p->iph.tos;
t->parms.iph.frag_off = p->iph.frag_off;
if (t->parms.link != p->link) { if (t->parms.link != p->link) {
t->parms.link = p->link; t->parms.link = p->link;
ipip6_tunnel_bind_dev(t->dev); ipip6_tunnel_bind_dev(t->dev);
+25 -46
View File
@@ -1624,60 +1624,35 @@ static struct proto kcm_proto = {
}; };
/* Clone a kcm socket. */ /* Clone a kcm socket. */
static int kcm_clone(struct socket *osock, struct kcm_clone *info, static struct file *kcm_clone(struct socket *osock)
struct socket **newsockp)
{ {
struct socket *newsock; struct socket *newsock;
struct sock *newsk; struct sock *newsk;
struct file *newfile; struct file *file;
int err, newfd;
err = -ENFILE;
newsock = sock_alloc(); newsock = sock_alloc();
if (!newsock) if (!newsock)
goto out; return ERR_PTR(-ENFILE);
newsock->type = osock->type; newsock->type = osock->type;
newsock->ops = osock->ops; newsock->ops = osock->ops;
__module_get(newsock->ops->owner); __module_get(newsock->ops->owner);
newfd = get_unused_fd_flags(0);
if (unlikely(newfd < 0)) {
err = newfd;
goto out_fd_fail;
}
newfile = sock_alloc_file(newsock, 0, osock->sk->sk_prot_creator->name);
if (unlikely(IS_ERR(newfile))) {
err = PTR_ERR(newfile);
goto out_sock_alloc_fail;
}
newsk = sk_alloc(sock_net(osock->sk), PF_KCM, GFP_KERNEL, newsk = sk_alloc(sock_net(osock->sk), PF_KCM, GFP_KERNEL,
&kcm_proto, true); &kcm_proto, true);
if (!newsk) { if (!newsk) {
err = -ENOMEM; sock_release(newsock);
goto out_sk_alloc_fail; return ERR_PTR(-ENOMEM);
} }
sock_init_data(newsock, newsk); sock_init_data(newsock, newsk);
init_kcm_sock(kcm_sk(newsk), kcm_sk(osock->sk)->mux); init_kcm_sock(kcm_sk(newsk), kcm_sk(osock->sk)->mux);
fd_install(newfd, newfile); file = sock_alloc_file(newsock, 0, osock->sk->sk_prot_creator->name);
*newsockp = newsock; if (IS_ERR(file))
info->fd = newfd; sock_release(newsock);
return 0; return file;
out_sk_alloc_fail:
fput(newfile);
out_sock_alloc_fail:
put_unused_fd(newfd);
out_fd_fail:
sock_release(newsock);
out:
return err;
} }
static int kcm_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) static int kcm_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
@@ -1707,21 +1682,25 @@ static int kcm_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
} }
case SIOCKCMCLONE: { case SIOCKCMCLONE: {
struct kcm_clone info; struct kcm_clone info;
struct socket *newsock = NULL; struct file *file;
if (copy_from_user(&info, (void __user *)arg, sizeof(info))) info.fd = get_unused_fd_flags(0);
return -EFAULT; if (unlikely(info.fd < 0))
return info.fd;
err = kcm_clone(sock, &info, &newsock); file = kcm_clone(sock);
if (IS_ERR(file)) {
if (!err) { put_unused_fd(info.fd);
if (copy_to_user((void __user *)arg, &info, return PTR_ERR(file);
sizeof(info))) {
err = -EFAULT;
sys_close(info.fd);
}
} }
if (copy_to_user((void __user *)arg, &info,
sizeof(info))) {
put_unused_fd(info.fd);
fput(file);
return -EFAULT;
}
fd_install(info.fd, file);
err = 0;
break; break;
} }
default: default:
+5
View File
@@ -364,6 +364,11 @@ next_hook:
ret = nf_queue(skb, state, &entry, verdict); ret = nf_queue(skb, state, &entry, verdict);
if (ret == 1 && entry) if (ret == 1 && entry)
goto next_hook; goto next_hook;
} else {
/* Implicit handling for NF_STOLEN, as well as any other
* non conventional verdicts.
*/
ret = 0;
} }
return ret; return ret;
} }
+15 -22
View File
@@ -1661,7 +1661,6 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
atomic_long_set(&rollover->num, 0); atomic_long_set(&rollover->num, 0);
atomic_long_set(&rollover->num_huge, 0); atomic_long_set(&rollover->num_huge, 0);
atomic_long_set(&rollover->num_failed, 0); atomic_long_set(&rollover->num_failed, 0);
po->rollover = rollover;
} }
match = NULL; match = NULL;
@@ -1706,6 +1705,8 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
if (atomic_read(&match->sk_ref) < PACKET_FANOUT_MAX) { if (atomic_read(&match->sk_ref) < PACKET_FANOUT_MAX) {
__dev_remove_pack(&po->prot_hook); __dev_remove_pack(&po->prot_hook);
po->fanout = match; po->fanout = match;
po->rollover = rollover;
rollover = NULL;
atomic_inc(&match->sk_ref); atomic_inc(&match->sk_ref);
__fanout_link(sk, po); __fanout_link(sk, po);
err = 0; err = 0;
@@ -1719,10 +1720,7 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
} }
out: out:
if (err && rollover) { kfree(rollover);
kfree_rcu(rollover, rcu);
po->rollover = NULL;
}
mutex_unlock(&fanout_mutex); mutex_unlock(&fanout_mutex);
return err; return err;
} }
@@ -1746,11 +1744,6 @@ static struct packet_fanout *fanout_release(struct sock *sk)
list_del(&f->list); list_del(&f->list);
else else
f = NULL; f = NULL;
if (po->rollover) {
kfree_rcu(po->rollover, rcu);
po->rollover = NULL;
}
} }
mutex_unlock(&fanout_mutex); mutex_unlock(&fanout_mutex);
@@ -3039,6 +3032,7 @@ static int packet_release(struct socket *sock)
synchronize_net(); synchronize_net();
if (f) { if (f) {
kfree(po->rollover);
fanout_release_data(f); fanout_release_data(f);
kfree(f); kfree(f);
} }
@@ -3107,6 +3101,10 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
if (need_rehook) { if (need_rehook) {
if (po->running) { if (po->running) {
rcu_read_unlock(); rcu_read_unlock();
/* prevents packet_notifier() from calling
* register_prot_hook()
*/
po->num = 0;
__unregister_prot_hook(sk, true); __unregister_prot_hook(sk, true);
rcu_read_lock(); rcu_read_lock();
dev_curr = po->prot_hook.dev; dev_curr = po->prot_hook.dev;
@@ -3115,6 +3113,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
dev->ifindex); dev->ifindex);
} }
BUG_ON(po->running);
po->num = proto; po->num = proto;
po->prot_hook.type = proto; po->prot_hook.type = proto;
@@ -3853,7 +3852,6 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
void *data = &val; void *data = &val;
union tpacket_stats_u st; union tpacket_stats_u st;
struct tpacket_rollover_stats rstats; struct tpacket_rollover_stats rstats;
struct packet_rollover *rollover;
if (level != SOL_PACKET) if (level != SOL_PACKET)
return -ENOPROTOOPT; return -ENOPROTOOPT;
@@ -3932,18 +3930,13 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
0); 0);
break; break;
case PACKET_ROLLOVER_STATS: case PACKET_ROLLOVER_STATS:
rcu_read_lock(); if (!po->rollover)
rollover = rcu_dereference(po->rollover);
if (rollover) {
rstats.tp_all = atomic_long_read(&rollover->num);
rstats.tp_huge = atomic_long_read(&rollover->num_huge);
rstats.tp_failed = atomic_long_read(&rollover->num_failed);
data = &rstats;
lv = sizeof(rstats);
}
rcu_read_unlock();
if (!rollover)
return -EINVAL; return -EINVAL;
rstats.tp_all = atomic_long_read(&po->rollover->num);
rstats.tp_huge = atomic_long_read(&po->rollover->num_huge);
rstats.tp_failed = atomic_long_read(&po->rollover->num_failed);
data = &rstats;
lv = sizeof(rstats);
break; break;
case PACKET_TX_HAS_OFF: case PACKET_TX_HAS_OFF:
val = po->tp_tx_has_off; val = po->tp_tx_has_off;
-1
View File
@@ -92,7 +92,6 @@ struct packet_fanout {
struct packet_rollover { struct packet_rollover {
int sock; int sock;
struct rcu_head rcu;
atomic_long_t num; atomic_long_t num;
atomic_long_t num_huge; atomic_long_t num_huge;
atomic_long_t num_failed; atomic_long_t num_failed;
+1 -1
View File
@@ -183,7 +183,7 @@ static int __rds_rdma_map(struct rds_sock *rs, struct rds_get_mr_args *args,
long i; long i;
int ret; int ret;
if (rs->rs_bound_addr == 0) { if (rs->rs_bound_addr == 0 || !rs->rs_transport) {
ret = -ENOTCONN; /* XXX not a great errno */ ret = -ENOTCONN; /* XXX not a great errno */
goto out; goto out;
} }
+1
View File
@@ -313,6 +313,7 @@ static int tipc_accept_from_sock(struct tipc_conn *con)
newcon->usr_data = s->tipc_conn_new(newcon->conid); newcon->usr_data = s->tipc_conn_new(newcon->conid);
if (!newcon->usr_data) { if (!newcon->usr_data) {
sock_release(newsock); sock_release(newsock);
conn_put(newcon);
return -ENOMEM; return -ENOMEM;
} }
-4
View File
@@ -371,10 +371,6 @@ static int tipc_udp_recv(struct sock *sk, struct sk_buff *skb)
goto rcu_out; goto rcu_out;
} }
tipc_rcv(sock_net(sk), skb, b);
rcu_read_unlock();
return 0;
rcu_out: rcu_out:
rcu_read_unlock(); rcu_read_unlock();
out: out:
+1 -1
View File
@@ -322,6 +322,7 @@ static int its_sync_lpi_pending_table(struct kvm_vcpu *vcpu)
int ret = 0; int ret = 0;
u32 *intids; u32 *intids;
int nr_irqs, i; int nr_irqs, i;
u8 pendmask;
nr_irqs = vgic_copy_lpi_list(vcpu->kvm, &intids); nr_irqs = vgic_copy_lpi_list(vcpu->kvm, &intids);
if (nr_irqs < 0) if (nr_irqs < 0)
@@ -329,7 +330,6 @@ static int its_sync_lpi_pending_table(struct kvm_vcpu *vcpu)
for (i = 0; i < nr_irqs; i++) { for (i = 0; i < nr_irqs; i++) {
int byte_offset, bit_nr; int byte_offset, bit_nr;
u8 pendmask;
byte_offset = intids[i] / BITS_PER_BYTE; byte_offset = intids[i] / BITS_PER_BYTE;
bit_nr = intids[i] % BITS_PER_BYTE; bit_nr = intids[i] % BITS_PER_BYTE;