Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
bug2833
cloud-kernel
提交
9e0efaf6
cloud-kernel
项目概览
bug2833
/
cloud-kernel
与 Fork 源项目一致
Fork自
openanolis / cloud-kernel
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9e0efaf6
编写于
1月 06, 2016
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
上级
c7f5d105
51cb67c0
变更
32
隐藏空白更改
内联
并排
Showing
32 changed file
with
173 addition
and
134 deletion
+173
-134
Makefile
Makefile
+1
-1
arch/arm/net/bpf_jit_32.c
arch/arm/net/bpf_jit_32.c
+3
-16
arch/mips/net/bpf_jit.c
arch/mips/net/bpf_jit.c
+1
-15
arch/mips/vdso/Makefile
arch/mips/vdso/Makefile
+1
-1
arch/powerpc/net/bpf_jit_comp.c
arch/powerpc/net/bpf_jit_comp.c
+2
-11
arch/sparc/net/bpf_jit_comp.c
arch/sparc/net/bpf_jit_comp.c
+2
-15
arch/tile/Kconfig
arch/tile/Kconfig
+5
-6
arch/tile/include/asm/page.h
arch/tile/include/asm/page.h
+5
-3
drivers/connector/connector.c
drivers/connector/connector.c
+3
-8
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_display.c
+8
-4
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_hdmi.c
+1
-1
drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c
drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c
+4
-0
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+4
-2
drivers/net/hamradio/6pack.c
drivers/net/hamradio/6pack.c
+6
-0
drivers/net/hamradio/mkiss.c
drivers/net/hamradio/mkiss.c
+5
-0
drivers/net/usb/qmi_wwan.c
drivers/net/usb/qmi_wwan.c
+1
-0
drivers/net/usb/r8152.c
drivers/net/usb/r8152.c
+9
-1
drivers/net/vmxnet3/vmxnet3_drv.c
drivers/net/vmxnet3/vmxnet3_drv.c
+4
-4
drivers/net/vmxnet3/vmxnet3_int.h
drivers/net/vmxnet3/vmxnet3_int.h
+2
-2
drivers/net/vrf.c
drivers/net/vrf.c
+7
-3
include/linux/filter.h
include/linux/filter.h
+19
-0
include/net/l3mdev.h
include/net/l3mdev.h
+10
-6
include/net/route.h
include/net/route.h
+6
-1
kernel/trace/trace_printk.c
kernel/trace/trace_printk.c
+1
-0
net/bridge/br_stp_if.c
net/bridge/br_stp_if.c
+4
-1
net/core/dst.c
net/core/dst.c
+2
-1
net/ipv4/raw.c
net/ipv4/raw.c
+5
-2
net/ipv4/tcp_input.c
net/ipv4/tcp_input.c
+3
-0
net/ipv4/udp.c
net/ipv4/udp.c
+5
-2
net/sched/sch_generic.c
net/sched/sch_generic.c
+3
-1
net/unix/af_unix.c
net/unix/af_unix.c
+40
-26
scripts/recordmcount.c
scripts/recordmcount.c
+1
-1
未找到文件。
Makefile
浏览文件 @
9e0efaf6
VERSION
=
4
PATCHLEVEL
=
4
SUBLEVEL
=
0
EXTRAVERSION
=
-rc
7
EXTRAVERSION
=
-rc
8
NAME
=
Blurry Fish Butt
# *DOCUMENTATION*
...
...
arch/arm/net/bpf_jit_32.c
浏览文件 @
9e0efaf6
...
...
@@ -187,19 +187,6 @@ static inline int mem_words_used(struct jit_ctx *ctx)
return
fls
(
ctx
->
seen
&
SEEN_MEM
);
}
static
inline
bool
is_load_to_a
(
u16
inst
)
{
switch
(
inst
)
{
case
BPF_LD
|
BPF_W
|
BPF_LEN
:
case
BPF_LD
|
BPF_W
|
BPF_ABS
:
case
BPF_LD
|
BPF_H
|
BPF_ABS
:
case
BPF_LD
|
BPF_B
|
BPF_ABS
:
return
true
;
default:
return
false
;
}
}
static
void
jit_fill_hole
(
void
*
area
,
unsigned
int
size
)
{
u32
*
ptr
;
...
...
@@ -211,7 +198,6 @@ static void jit_fill_hole(void *area, unsigned int size)
static
void
build_prologue
(
struct
jit_ctx
*
ctx
)
{
u16
reg_set
=
saved_regs
(
ctx
);
u16
first_inst
=
ctx
->
skf
->
insns
[
0
].
code
;
u16
off
;
#ifdef CONFIG_FRAME_POINTER
...
...
@@ -241,7 +227,7 @@ static void build_prologue(struct jit_ctx *ctx)
emit
(
ARM_MOV_I
(
r_X
,
0
),
ctx
);
/* do not leak kernel data to userspace */
if
(
(
first_inst
!=
(
BPF_RET
|
BPF_K
))
&&
!
(
is_load_to_a
(
first_inst
)
))
if
(
bpf_needs_clear_a
(
&
ctx
->
skf
->
insns
[
0
]
))
emit
(
ARM_MOV_I
(
r_A
,
0
),
ctx
);
/* stack space for the BPF_MEM words */
...
...
@@ -770,7 +756,8 @@ static int build_body(struct jit_ctx *ctx)
case
BPF_ALU
|
BPF_RSH
|
BPF_K
:
if
(
unlikely
(
k
>
31
))
return
-
1
;
emit
(
ARM_LSR_I
(
r_A
,
r_A
,
k
),
ctx
);
if
(
k
)
emit
(
ARM_LSR_I
(
r_A
,
r_A
,
k
),
ctx
);
break
;
case
BPF_ALU
|
BPF_RSH
|
BPF_X
:
update_on_xread
(
ctx
);
...
...
arch/mips/net/bpf_jit.c
浏览文件 @
9e0efaf6
...
...
@@ -521,19 +521,6 @@ static inline u16 align_sp(unsigned int num)
return
num
;
}
static
bool
is_load_to_a
(
u16
inst
)
{
switch
(
inst
)
{
case
BPF_LD
|
BPF_W
|
BPF_LEN
:
case
BPF_LD
|
BPF_W
|
BPF_ABS
:
case
BPF_LD
|
BPF_H
|
BPF_ABS
:
case
BPF_LD
|
BPF_B
|
BPF_ABS
:
return
true
;
default:
return
false
;
}
}
static
void
save_bpf_jit_regs
(
struct
jit_ctx
*
ctx
,
unsigned
offset
)
{
int
i
=
0
,
real_off
=
0
;
...
...
@@ -614,7 +601,6 @@ static unsigned int get_stack_depth(struct jit_ctx *ctx)
static
void
build_prologue
(
struct
jit_ctx
*
ctx
)
{
u16
first_inst
=
ctx
->
skf
->
insns
[
0
].
code
;
int
sp_off
;
/* Calculate the total offset for the stack pointer */
...
...
@@ -641,7 +627,7 @@ static void build_prologue(struct jit_ctx *ctx)
emit_jit_reg_move
(
r_X
,
r_zero
,
ctx
);
/* Do not leak kernel data to userspace */
if
(
(
first_inst
!=
(
BPF_RET
|
BPF_K
))
&&
!
(
is_load_to_a
(
first_inst
)
))
if
(
bpf_needs_clear_a
(
&
ctx
->
skf
->
insns
[
0
]
))
emit_jit_reg_move
(
r_A
,
r_zero
,
ctx
);
}
...
...
arch/mips/vdso/Makefile
浏览文件 @
9e0efaf6
...
...
@@ -26,7 +26,7 @@ aflags-vdso := $(ccflags-vdso) \
# the comments on that file.
#
ifndef
CONFIG_CPU_MIPSR6
ifeq
($(call ld-ifversion, -lt, 22500000, y),)
ifeq
($(call ld-ifversion, -lt, 22500000, y),
y
)
$(warning
MIPS
VDSO
requires
binutils
>=
2.25)
obj-vdso-y
:=
$(
filter-out
gettimeofday.o,
$
(
obj-vdso-y
))
ccflags-vdso
+=
-DDISABLE_MIPS_VDSO
...
...
arch/powerpc/net/bpf_jit_comp.c
浏览文件 @
9e0efaf6
...
...
@@ -78,18 +78,9 @@ static void bpf_jit_build_prologue(struct bpf_prog *fp, u32 *image,
PPC_LI
(
r_X
,
0
);
}
switch
(
filter
[
0
].
code
)
{
case
BPF_RET
|
BPF_K
:
case
BPF_LD
|
BPF_W
|
BPF_LEN
:
case
BPF_LD
|
BPF_W
|
BPF_ABS
:
case
BPF_LD
|
BPF_H
|
BPF_ABS
:
case
BPF_LD
|
BPF_B
|
BPF_ABS
:
/* first instruction sets A register (or is RET 'constant') */
break
;
default:
/* make sure we dont leak kernel information to user */
/* make sure we dont leak kernel information to user */
if
(
bpf_needs_clear_a
(
&
filter
[
0
]))
PPC_LI
(
r_A
,
0
);
}
}
static
void
bpf_jit_build_epilogue
(
u32
*
image
,
struct
codegen_context
*
ctx
)
...
...
arch/sparc/net/bpf_jit_comp.c
浏览文件 @
9e0efaf6
...
...
@@ -420,22 +420,9 @@ void bpf_jit_compile(struct bpf_prog *fp)
}
emit_reg_move
(
O7
,
r_saved_O7
);
switch
(
filter
[
0
].
code
)
{
case
BPF_RET
|
BPF_K
:
case
BPF_LD
|
BPF_W
|
BPF_LEN
:
case
BPF_LD
|
BPF_W
|
BPF_ABS
:
case
BPF_LD
|
BPF_H
|
BPF_ABS
:
case
BPF_LD
|
BPF_B
|
BPF_ABS
:
/* The first instruction sets the A register (or is
* a "RET 'constant'")
*/
break
;
default:
/* Make sure we dont leak kernel information to the
* user.
*/
/* Make sure we dont leak kernel information to the user. */
if
(
bpf_needs_clear_a
(
&
filter
[
0
]))
emit_clear
(
r_A
);
/* A = 0 */
}
for
(
i
=
0
;
i
<
flen
;
i
++
)
{
unsigned
int
K
=
filter
[
i
].
k
;
...
...
arch/tile/Kconfig
浏览文件 @
9e0efaf6
...
...
@@ -176,8 +176,6 @@ config NR_CPUS
smaller kernel memory footprint results from using a smaller
value on chips with fewer tiles.
if TILEGX
choice
prompt "Kernel page size"
default PAGE_SIZE_64KB
...
...
@@ -188,8 +186,11 @@ choice
connections, etc., it may be better to select 16KB, which uses
memory more efficiently at some cost in TLB performance.
Note that this option is TILE-Gx specific; currently
TILEPro page size is set by rebuilding the hypervisor.
Note that for TILEPro, you must also rebuild the hypervisor
with a matching page size.
config PAGE_SIZE_4KB
bool "4KB" if TILEPRO
config PAGE_SIZE_16KB
bool "16KB"
...
...
@@ -199,8 +200,6 @@ config PAGE_SIZE_64KB
endchoice
endif
source "kernel/Kconfig.hz"
config KEXEC
...
...
arch/tile/include/asm/page.h
浏览文件 @
9e0efaf6
...
...
@@ -20,15 +20,17 @@
#include <arch/chip.h>
/* PAGE_SHIFT and HPAGE_SHIFT determine the page sizes. */
#if defined(CONFIG_PAGE_SIZE_16KB)
#if defined(CONFIG_PAGE_SIZE_4KB)
/* tilepro only */
#define PAGE_SHIFT 12
#define CTX_PAGE_FLAG HV_CTX_PG_SM_4K
#elif defined(CONFIG_PAGE_SIZE_16KB)
#define PAGE_SHIFT 14
#define CTX_PAGE_FLAG HV_CTX_PG_SM_16K
#elif defined(CONFIG_PAGE_SIZE_64KB)
#define PAGE_SHIFT 16
#define CTX_PAGE_FLAG HV_CTX_PG_SM_64K
#else
#define PAGE_SHIFT HV_LOG2_DEFAULT_PAGE_SIZE_SMALL
#define CTX_PAGE_FLAG 0
#error Page size not specified in Kconfig
#endif
#define HPAGE_SHIFT HV_LOG2_DEFAULT_PAGE_SIZE_LARGE
...
...
drivers/connector/connector.c
浏览文件 @
9e0efaf6
...
...
@@ -179,26 +179,21 @@ static int cn_call_callback(struct sk_buff *skb)
*
* It checks skb, netlink header and msg sizes, and calls callback helper.
*/
static
void
cn_rx_skb
(
struct
sk_buff
*
__
skb
)
static
void
cn_rx_skb
(
struct
sk_buff
*
skb
)
{
struct
nlmsghdr
*
nlh
;
struct
sk_buff
*
skb
;
int
len
,
err
;
skb
=
skb_get
(
__skb
);
if
(
skb
->
len
>=
NLMSG_HDRLEN
)
{
nlh
=
nlmsg_hdr
(
skb
);
len
=
nlmsg_len
(
nlh
);
if
(
len
<
(
int
)
sizeof
(
struct
cn_msg
)
||
skb
->
len
<
nlh
->
nlmsg_len
||
len
>
CONNECTOR_MAX_MSG_SIZE
)
{
kfree_skb
(
skb
);
len
>
CONNECTOR_MAX_MSG_SIZE
)
return
;
}
err
=
cn_call_callback
(
skb
);
err
=
cn_call_callback
(
skb
_get
(
skb
)
);
if
(
err
<
0
)
kfree_skb
(
skb
);
}
...
...
drivers/gpu/drm/i915/intel_display.c
浏览文件 @
9e0efaf6
...
...
@@ -12123,18 +12123,22 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc,
static
bool
check_digital_port_conflicts
(
struct
drm_atomic_state
*
state
)
{
struct
drm_device
*
dev
=
state
->
dev
;
struct
intel_encoder
*
encoder
;
struct
drm_connector
*
connector
;
struct
drm_connector_state
*
connector_state
;
unsigned
int
used_ports
=
0
;
int
i
;
/*
* Walk the connector list instead of the encoder
* list to detect the problem on ddi platforms
* where there's just one encoder per digital port.
*/
for_each_connector_in_state
(
state
,
connector
,
connector_state
,
i
)
{
drm_for_each_connector
(
connector
,
dev
)
{
struct
drm_connector_state
*
connector_state
;
struct
intel_encoder
*
encoder
;
connector_state
=
drm_atomic_get_existing_connector_state
(
state
,
connector
);
if
(
!
connector_state
)
connector_state
=
connector
->
state
;
if
(
!
connector_state
->
best_encoder
)
continue
;
...
...
drivers/gpu/drm/i915/intel_hdmi.c
浏览文件 @
9e0efaf6
...
...
@@ -1381,7 +1381,7 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
intel_display_power_get
(
dev_priv
,
POWER_DOMAIN_GMBUS
);
for
(
try
=
0
;
!
live_status
&&
try
<
4
;
try
++
)
{
for
(
try
=
0
;
!
live_status
&&
try
<
9
;
try
++
)
{
if
(
try
)
msleep
(
10
);
live_status
=
intel_digital_port_connected
(
dev_priv
,
...
...
drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c
浏览文件 @
9e0efaf6
...
...
@@ -306,6 +306,10 @@ struct clip_tbl *t4_init_clip_tbl(unsigned int clipt_start,
INIT_LIST_HEAD
(
&
ctbl
->
hash_list
[
i
]);
cl_list
=
t4_alloc_mem
(
clipt_size
*
sizeof
(
struct
clip_entry
));
if
(
!
cl_list
)
{
t4_free_mem
(
ctbl
);
return
NULL
;
}
ctbl
->
cl_list
=
(
void
*
)
cl_list
;
for
(
i
=
0
;
i
<
clipt_size
;
i
++
)
{
...
...
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
浏览文件 @
9e0efaf6
...
...
@@ -772,8 +772,10 @@ int qlcnic_82xx_config_intrpt(struct qlcnic_adapter *adapter, u8 op_type)
int
i
,
err
=
0
;
for
(
i
=
0
;
i
<
ahw
->
num_msix
;
i
++
)
{
qlcnic_alloc_mbx_args
(
&
cmd
,
adapter
,
QLCNIC_CMD_MQ_TX_CONFIG_INTR
);
err
=
qlcnic_alloc_mbx_args
(
&
cmd
,
adapter
,
QLCNIC_CMD_MQ_TX_CONFIG_INTR
);
if
(
err
)
return
err
;
type
=
op_type
?
QLCNIC_INTRPT_ADD
:
QLCNIC_INTRPT_DEL
;
val
=
type
|
(
ahw
->
intr_tbl
[
i
].
type
<<
4
);
if
(
ahw
->
intr_tbl
[
i
].
type
==
QLCNIC_INTRPT_MSIX
)
...
...
drivers/net/hamradio/6pack.c
浏览文件 @
9e0efaf6
...
...
@@ -683,6 +683,12 @@ static void sixpack_close(struct tty_struct *tty)
if
(
!
atomic_dec_and_test
(
&
sp
->
refcnt
))
down
(
&
sp
->
dead_sem
);
/* We must stop the queue to avoid potentially scribbling
* on the free buffers. The sp->dead_sem is not sufficient
* to protect us from sp->xbuff access.
*/
netif_stop_queue
(
sp
->
dev
);
del_timer_sync
(
&
sp
->
tx_t
);
del_timer_sync
(
&
sp
->
resync_t
);
...
...
drivers/net/hamradio/mkiss.c
浏览文件 @
9e0efaf6
...
...
@@ -797,6 +797,11 @@ static void mkiss_close(struct tty_struct *tty)
*/
if
(
!
atomic_dec_and_test
(
&
ax
->
refcnt
))
down
(
&
ax
->
dead_sem
);
/*
* Halt the transmit queue so that a new transmit cannot scribble
* on our buffers
*/
netif_stop_queue
(
ax
->
dev
);
/* Free all AX25 frame buffers. */
kfree
(
ax
->
rbuff
);
...
...
drivers/net/usb/qmi_wwan.c
浏览文件 @
9e0efaf6
...
...
@@ -885,6 +885,7 @@ static const struct usb_device_id products[] = {
{
QMI_FIXED_INTF
(
0x413c
,
0x81a9
,
8
)},
/* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */
{
QMI_FIXED_INTF
(
0x413c
,
0x81b1
,
8
)},
/* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card */
{
QMI_FIXED_INTF
(
0x03f0
,
0x4e1d
,
8
)},
/* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */
{
QMI_FIXED_INTF
(
0x22de
,
0x9061
,
3
)},
/* WeTelecom WPD-600N */
/* 4. Gobi 1000 devices */
{
QMI_GOBI1K_DEVICE
(
0x05c6
,
0x9212
)},
/* Acer Gobi Modem Device */
...
...
drivers/net/usb/r8152.c
浏览文件 @
9e0efaf6
...
...
@@ -3525,6 +3525,14 @@ static int rtl8152_resume(struct usb_interface *intf)
return
0
;
}
static
int
rtl8152_reset_resume
(
struct
usb_interface
*
intf
)
{
struct
r8152
*
tp
=
usb_get_intfdata
(
intf
);
clear_bit
(
SELECTIVE_SUSPEND
,
&
tp
->
flags
);
return
rtl8152_resume
(
intf
);
}
static
void
rtl8152_get_wol
(
struct
net_device
*
dev
,
struct
ethtool_wolinfo
*
wol
)
{
struct
r8152
*
tp
=
netdev_priv
(
dev
);
...
...
@@ -4276,7 +4284,7 @@ static struct usb_driver rtl8152_driver = {
.
disconnect
=
rtl8152_disconnect
,
.
suspend
=
rtl8152_suspend
,
.
resume
=
rtl8152_resume
,
.
reset_resume
=
rtl8152_resume
,
.
reset_resume
=
rtl8152_res
et_res
ume
,
.
pre_reset
=
rtl8152_pre_reset
,
.
post_reset
=
rtl8152_post_reset
,
.
supports_autosuspend
=
1
,
...
...
drivers/net/vmxnet3/vmxnet3_drv.c
浏览文件 @
9e0efaf6
...
...
@@ -1380,10 +1380,10 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
skip_page_frags
=
true
;
goto
rcd_done
;
}
new_dma_addr
=
dma_map_page
(
&
adapter
->
pdev
->
dev
,
rbi
->
page
,
0
,
PAGE_SIZE
,
PCI_DMA_FROMDEVICE
);
new_dma_addr
=
dma_map_page
(
&
adapter
->
pdev
->
dev
,
new_
page
,
0
,
PAGE_SIZE
,
PCI_DMA_FROMDEVICE
);
if
(
dma_mapping_error
(
&
adapter
->
pdev
->
dev
,
new_dma_addr
))
{
put_page
(
new_page
);
...
...
drivers/net/vmxnet3/vmxnet3_int.h
浏览文件 @
9e0efaf6
...
...
@@ -69,10 +69,10 @@
/*
* Version numbers
*/
#define VMXNET3_DRIVER_VERSION_STRING "1.4.
4
.0-k"
#define VMXNET3_DRIVER_VERSION_STRING "1.4.
5
.0-k"
/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
#define VMXNET3_DRIVER_VERSION_NUM 0x01040
4
00
#define VMXNET3_DRIVER_VERSION_NUM 0x01040
5
00
#if defined(CONFIG_PCI_MSI)
/* RSS only makes sense if MSI-X is supported. */
...
...
drivers/net/vrf.c
浏览文件 @
9e0efaf6
...
...
@@ -742,7 +742,7 @@ static struct rtable *vrf_get_rtable(const struct net_device *dev,
}
/* called under rcu_read_lock */
static
void
vrf_get_saddr
(
struct
net_device
*
dev
,
struct
flowi4
*
fl4
)
static
int
vrf_get_saddr
(
struct
net_device
*
dev
,
struct
flowi4
*
fl4
)
{
struct
fib_result
res
=
{
.
tclassid
=
0
};
struct
net
*
net
=
dev_net
(
dev
);
...
...
@@ -750,9 +750,10 @@ static void vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
u8
flags
=
fl4
->
flowi4_flags
;
u8
scope
=
fl4
->
flowi4_scope
;
u8
tos
=
RT_FL_TOS
(
fl4
);
int
rc
;
if
(
unlikely
(
!
fl4
->
daddr
))
return
;
return
0
;
fl4
->
flowi4_flags
|=
FLOWI_FLAG_SKIP_NH_OIF
;
fl4
->
flowi4_iif
=
LOOPBACK_IFINDEX
;
...
...
@@ -760,7 +761,8 @@ static void vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
fl4
->
flowi4_scope
=
((
tos
&
RTO_ONLINK
)
?
RT_SCOPE_LINK
:
RT_SCOPE_UNIVERSE
);
if
(
!
fib_lookup
(
net
,
fl4
,
&
res
,
0
))
{
rc
=
fib_lookup
(
net
,
fl4
,
&
res
,
0
);
if
(
!
rc
)
{
if
(
res
.
type
==
RTN_LOCAL
)
fl4
->
saddr
=
res
.
fi
->
fib_prefsrc
?
:
fl4
->
daddr
;
else
...
...
@@ -770,6 +772,8 @@ static void vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
fl4
->
flowi4_flags
=
flags
;
fl4
->
flowi4_tos
=
orig_tos
;
fl4
->
flowi4_scope
=
scope
;
return
rc
;
}
#if IS_ENABLED(CONFIG_IPV6)
...
...
include/linux/filter.h
浏览文件 @
9e0efaf6
...
...
@@ -495,6 +495,25 @@ static inline void bpf_jit_free(struct bpf_prog *fp)
#define BPF_ANC BIT(15)
static
inline
bool
bpf_needs_clear_a
(
const
struct
sock_filter
*
first
)
{
switch
(
first
->
code
)
{
case
BPF_RET
|
BPF_K
:
case
BPF_LD
|
BPF_W
|
BPF_LEN
:
return
false
;
case
BPF_LD
|
BPF_W
|
BPF_ABS
:
case
BPF_LD
|
BPF_H
|
BPF_ABS
:
case
BPF_LD
|
BPF_B
|
BPF_ABS
:
if
(
first
->
k
==
SKF_AD_OFF
+
SKF_AD_ALU_XOR_X
)
return
true
;
return
false
;
default:
return
true
;
}
}
static
inline
u16
bpf_anc_helper
(
const
struct
sock_filter
*
ftest
)
{
BUG_ON
(
ftest
->
code
&
BPF_ANC
);
...
...
include/net/l3mdev.h
浏览文件 @
9e0efaf6
...
...
@@ -29,7 +29,7 @@ struct l3mdev_ops {
/* IPv4 ops */
struct
rtable
*
(
*
l3mdev_get_rtable
)(
const
struct
net_device
*
dev
,
const
struct
flowi4
*
fl4
);
void
(
*
l3mdev_get_saddr
)(
struct
net_device
*
dev
,
int
(
*
l3mdev_get_saddr
)(
struct
net_device
*
dev
,
struct
flowi4
*
fl4
);
/* IPv6 ops */
...
...
@@ -130,10 +130,11 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
return
rc
;
}
static
inline
void
l3mdev_get_saddr
(
struct
net
*
net
,
int
ifindex
,
struct
flowi4
*
fl4
)
static
inline
int
l3mdev_get_saddr
(
struct
net
*
net
,
int
ifindex
,
struct
flowi4
*
fl4
)
{
struct
net_device
*
dev
;
int
rc
=
0
;
if
(
ifindex
)
{
...
...
@@ -142,11 +143,13 @@ static inline void l3mdev_get_saddr(struct net *net, int ifindex,
dev
=
dev_get_by_index_rcu
(
net
,
ifindex
);
if
(
dev
&&
netif_is_l3_master
(
dev
)
&&
dev
->
l3mdev_ops
->
l3mdev_get_saddr
)
{
dev
->
l3mdev_ops
->
l3mdev_get_saddr
(
dev
,
fl4
);
rc
=
dev
->
l3mdev_ops
->
l3mdev_get_saddr
(
dev
,
fl4
);
}
rcu_read_unlock
();
}
return
rc
;
}
static
inline
struct
dst_entry
*
l3mdev_get_rt6_dst
(
const
struct
net_device
*
dev
,
...
...
@@ -223,9 +226,10 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
return
false
;
}
static
inline
void
l3mdev_get_saddr
(
struct
net
*
net
,
int
ifindex
,
struct
flowi4
*
fl4
)
static
inline
int
l3mdev_get_saddr
(
struct
net
*
net
,
int
ifindex
,
struct
flowi4
*
fl4
)
{
return
0
;
}
static
inline
...
...
include/net/route.h
浏览文件 @
9e0efaf6
...
...
@@ -283,7 +283,12 @@ static inline struct rtable *ip_route_connect(struct flowi4 *fl4,
sport
,
dport
,
sk
);
if
(
!
src
&&
oif
)
{
l3mdev_get_saddr
(
net
,
oif
,
fl4
);
int
rc
;
rc
=
l3mdev_get_saddr
(
net
,
oif
,
fl4
);
if
(
rc
<
0
)
return
ERR_PTR
(
rc
);
src
=
fl4
->
saddr
;
}
if
(
!
dst
||
!
src
)
{
...
...
kernel/trace/trace_printk.c
浏览文件 @
9e0efaf6
...
...
@@ -273,6 +273,7 @@ static const char **find_next(void *v, loff_t *pos)
if
(
*
pos
<
last_index
+
start_index
)
return
__start___tracepoint_str
+
(
*
pos
-
last_index
);
start_index
+=
last_index
;
return
find_next_mod_format
(
start_index
,
v
,
fmt
,
pos
);
}
...
...
net/bridge/br_stp_if.c
浏览文件 @
9e0efaf6
...
...
@@ -143,7 +143,10 @@ static void br_stp_start(struct net_bridge *br)
char
*
envp
[]
=
{
NULL
};
struct
net_bridge_port
*
p
;
r
=
call_usermodehelper
(
BR_STP_PROG
,
argv
,
envp
,
UMH_WAIT_PROC
);
if
(
net_eq
(
dev_net
(
br
->
dev
),
&
init_net
))
r
=
call_usermodehelper
(
BR_STP_PROG
,
argv
,
envp
,
UMH_WAIT_PROC
);
else
r
=
-
ENOENT
;
spin_lock_bh
(
&
br
->
lock
);
...
...
net/core/dst.c
浏览文件 @
9e0efaf6
...
...
@@ -301,12 +301,13 @@ void dst_release(struct dst_entry *dst)
{
if
(
dst
)
{
int
newrefcnt
;
unsigned
short
nocache
=
dst
->
flags
&
DST_NOCACHE
;
newrefcnt
=
atomic_dec_return
(
&
dst
->
__refcnt
);
if
(
unlikely
(
newrefcnt
<
0
))
net_warn_ratelimited
(
"%s: dst:%p refcnt:%d
\n
"
,
__func__
,
dst
,
newrefcnt
);
if
(
!
newrefcnt
&&
unlikely
(
dst
->
flags
&
DST_NOCACHE
))
if
(
!
newrefcnt
&&
unlikely
(
nocache
))
call_rcu
(
&
dst
->
rcu_head
,
dst_destroy_rcu
);
}
}
...
...
net/ipv4/raw.c
浏览文件 @
9e0efaf6
...
...
@@ -601,8 +601,11 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
(
inet
->
hdrincl
?
FLOWI_FLAG_KNOWN_NH
:
0
),
daddr
,
saddr
,
0
,
0
);
if
(
!
saddr
&&
ipc
.
oif
)
l3mdev_get_saddr
(
net
,
ipc
.
oif
,
&
fl4
);
if
(
!
saddr
&&
ipc
.
oif
)
{
err
=
l3mdev_get_saddr
(
net
,
ipc
.
oif
,
&
fl4
);
if
(
err
<
0
)
goto
done
;
}
if
(
!
inet
->
hdrincl
)
{
rfv
.
msg
=
msg
;
...
...
net/ipv4/tcp_input.c
浏览文件 @
9e0efaf6
...
...
@@ -2478,6 +2478,9 @@ static void tcp_cwnd_reduction(struct sock *sk, const int prior_unsacked,
int
newly_acked_sacked
=
prior_unsacked
-
(
tp
->
packets_out
-
tp
->
sacked_out
);
if
(
newly_acked_sacked
<=
0
||
WARN_ON_ONCE
(
!
tp
->
prior_cwnd
))
return
;
tp
->
prr_delivered
+=
newly_acked_sacked
;
if
(
delta
<
0
)
{
u64
dividend
=
(
u64
)
tp
->
snd_ssthresh
*
tp
->
prr_delivered
+
...
...
net/ipv4/udp.c
浏览文件 @
9e0efaf6
...
...
@@ -1097,8 +1097,11 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
flow_flags
,
faddr
,
saddr
,
dport
,
inet
->
inet_sport
);
if
(
!
saddr
&&
ipc
.
oif
)
l3mdev_get_saddr
(
net
,
ipc
.
oif
,
fl4
);
if
(
!
saddr
&&
ipc
.
oif
)
{
err
=
l3mdev_get_saddr
(
net
,
ipc
.
oif
,
fl4
);
if
(
err
<
0
)
goto
out
;
}
security_sk_classify_flow
(
sk
,
flowi4_to_flowi
(
fl4
));
rt
=
ip_route_output_flow
(
net
,
fl4
,
sk
);
...
...
net/sched/sch_generic.c
浏览文件 @
9e0efaf6
...
...
@@ -658,8 +658,10 @@ static void qdisc_rcu_free(struct rcu_head *head)
{
struct
Qdisc
*
qdisc
=
container_of
(
head
,
struct
Qdisc
,
rcu_head
);
if
(
qdisc_is_percpu_stats
(
qdisc
))
if
(
qdisc_is_percpu_stats
(
qdisc
))
{
free_percpu
(
qdisc
->
cpu_bstats
);
free_percpu
(
qdisc
->
cpu_qstats
);
}
kfree
((
char
*
)
qdisc
-
qdisc
->
padded
);
}
...
...
net/unix/af_unix.c
浏览文件 @
9e0efaf6
...
...
@@ -953,32 +953,20 @@ static struct sock *unix_find_other(struct net *net,
return
NULL
;
}
static
int
unix_mknod
(
const
char
*
sun_path
,
umode_t
mode
,
struct
path
*
res
)
static
int
unix_mknod
(
struct
dentry
*
dentry
,
struct
path
*
path
,
umode_t
mode
,
struct
path
*
res
)
{
struct
dentry
*
dentry
;
struct
path
path
;
int
err
=
0
;
/*
* Get the parent directory, calculate the hash for last
* component.
*/
dentry
=
kern_path_create
(
AT_FDCWD
,
sun_path
,
&
path
,
0
);
err
=
PTR_ERR
(
dentry
);
if
(
IS_ERR
(
dentry
))
return
err
;
int
err
;
/*
* All right, let's create it.
*/
err
=
security_path_mknod
(
&
path
,
dentry
,
mode
,
0
);
err
=
security_path_mknod
(
path
,
dentry
,
mode
,
0
);
if
(
!
err
)
{
err
=
vfs_mknod
(
d_inode
(
path
.
dentry
),
dentry
,
mode
,
0
);
err
=
vfs_mknod
(
d_inode
(
path
->
dentry
),
dentry
,
mode
,
0
);
if
(
!
err
)
{
res
->
mnt
=
mntget
(
path
.
mnt
);
res
->
mnt
=
mntget
(
path
->
mnt
);
res
->
dentry
=
dget
(
dentry
);
}
}
done_path_create
(
&
path
,
dentry
);
return
err
;
}
...
...
@@ -989,10 +977,12 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
struct
unix_sock
*
u
=
unix_sk
(
sk
);
struct
sockaddr_un
*
sunaddr
=
(
struct
sockaddr_un
*
)
uaddr
;
char
*
sun_path
=
sunaddr
->
sun_path
;
int
err
;
int
err
,
name_err
;
unsigned
int
hash
;
struct
unix_address
*
addr
;
struct
hlist_head
*
list
;
struct
path
path
;
struct
dentry
*
dentry
;
err
=
-
EINVAL
;
if
(
sunaddr
->
sun_family
!=
AF_UNIX
)
...
...
@@ -1008,14 +998,34 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
goto
out
;
addr_len
=
err
;
name_err
=
0
;
dentry
=
NULL
;
if
(
sun_path
[
0
])
{
/* Get the parent directory, calculate the hash for last
* component.
*/
dentry
=
kern_path_create
(
AT_FDCWD
,
sun_path
,
&
path
,
0
);
if
(
IS_ERR
(
dentry
))
{
/* delay report until after 'already bound' check */
name_err
=
PTR_ERR
(
dentry
);
dentry
=
NULL
;
}
}
err
=
mutex_lock_interruptible
(
&
u
->
readlock
);
if
(
err
)
goto
out
;
goto
out
_path
;
err
=
-
EINVAL
;
if
(
u
->
addr
)
goto
out_up
;
if
(
name_err
)
{
err
=
name_err
==
-
EEXIST
?
-
EADDRINUSE
:
name_err
;
goto
out_up
;
}
err
=
-
ENOMEM
;
addr
=
kmalloc
(
sizeof
(
*
addr
)
+
addr_len
,
GFP_KERNEL
);
if
(
!
addr
)
...
...
@@ -1026,11 +1036,11 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
addr
->
hash
=
hash
^
sk
->
sk_type
;
atomic_set
(
&
addr
->
refcnt
,
1
);
if
(
sun_path
[
0
]
)
{
struct
path
path
;
if
(
dentry
)
{
struct
path
u_
path
;
umode_t
mode
=
S_IFSOCK
|
(
SOCK_INODE
(
sock
)
->
i_mode
&
~
current_umask
());
err
=
unix_mknod
(
sun_path
,
mode
,
&
path
);
err
=
unix_mknod
(
dentry
,
&
path
,
mode
,
&
u_
path
);
if
(
err
)
{
if
(
err
==
-
EEXIST
)
err
=
-
EADDRINUSE
;
...
...
@@ -1038,9 +1048,9 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
goto
out_up
;
}
addr
->
hash
=
UNIX_HASH_SIZE
;
hash
=
d_backing_inode
(
path
.
dentry
)
->
i_ino
&
(
UNIX_HASH_SIZE
-
1
);
hash
=
d_backing_inode
(
dentry
)
->
i_ino
&
(
UNIX_HASH_SIZE
-
1
);
spin_lock
(
&
unix_table_lock
);
u
->
path
=
path
;
u
->
path
=
u_
path
;
list
=
&
unix_socket_table
[
hash
];
}
else
{
spin_lock
(
&
unix_table_lock
);
...
...
@@ -1063,6 +1073,10 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
spin_unlock
(
&
unix_table_lock
);
out_up:
mutex_unlock
(
&
u
->
readlock
);
out_path:
if
(
dentry
)
done_path_create
(
&
path
,
dentry
);
out:
return
err
;
}
...
...
scripts/recordmcount.c
浏览文件 @
9e0efaf6
...
...
@@ -586,7 +586,7 @@ main(int argc, char *argv[])
do_file
(
file
);
break
;
case
SJ_FAIL
:
/* error in do_file or below */
sprintf
(
"%s: failed
\n
"
,
file
);
fprintf
(
stderr
,
"%s: failed
\n
"
,
file
);
++
n_error
;
break
;
case
SJ_SUCCEED
:
/* premature success */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录