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
e9bb8fb0
Commit
e9bb8fb0
authored
Sep 21, 2008
by
David S. Miller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
aoe: Use SKB interfaces for list management instead of home-grown stuff.
Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
67fed459
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
56 additions
and
76 deletions
+56
-76
drivers/block/aoe/aoe.h
drivers/block/aoe/aoe.h
+3
-6
drivers/block/aoe/aoeblk.c
drivers/block/aoe/aoeblk.c
+4
-4
drivers/block/aoe/aoechr.c
drivers/block/aoe/aoechr.c
+7
-1
drivers/block/aoe/aoecmd.c
drivers/block/aoe/aoecmd.c
+32
-53
drivers/block/aoe/aoedev.c
drivers/block/aoe/aoedev.c
+6
-6
drivers/block/aoe/aoemain.c
drivers/block/aoe/aoemain.c
+1
-0
drivers/block/aoe/aoenet.c
drivers/block/aoe/aoenet.c
+3
-6
No files found.
drivers/block/aoe/aoe.h
View file @
e9bb8fb0
...
...
@@ -159,11 +159,8 @@ struct aoedev {
sector_t
ssize
;
struct
timer_list
timer
;
spinlock_t
lock
;
struct
sk_buff
*
sendq_hd
;
/* packets needing to be sent, list head */
struct
sk_buff
*
sendq_tl
;
struct
sk_buff
*
skbpool_hd
;
struct
sk_buff
*
skbpool_tl
;
int
nskbpool
;
struct
sk_buff_head
sendq
;
struct
sk_buff_head
skbpool
;
mempool_t
*
bufpool
;
/* for deadlock-free Buf allocation */
struct
list_head
bufq
;
/* queue of bios to work on */
struct
buf
*
inprocess
;
/* the one we're currently working on */
...
...
@@ -199,7 +196,7 @@ int aoedev_flush(const char __user *str, size_t size);
int
aoenet_init
(
void
);
void
aoenet_exit
(
void
);
void
aoenet_xmit
(
struct
sk_buff
*
);
void
aoenet_xmit
(
struct
sk_buff
_head
*
);
int
is_aoe_netif
(
struct
net_device
*
ifp
);
int
set_aoe_iflist
(
const
char
__user
*
str
,
size_t
size
);
...
...
drivers/block/aoe/aoeblk.c
View file @
e9bb8fb0
...
...
@@ -158,9 +158,9 @@ aoeblk_release(struct inode *inode, struct file *filp)
static
int
aoeblk_make_request
(
struct
request_queue
*
q
,
struct
bio
*
bio
)
{
struct
sk_buff_head
queue
;
struct
aoedev
*
d
;
struct
buf
*
buf
;
struct
sk_buff
*
sl
;
ulong
flags
;
blk_queue_bounce
(
q
,
&
bio
);
...
...
@@ -213,11 +213,11 @@ aoeblk_make_request(struct request_queue *q, struct bio *bio)
list_add_tail
(
&
buf
->
bufs
,
&
d
->
bufq
);
aoecmd_work
(
d
);
sl
=
d
->
sendq_hd
;
d
->
sendq_hd
=
d
->
sendq_tl
=
NULL
;
__skb_queue_head_init
(
&
queue
)
;
skb_queue_splice_init
(
&
d
->
sendq
,
&
queue
)
;
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
aoenet_xmit
(
sl
);
aoenet_xmit
(
&
queue
);
return
0
;
}
...
...
drivers/block/aoe/aoechr.c
View file @
e9bb8fb0
...
...
@@ -9,6 +9,7 @@
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/smp_lock.h>
#include <linux/skbuff.h>
#include "aoe.h"
enum
{
...
...
@@ -103,7 +104,12 @@ loop:
spin_lock_irqsave
(
&
d
->
lock
,
flags
);
goto
loop
;
}
aoenet_xmit
(
skb
);
if
(
skb
)
{
struct
sk_buff_head
queue
;
__skb_queue_head_init
(
&
queue
);
__skb_queue_tail
(
&
queue
,
skb
);
aoenet_xmit
(
&
queue
);
}
aoecmd_cfg
(
major
,
minor
);
return
0
;
}
...
...
drivers/block/aoe/aoecmd.c
View file @
e9bb8fb0
...
...
@@ -114,29 +114,22 @@ ifrotate(struct aoetgt *t)
static
void
skb_pool_put
(
struct
aoedev
*
d
,
struct
sk_buff
*
skb
)
{
if
(
!
d
->
skbpool_hd
)
d
->
skbpool_hd
=
skb
;
else
d
->
skbpool_tl
->
next
=
skb
;
d
->
skbpool_tl
=
skb
;
__skb_queue_tail
(
&
d
->
skbpool
,
skb
);
}
static
struct
sk_buff
*
skb_pool_get
(
struct
aoedev
*
d
)
{
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
=
skb_peek
(
&
d
->
skbpool
)
;
skb
=
d
->
skbpool_hd
;
if
(
skb
&&
atomic_read
(
&
skb_shinfo
(
skb
)
->
dataref
)
==
1
)
{
d
->
skbpool_hd
=
skb
->
next
;
skb
->
next
=
NULL
;
__skb_unlink
(
skb
,
&
d
->
skbpool
);
return
skb
;
}
if
(
d
->
nskbpool
<
NSKBPOOLMAX
&&
(
skb
=
new_skb
(
ETH_ZLEN
)))
{
d
->
nskbpool
++
;
if
(
skb_queue_len
(
&
d
->
skbpool
)
<
NSKBPOOLMAX
&&
(
skb
=
new_skb
(
ETH_ZLEN
)))
return
skb
;
}
return
NULL
;
}
...
...
@@ -293,29 +286,22 @@ aoecmd_ata_rw(struct aoedev *d)
skb
->
dev
=
t
->
ifp
->
nd
;
skb
=
skb_clone
(
skb
,
GFP_ATOMIC
);
if
(
skb
)
{
if
(
d
->
sendq_hd
)
d
->
sendq_tl
->
next
=
skb
;
else
d
->
sendq_hd
=
skb
;
d
->
sendq_tl
=
skb
;
}
if
(
skb
)
__skb_queue_tail
(
&
d
->
sendq
,
skb
);
return
1
;
}
/* some callers cannot sleep, and they can call this function,
* transmitting the packets later, when interrupts are on
*/
static
struct
sk_buff
*
aoecmd_cfg_pkts
(
ushort
aoemajor
,
unsigned
char
aoeminor
,
struct
sk_buff
**
tail
)
static
void
aoecmd_cfg_pkts
(
ushort
aoemajor
,
unsigned
char
aoeminor
,
struct
sk_buff
_head
*
queue
)
{
struct
aoe_hdr
*
h
;
struct
aoe_cfghdr
*
ch
;
struct
sk_buff
*
skb
,
*
sl
,
*
sl_tail
;
struct
sk_buff
*
skb
;
struct
net_device
*
ifp
;
sl
=
sl_tail
=
NULL
;
read_lock
(
&
dev_base_lock
);
for_each_netdev
(
&
init_net
,
ifp
)
{
dev_hold
(
ifp
);
...
...
@@ -329,8 +315,7 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff **tail)
}
skb_put
(
skb
,
sizeof
*
h
+
sizeof
*
ch
);
skb
->
dev
=
ifp
;
if
(
sl_tail
==
NULL
)
sl_tail
=
skb
;
__skb_queue_tail
(
queue
,
skb
);
h
=
(
struct
aoe_hdr
*
)
skb_mac_header
(
skb
);
memset
(
h
,
0
,
sizeof
*
h
+
sizeof
*
ch
);
...
...
@@ -342,16 +327,10 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff **tail)
h
->
minor
=
aoeminor
;
h
->
cmd
=
AOECMD_CFG
;
skb
->
next
=
sl
;
sl
=
skb
;
cont:
dev_put
(
ifp
);
}
read_unlock
(
&
dev_base_lock
);
if
(
tail
!=
NULL
)
*
tail
=
sl_tail
;
return
sl
;
}
static
void
...
...
@@ -406,11 +385,7 @@ resend(struct aoedev *d, struct aoetgt *t, struct frame *f)
skb
=
skb_clone
(
skb
,
GFP_ATOMIC
);
if
(
skb
==
NULL
)
return
;
if
(
d
->
sendq_hd
)
d
->
sendq_tl
->
next
=
skb
;
else
d
->
sendq_hd
=
skb
;
d
->
sendq_tl
=
skb
;
__skb_queue_tail
(
&
d
->
sendq
,
skb
);
}
static
int
...
...
@@ -508,16 +483,15 @@ ata_scnt(unsigned char *packet) {
static
void
rexmit_timer
(
ulong
vp
)
{
struct
sk_buff_head
queue
;
struct
aoedev
*
d
;
struct
aoetgt
*
t
,
**
tt
,
**
te
;
struct
aoeif
*
ifp
;
struct
frame
*
f
,
*
e
;
struct
sk_buff
*
sl
;
register
long
timeout
;
ulong
flags
,
n
;
d
=
(
struct
aoedev
*
)
vp
;
sl
=
NULL
;
/* timeout is always ~150% of the moving average */
timeout
=
d
->
rttavg
;
...
...
@@ -589,7 +563,7 @@ rexmit_timer(ulong vp)
}
}
if
(
d
->
sendq_hd
)
{
if
(
!
skb_queue_empty
(
&
d
->
sendq
)
)
{
n
=
d
->
rttavg
<<=
1
;
if
(
n
>
MAXTIMER
)
d
->
rttavg
=
MAXTIMER
;
...
...
@@ -600,15 +574,15 @@ rexmit_timer(ulong vp)
aoecmd_work
(
d
);
}
sl
=
d
->
sendq_hd
;
d
->
sendq_hd
=
d
->
sendq_tl
=
NULL
;
__skb_queue_head_init
(
&
queue
)
;
skb_queue_splice_init
(
&
d
->
sendq
,
&
queue
)
;
d
->
timer
.
expires
=
jiffies
+
TIMERTICK
;
add_timer
(
&
d
->
timer
);
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
aoenet_xmit
(
sl
);
aoenet_xmit
(
&
queue
);
}
/* enters with d->lock held */
...
...
@@ -767,12 +741,12 @@ diskstats(struct gendisk *disk, struct bio *bio, ulong duration, sector_t sector
void
aoecmd_ata_rsp
(
struct
sk_buff
*
skb
)
{
struct
sk_buff_head
queue
;
struct
aoedev
*
d
;
struct
aoe_hdr
*
hin
,
*
hout
;
struct
aoe_atahdr
*
ahin
,
*
ahout
;
struct
frame
*
f
;
struct
buf
*
buf
;
struct
sk_buff
*
sl
;
struct
aoetgt
*
t
;
struct
aoeif
*
ifp
;
register
long
n
;
...
...
@@ -893,21 +867,21 @@ aoecmd_ata_rsp(struct sk_buff *skb)
aoecmd_work
(
d
);
xmit:
sl
=
d
->
sendq_hd
;
d
->
sendq_hd
=
d
->
sendq_tl
=
NULL
;
__skb_queue_head_init
(
&
queue
)
;
skb_queue_splice_init
(
&
d
->
sendq
,
&
queue
)
;
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
aoenet_xmit
(
sl
);
aoenet_xmit
(
&
queue
);
}
void
aoecmd_cfg
(
ushort
aoemajor
,
unsigned
char
aoeminor
)
{
struct
sk_buff
*
sl
;
sl
=
aoecmd_cfg_pkts
(
aoemajor
,
aoeminor
,
NULL
);
struct
sk_buff_head
queue
;
aoenet_xmit
(
sl
);
__skb_queue_head_init
(
&
queue
);
aoecmd_cfg_pkts
(
aoemajor
,
aoeminor
,
&
queue
);
aoenet_xmit
(
&
queue
);
}
struct
sk_buff
*
...
...
@@ -1076,7 +1050,12 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
aoenet_xmit
(
sl
);
if
(
sl
)
{
struct
sk_buff_head
queue
;
__skb_queue_head_init
(
&
queue
);
__skb_queue_tail
(
&
queue
,
sl
);
aoenet_xmit
(
&
queue
);
}
}
void
...
...
drivers/block/aoe/aoedev.c
View file @
e9bb8fb0
...
...
@@ -188,14 +188,12 @@ skbfree(struct sk_buff *skb)
static
void
skbpoolfree
(
struct
aoedev
*
d
)
{
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
,
*
tmp
;
while
((
skb
=
d
->
skbpool_hd
))
{
d
->
skbpool_hd
=
skb
->
next
;
skb
->
next
=
NULL
;
skb_queue_walk_safe
(
&
d
->
skbpool
,
skb
,
tmp
)
skbfree
(
skb
);
}
d
->
skbpool_tl
=
NULL
;
__skb_queue_head_init
(
&
d
->
skbpool
)
;
}
/* find it or malloc it */
...
...
@@ -217,6 +215,8 @@ aoedev_by_sysminor_m(ulong sysminor)
goto
out
;
INIT_WORK
(
&
d
->
work
,
aoecmd_sleepwork
);
spin_lock_init
(
&
d
->
lock
);
skb_queue_head_init
(
&
d
->
sendq
);
skb_queue_head_init
(
&
d
->
skbpool
);
init_timer
(
&
d
->
timer
);
d
->
timer
.
data
=
(
ulong
)
d
;
d
->
timer
.
function
=
dummy_timer
;
...
...
drivers/block/aoe/aoemain.c
View file @
e9bb8fb0
...
...
@@ -7,6 +7,7 @@
#include <linux/hdreg.h>
#include <linux/blkdev.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include "aoe.h"
MODULE_LICENSE
(
"GPL"
);
...
...
drivers/block/aoe/aoenet.c
View file @
e9bb8fb0
...
...
@@ -95,15 +95,12 @@ mac_addr(char addr[6])
}
void
aoenet_xmit
(
struct
sk_buff
*
sl
)
aoenet_xmit
(
struct
sk_buff
_head
*
queue
)
{
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
,
*
tmp
;
while
((
skb
=
sl
))
{
sl
=
sl
->
next
;
skb
->
next
=
skb
->
prev
=
NULL
;
skb_queue_walk_safe
(
queue
,
skb
,
tmp
)
dev_queue_xmit
(
skb
);
}
}
/*
...
...
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