Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
970565bb
Commit
970565bb
authored
16 years ago
by
David S. Miller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
netdev: Move gso_skb into netdev_queue.
Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
c2aa2885
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
24 additions
and
22 deletions
+24
-22
include/linux/netdevice.h
include/linux/netdevice.h
+1
-3
net/sched/sch_generic.c
net/sched/sch_generic.c
+23
-19
No files found.
include/linux/netdevice.h
View file @
970565bb
...
...
@@ -452,6 +452,7 @@ struct netdev_queue {
spinlock_t
lock
;
struct
net_device
*
dev
;
struct
Qdisc
*
qdisc
;
struct
sk_buff
*
gso_skb
;
struct
Qdisc
*
qdisc_sleeping
;
struct
list_head
qdisc_list
;
struct
netdev_queue
*
next_sched
;
...
...
@@ -635,9 +636,6 @@ struct net_device
struct
netdev_queue
tx_queue
____cacheline_aligned_in_smp
;
unsigned
long
tx_queue_len
;
/* Max frames per queue allowed */
/* Partially transmitted GSO packet. */
struct
sk_buff
*
gso_skb
;
/*
* One part is mostly used on xmit path (device)
*/
...
...
This diff is collapsed.
Click to expand it.
net/sched/sch_generic.c
View file @
970565bb
...
...
@@ -63,10 +63,11 @@ static inline int qdisc_qlen(struct Qdisc *q)
}
static
inline
int
dev_requeue_skb
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
struct
netdev_queue
*
dev_queue
,
struct
Qdisc
*
q
)
{
if
(
unlikely
(
skb
->
next
))
dev
->
gso_skb
=
skb
;
dev
_queue
->
gso_skb
=
skb
;
else
q
->
ops
->
requeue
(
skb
,
q
);
...
...
@@ -75,12 +76,13 @@ static inline int dev_requeue_skb(struct sk_buff *skb, struct net_device *dev,
}
static
inline
struct
sk_buff
*
dev_dequeue_skb
(
struct
net_device
*
dev
,
struct
netdev_queue
*
dev_queue
,
struct
Qdisc
*
q
)
{
struct
sk_buff
*
skb
;
if
((
skb
=
dev
->
gso_skb
))
dev
->
gso_skb
=
NULL
;
if
((
skb
=
dev
_queue
->
gso_skb
))
dev
_queue
->
gso_skb
=
NULL
;
else
skb
=
q
->
dequeue
(
q
);
...
...
@@ -89,6 +91,7 @@ static inline struct sk_buff *dev_dequeue_skb(struct net_device *dev,
static
inline
int
handle_dev_cpu_collision
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
struct
netdev_queue
*
dev_queue
,
struct
Qdisc
*
q
)
{
int
ret
;
...
...
@@ -111,7 +114,7 @@ static inline int handle_dev_cpu_collision(struct sk_buff *skb,
* some time.
*/
__get_cpu_var
(
netdev_rx_stat
).
cpu_collision
++
;
ret
=
dev_requeue_skb
(
skb
,
dev
,
q
);
ret
=
dev_requeue_skb
(
skb
,
dev
,
dev_queue
,
q
);
}
return
ret
;
...
...
@@ -144,7 +147,7 @@ static inline int qdisc_restart(struct net_device *dev)
int
ret
=
NETDEV_TX_BUSY
;
/* Dequeue packet */
if
(
unlikely
((
skb
=
dev_dequeue_skb
(
dev
,
q
))
==
NULL
))
if
(
unlikely
((
skb
=
dev_dequeue_skb
(
dev
,
txq
,
q
))
==
NULL
))
return
0
;
...
...
@@ -167,7 +170,7 @@ static inline int qdisc_restart(struct net_device *dev)
case
NETDEV_TX_LOCKED
:
/* Driver try lock failed */
ret
=
handle_dev_cpu_collision
(
skb
,
dev
,
q
);
ret
=
handle_dev_cpu_collision
(
skb
,
dev
,
txq
,
q
);
break
;
default:
...
...
@@ -176,7 +179,7 @@ static inline int qdisc_restart(struct net_device *dev)
printk
(
KERN_WARNING
"BUG %s code %d qlen %d
\n
"
,
dev
->
name
,
ret
,
q
->
q
.
qlen
);
ret
=
dev_requeue_skb
(
skb
,
dev
,
q
);
ret
=
dev_requeue_skb
(
skb
,
dev
,
txq
,
q
);
break
;
}
...
...
@@ -578,31 +581,32 @@ void dev_activate(struct net_device *dev)
spin_unlock_bh
(
&
txq
->
lock
);
}
static
void
dev_deactivate_queue
(
struct
net_device
*
dev
,
struct
netdev_queue
*
dev_queue
,
static
void
dev_deactivate_queue
(
struct
netdev_queue
*
dev_queue
,
struct
Qdisc
*
qdisc_default
)
{
struct
Qdisc
*
qdisc
=
dev_queue
->
qdisc
;
struct
Qdisc
*
qdisc
;
struct
sk_buff
*
skb
;
spin_lock_bh
(
&
dev_queue
->
lock
);
qdisc
=
dev_queue
->
qdisc
;
if
(
qdisc
)
{
dev_queue
->
qdisc
=
qdisc_default
;
qdisc_reset
(
qdisc
);
}
skb
=
dev_queue
->
gso_skb
;
dev_queue
->
gso_skb
=
NULL
;
spin_unlock_bh
(
&
dev_queue
->
lock
);
kfree_skb
(
skb
);
}
void
dev_deactivate
(
struct
net_device
*
dev
)
{
struct
sk_buff
*
skb
;
int
running
;
spin_lock_bh
(
&
dev
->
tx_queue
.
lock
);
dev_deactivate_queue
(
dev
,
&
dev
->
tx_queue
,
&
noop_qdisc
);
skb
=
dev
->
gso_skb
;
dev
->
gso_skb
=
NULL
;
spin_unlock_bh
(
&
dev
->
tx_queue
.
lock
);
kfree_skb
(
skb
);
dev_deactivate_queue
(
&
dev
->
tx_queue
,
&
noop_qdisc
);
dev_watchdog_down
(
dev
);
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment