Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
4798248e
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
4798248e
编写于
8月 22, 2014
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
net: Add ops->ndo_xmit_flush()
Signed-off-by:
N
David S. Miller
<
davem@davemloft.net
>
上级
4c83acbc
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
44 addition
and
15 deletion
+44
-15
drivers/net/wan/dlci.c
drivers/net/wan/dlci.c
+1
-1
drivers/usb/gadget/function/f_ncm.c
drivers/usb/gadget/function/f_ncm.c
+1
-1
include/linux/netdevice.h
include/linux/netdevice.h
+35
-0
net/atm/mpc.c
net/atm/mpc.c
+1
-1
net/core/dev.c
net/core/dev.c
+2
-3
net/core/netpoll.c
net/core/netpoll.c
+1
-2
net/core/pktgen.c
net/core/pktgen.c
+1
-3
net/packet/af_packet.c
net/packet/af_packet.c
+1
-2
net/sched/sch_teql.c
net/sched/sch_teql.c
+1
-2
未找到文件。
drivers/net/wan/dlci.c
浏览文件 @
4798248e
...
...
@@ -193,7 +193,7 @@ static netdev_tx_t dlci_transmit(struct sk_buff *skb, struct net_device *dev)
struct
dlci_local
*
dlp
=
netdev_priv
(
dev
);
if
(
skb
)
dlp
->
slave
->
netdev_ops
->
ndo
_start_xmit
(
skb
,
dlp
->
slave
);
netdev
_start_xmit
(
skb
,
dlp
->
slave
);
return
NETDEV_TX_OK
;
}
...
...
drivers/usb/gadget/function/f_ncm.c
浏览文件 @
4798248e
...
...
@@ -1101,7 +1101,7 @@ static void ncm_tx_tasklet(unsigned long data)
/* Only send if data is available. */
if
(
ncm
->
skb_tx_data
)
{
ncm
->
timer_force_tx
=
true
;
n
cm
->
netdev
->
netdev_ops
->
ndo
_start_xmit
(
NULL
,
ncm
->
netdev
);
n
etdev
_start_xmit
(
NULL
,
ncm
->
netdev
);
ncm
->
timer_force_tx
=
false
;
}
}
...
...
include/linux/netdevice.h
浏览文件 @
4798248e
...
...
@@ -782,6 +782,19 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
* (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX)
* Required can not be NULL.
*
* void (*ndo_xmit_flush)(struct net_device *dev, u16 queue);
* A driver implements this function when it wishes to support
* deferred TX queue flushing. The idea is that the expensive
* operation to trigger TX queue processing can be done after
* N calls to ndo_start_xmit rather than being done every single
* time. In this regime ndo_start_xmit will be called one or more
* times, and then a final ndo_xmit_flush call will be made to
* have the driver tell the device about the new pending TX queue
* entries. The kernel keeps track of which queues need flushing
* by monitoring skb->queue_mapping of the packets it submits to
* ndo_start_xmit. This is the queue value that will be passed
* to ndo_xmit_flush.
*
* u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb,
* void *accel_priv, select_queue_fallback_t fallback);
* Called to decide which queue to when device supports multiple
...
...
@@ -1005,6 +1018,7 @@ struct net_device_ops {
int
(
*
ndo_stop
)(
struct
net_device
*
dev
);
netdev_tx_t
(
*
ndo_start_xmit
)
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
);
void
(
*
ndo_xmit_flush
)(
struct
net_device
*
dev
,
u16
queue
);
u16
(
*
ndo_select_queue
)(
struct
net_device
*
dev
,
struct
sk_buff
*
skb
,
void
*
accel_priv
,
...
...
@@ -3430,6 +3444,27 @@ int __init dev_proc_init(void);
#define dev_proc_init() 0
#endif
static
inline
netdev_tx_t
__netdev_start_xmit
(
const
struct
net_device_ops
*
ops
,
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
netdev_tx_t
ret
;
u16
q
;
q
=
skb
->
queue_mapping
;
ret
=
ops
->
ndo_start_xmit
(
skb
,
dev
);
if
(
dev_xmit_complete
(
ret
)
&&
ops
->
ndo_xmit_flush
)
ops
->
ndo_xmit_flush
(
dev
,
q
);
return
ret
;
}
static
inline
netdev_tx_t
netdev_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
const
struct
net_device_ops
*
ops
=
dev
->
netdev_ops
;
return
__netdev_start_xmit
(
ops
,
skb
,
dev
);
}
int
netdev_class_create_file_ns
(
struct
class_attribute
*
class_attr
,
const
void
*
ns
);
void
netdev_class_remove_file_ns
(
struct
class_attribute
*
class_attr
,
...
...
net/atm/mpc.c
浏览文件 @
4798248e
...
...
@@ -599,7 +599,7 @@ static netdev_tx_t mpc_send_packet(struct sk_buff *skb,
}
non_ip:
return
mpc
->
old_ops
->
ndo_start_xmit
(
skb
,
dev
);
return
__netdev_start_xmit
(
mpc
->
old_ops
,
skb
,
dev
);
}
static
int
atm_mpoa_vcc_attach
(
struct
atm_vcc
*
vcc
,
void
__user
*
arg
)
...
...
net/core/dev.c
浏览文件 @
4798248e
...
...
@@ -2602,7 +2602,6 @@ EXPORT_SYMBOL(netif_skb_features);
int
dev_hard_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
struct
netdev_queue
*
txq
)
{
const
struct
net_device_ops
*
ops
=
dev
->
netdev_ops
;
int
rc
=
NETDEV_TX_OK
;
unsigned
int
skb_len
;
...
...
@@ -2667,7 +2666,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
skb_len
=
skb
->
len
;
trace_net_dev_start_xmit
(
skb
,
dev
);
rc
=
ops
->
ndo
_start_xmit
(
skb
,
dev
);
rc
=
netdev
_start_xmit
(
skb
,
dev
);
trace_net_dev_xmit
(
skb
,
rc
,
dev
,
skb_len
);
if
(
rc
==
NETDEV_TX_OK
)
txq_trans_update
(
txq
);
...
...
@@ -2686,7 +2685,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
skb_len
=
nskb
->
len
;
trace_net_dev_start_xmit
(
nskb
,
dev
);
rc
=
ops
->
ndo
_start_xmit
(
nskb
,
dev
);
rc
=
netdev
_start_xmit
(
nskb
,
dev
);
trace_net_dev_xmit
(
nskb
,
rc
,
dev
,
skb_len
);
if
(
unlikely
(
rc
!=
NETDEV_TX_OK
))
{
if
(
rc
&
~
NETDEV_TX_MASK
)
...
...
net/core/netpoll.c
浏览文件 @
4798248e
...
...
@@ -72,7 +72,6 @@ module_param(carrier_timeout, uint, 0644);
static
int
netpoll_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
struct
netdev_queue
*
txq
)
{
const
struct
net_device_ops
*
ops
=
dev
->
netdev_ops
;
int
status
=
NETDEV_TX_OK
;
netdev_features_t
features
;
...
...
@@ -92,7 +91,7 @@ static int netpoll_start_xmit(struct sk_buff *skb, struct net_device *dev,
skb
->
vlan_tci
=
0
;
}
status
=
ops
->
ndo
_start_xmit
(
skb
,
dev
);
status
=
netdev
_start_xmit
(
skb
,
dev
);
if
(
status
==
NETDEV_TX_OK
)
txq_trans_update
(
txq
);
...
...
net/core/pktgen.c
浏览文件 @
4798248e
...
...
@@ -3285,8 +3285,6 @@ static void pktgen_wait_for_skb(struct pktgen_dev *pkt_dev)
static
void
pktgen_xmit
(
struct
pktgen_dev
*
pkt_dev
)
{
struct
net_device
*
odev
=
pkt_dev
->
odev
;
netdev_tx_t
(
*
xmit
)(
struct
sk_buff
*
,
struct
net_device
*
)
=
odev
->
netdev_ops
->
ndo_start_xmit
;
struct
netdev_queue
*
txq
;
u16
queue_map
;
int
ret
;
...
...
@@ -3339,7 +3337,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
goto
unlock
;
}
atomic_inc
(
&
(
pkt_dev
->
skb
->
users
));
ret
=
(
*
xmit
)
(
pkt_dev
->
skb
,
odev
);
ret
=
netdev_start_xmit
(
pkt_dev
->
skb
,
odev
);
switch
(
ret
)
{
case
NETDEV_TX_OK
:
...
...
net/packet/af_packet.c
浏览文件 @
4798248e
...
...
@@ -240,7 +240,6 @@ static void __fanout_link(struct sock *sk, struct packet_sock *po);
static
int
packet_direct_xmit
(
struct
sk_buff
*
skb
)
{
struct
net_device
*
dev
=
skb
->
dev
;
const
struct
net_device_ops
*
ops
=
dev
->
netdev_ops
;
netdev_features_t
features
;
struct
netdev_queue
*
txq
;
int
ret
=
NETDEV_TX_BUSY
;
...
...
@@ -262,7 +261,7 @@ static int packet_direct_xmit(struct sk_buff *skb)
HARD_TX_LOCK
(
dev
,
txq
,
smp_processor_id
());
if
(
!
netif_xmit_frozen_or_drv_stopped
(
txq
))
{
ret
=
ops
->
ndo
_start_xmit
(
skb
,
dev
);
ret
=
netdev
_start_xmit
(
skb
,
dev
);
if
(
ret
==
NETDEV_TX_OK
)
txq_trans_update
(
txq
);
}
...
...
net/sched/sch_teql.c
浏览文件 @
4798248e
...
...
@@ -301,7 +301,6 @@ static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev)
do
{
struct
net_device
*
slave
=
qdisc_dev
(
q
);
struct
netdev_queue
*
slave_txq
=
netdev_get_tx_queue
(
slave
,
0
);
const
struct
net_device_ops
*
slave_ops
=
slave
->
netdev_ops
;
if
(
slave_txq
->
qdisc_sleeping
!=
q
)
continue
;
...
...
@@ -317,7 +316,7 @@ static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev)
unsigned
int
length
=
qdisc_pkt_len
(
skb
);
if
(
!
netif_xmit_frozen_or_stopped
(
slave_txq
)
&&
slave_ops
->
ndo
_start_xmit
(
skb
,
slave
)
==
NETDEV_TX_OK
)
{
netdev
_start_xmit
(
skb
,
slave
)
==
NETDEV_TX_OK
)
{
txq_trans_update
(
slave_txq
);
__netif_tx_unlock
(
slave_txq
);
master
->
slaves
=
NEXT_SLAVE
(
q
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录