Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
b35ed010
Commit
b35ed010
authored
Dec 04, 2002
by
Stephen Lord
Committed by
Nathan Scott
Dec 04, 2002
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[XFS] clean up use of run_task_queue in xfs
SGI Modid: 2.5.x-xfs:slinx:133254a
parent
895b494c
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
38 additions
and
25 deletions
+38
-25
fs/xfs/pagebuf/page_buf.c
fs/xfs/pagebuf/page_buf.c
+20
-17
fs/xfs/pagebuf/page_buf.h
fs/xfs/pagebuf/page_buf.h
+12
-1
fs/xfs/pagebuf/page_buf_internal.h
fs/xfs/pagebuf/page_buf_internal.h
+0
-1
fs/xfs/pagebuf/page_buf_locking.c
fs/xfs/pagebuf/page_buf_locking.c
+1
-2
fs/xfs/xfs_buf.h
fs/xfs/xfs_buf.h
+3
-3
fs/xfs/xfsidbg.c
fs/xfs/xfsidbg.c
+2
-1
No files found.
fs/xfs/pagebuf/page_buf.c
View file @
b35ed010
...
@@ -1124,7 +1124,7 @@ _pagebuf_wait_unpin(
...
@@ -1124,7 +1124,7 @@ _pagebuf_wait_unpin(
if
(
atomic_read
(
&
PBP
(
pb
)
->
pb_pin_count
)
==
0
)
{
if
(
atomic_read
(
&
PBP
(
pb
)
->
pb_pin_count
)
==
0
)
{
break
;
break
;
}
}
blk_run_queues
(
);
pagebuf_run_task_queue
(
pb
);
schedule
();
schedule
();
}
}
remove_wait_queue
(
&
PBP
(
pb
)
->
pb_waiters
,
&
wait
);
remove_wait_queue
(
&
PBP
(
pb
)
->
pb_waiters
,
&
wait
);
...
@@ -1162,7 +1162,8 @@ pagebuf_iodone_work(
...
@@ -1162,7 +1162,8 @@ pagebuf_iodone_work(
void
void
pagebuf_iodone
(
pagebuf_iodone
(
page_buf_t
*
pb
)
page_buf_t
*
pb
,
int
schedule
)
{
{
pb
->
pb_flags
&=
~
(
PBF_READ
|
PBF_WRITE
);
pb
->
pb_flags
&=
~
(
PBF_READ
|
PBF_WRITE
);
if
(
pb
->
pb_error
==
0
)
{
if
(
pb
->
pb_error
==
0
)
{
...
@@ -1172,8 +1173,12 @@ pagebuf_iodone(
...
@@ -1172,8 +1173,12 @@ pagebuf_iodone(
PB_TRACE
(
pb
,
PB_TRACE_REC
(
done
),
pb
->
pb_iodone
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
done
),
pb
->
pb_iodone
);
if
((
pb
->
pb_iodone
)
||
(
pb
->
pb_flags
&
PBF_ASYNC
))
{
if
((
pb
->
pb_iodone
)
||
(
pb
->
pb_flags
&
PBF_ASYNC
))
{
if
(
schedule
)
{
INIT_WORK
(
&
pb
->
pb_iodone_work
,
pagebuf_iodone_work
,
pb
);
INIT_WORK
(
&
pb
->
pb_iodone_work
,
pagebuf_iodone_work
,
pb
);
queue_work
(
pagebuf_workqueue
,
&
pb
->
pb_iodone_work
);
queue_work
(
pagebuf_workqueue
,
&
pb
->
pb_iodone_work
);
}
else
{
pagebuf_iodone_work
(
pb
);
}
}
else
{
}
else
{
up
(
&
pb
->
pb_iodonesema
);
up
(
&
pb
->
pb_iodonesema
);
}
}
...
@@ -1291,9 +1296,9 @@ bio_end_io_pagebuf(
...
@@ -1291,9 +1296,9 @@ bio_end_io_pagebuf(
}
}
}
}
if
(
atomic_dec_and_test
(
&
PBP
(
pb
)
->
pb_io_remaining
)
)
{
if
(
atomic_dec_and_test
(
&
pb
->
pb_io_remaining
)
==
1
)
{
pb
->
pb_locked
=
0
;
pb
->
pb_locked
=
0
;
pagebuf_iodone
(
pb
);
pagebuf_iodone
(
pb
,
1
);
}
}
bio_put
(
bio
);
bio_put
(
bio
);
...
@@ -1345,7 +1350,7 @@ pagebuf_iorequest( /* start real I/O */
...
@@ -1345,7 +1350,7 @@ pagebuf_iorequest( /* start real I/O */
* completion callout which happens before we have started
* completion callout which happens before we have started
* all the I/O from calling iodone too early
* all the I/O from calling iodone too early
*/
*/
atomic_set
(
&
PBP
(
pb
)
->
pb_io_remaining
,
1
);
atomic_set
(
&
pb
->
pb_io_remaining
,
1
);
/* Special code path for reading a sub page size pagebuf in --
/* Special code path for reading a sub page size pagebuf in --
* we populate up the whole page, and hence the other metadata
* we populate up the whole page, and hence the other metadata
...
@@ -1369,7 +1374,7 @@ pagebuf_iorequest( /* start real I/O */
...
@@ -1369,7 +1374,7 @@ pagebuf_iorequest( /* start real I/O */
bvec
->
bv_len
=
PAGE_CACHE_SIZE
;
bvec
->
bv_len
=
PAGE_CACHE_SIZE
;
bvec
->
bv_offset
=
0
;
bvec
->
bv_offset
=
0
;
atomic_inc
(
&
PBP
(
pb
)
->
pb_io_remaining
);
atomic_inc
(
&
pb
->
pb_io_remaining
);
submit_bio
(
READ
,
bio
);
submit_bio
(
READ
,
bio
);
goto
io_submitted
;
goto
io_submitted
;
...
@@ -1402,7 +1407,7 @@ pagebuf_iorequest( /* start real I/O */
...
@@ -1402,7 +1407,7 @@ pagebuf_iorequest( /* start real I/O */
map_i
=
0
;
map_i
=
0
;
next_chunk:
next_chunk:
atomic_inc
(
&
PBP
(
pb
)
->
pb_io_remaining
);
atomic_inc
(
&
pb
->
pb_io_remaining
);
nr_pages
=
BIO_MAX_SECTORS
>>
(
PAGE_SHIFT
-
BBSHIFT
);
nr_pages
=
BIO_MAX_SECTORS
>>
(
PAGE_SHIFT
-
BBSHIFT
);
if
(
nr_pages
>
total_nr_pages
)
if
(
nr_pages
>
total_nr_pages
)
nr_pages
=
total_nr_pages
;
nr_pages
=
total_nr_pages
;
...
@@ -1444,10 +1449,8 @@ pagebuf_iorequest( /* start real I/O */
...
@@ -1444,10 +1449,8 @@ pagebuf_iorequest( /* start real I/O */
io_submitted:
io_submitted:
if
(
atomic_dec_and_test
(
&
PBP
(
pb
)
->
pb_io_remaining
)
==
1
)
{
if
(
atomic_dec_and_test
(
&
pb
->
pb_io_remaining
)
==
1
)
{
pagebuf_iodone
(
pb
);
pagebuf_iodone
(
pb
,
0
);
}
else
if
((
pb
->
pb_flags
&
(
PBF_SYNC
|
PBF_ASYNC
))
==
PBF_SYNC
)
{
blk_run_queues
();
}
}
return
status
<
0
?
status
:
0
;
return
status
<
0
?
status
:
0
;
...
@@ -1465,7 +1468,7 @@ pagebuf_iowait(
...
@@ -1465,7 +1468,7 @@ pagebuf_iowait(
page_buf_t
*
pb
)
page_buf_t
*
pb
)
{
{
PB_TRACE
(
pb
,
PB_TRACE_REC
(
iowait
),
0
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
iowait
),
0
);
blk_run_queues
(
);
pagebuf_run_task_queue
(
pb
);
down
(
&
pb
->
pb_iodonesema
);
down
(
&
pb
->
pb_iodonesema
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
iowaited
),
(
int
)
pb
->
pb_error
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
iowaited
),
(
int
)
pb
->
pb_error
);
return
pb
->
pb_error
;
return
pb
->
pb_error
;
...
@@ -1709,10 +1712,10 @@ pagebuf_daemon(
...
@@ -1709,10 +1712,10 @@ pagebuf_daemon(
__pagebuf_iorequest
(
pb
);
__pagebuf_iorequest
(
pb
);
}
}
if
(
count
)
blk_run_queues
();
if
(
as_list_len
>
0
)
if
(
as_list_len
>
0
)
purge_addresses
();
purge_addresses
();
if
(
count
)
pagebuf_run_task_queue
(
NULL
);
force_flush
=
0
;
force_flush
=
0
;
}
while
(
pb_daemon
->
active
==
1
);
}
while
(
pb_daemon
->
active
==
1
);
...
@@ -1783,7 +1786,7 @@ pagebuf_delwri_flush(
...
@@ -1783,7 +1786,7 @@ pagebuf_delwri_flush(
spin_unlock
(
&
pb_daemon
->
pb_delwrite_lock
);
spin_unlock
(
&
pb_daemon
->
pb_delwrite_lock
);
blk_run_queues
(
);
pagebuf_run_task_queue
(
NULL
);
if
(
pinptr
)
if
(
pinptr
)
*
pinptr
=
pincount
;
*
pinptr
=
pincount
;
...
...
fs/xfs/pagebuf/page_buf.h
View file @
b35ed010
...
@@ -207,6 +207,7 @@ typedef struct page_buf_s {
...
@@ -207,6 +207,7 @@ typedef struct page_buf_s {
size_t
pb_count_desired
;
/* desired transfer size */
size_t
pb_count_desired
;
/* desired transfer size */
void
*
pb_addr
;
/* virtual address of buffer */
void
*
pb_addr
;
/* virtual address of buffer */
struct
work_struct
pb_iodone_work
;
struct
work_struct
pb_iodone_work
;
atomic_t
pb_io_remaining
;
/* #outstanding I/O requests */
page_buf_iodone_t
pb_iodone
;
/* I/O completion function */
page_buf_iodone_t
pb_iodone
;
/* I/O completion function */
page_buf_relse_t
pb_relse
;
/* releasing function */
page_buf_relse_t
pb_relse
;
/* releasing function */
page_buf_bdstrat_t
pb_strat
;
/* pre-write function */
page_buf_bdstrat_t
pb_strat
;
/* pre-write function */
...
@@ -306,7 +307,9 @@ static inline int pagebuf_geterror(page_buf_t *pb)
...
@@ -306,7 +307,9 @@ static inline int pagebuf_geterror(page_buf_t *pb)
}
}
extern
void
pagebuf_iodone
(
/* mark buffer I/O complete */
extern
void
pagebuf_iodone
(
/* mark buffer I/O complete */
page_buf_t
*
);
/* buffer to mark */
page_buf_t
*
,
/* buffer to mark */
int
);
/* run completion locally, or in
* a helper thread. */
extern
void
pagebuf_ioerror
(
/* mark buffer in error (or not) */
extern
void
pagebuf_ioerror
(
/* mark buffer in error (or not) */
page_buf_t
*
,
/* buffer to mark */
page_buf_t
*
,
/* buffer to mark */
...
@@ -375,6 +378,14 @@ static __inline__ int __pagebuf_iorequest(page_buf_t *pb)
...
@@ -375,6 +378,14 @@ static __inline__ int __pagebuf_iorequest(page_buf_t *pb)
return
pagebuf_iorequest
(
pb
);
return
pagebuf_iorequest
(
pb
);
}
}
static
__inline__
void
pagebuf_run_task_queue
(
page_buf_t
*
pb
)
{
if
(
pb
&&
(
atomic_read
(
&
pb
->
pb_io_remaining
)
==
0
))
return
;
blk_run_queues
();
}
extern
struct
workqueue_struct
*
pagebuf_workqueue
;
extern
struct
workqueue_struct
*
pagebuf_workqueue
;
#endif
/* __PAGE_BUF_H__ */
#endif
/* __PAGE_BUF_H__ */
fs/xfs/pagebuf/page_buf_internal.h
View file @
b35ed010
...
@@ -52,7 +52,6 @@ typedef struct page_buf_private_s {
...
@@ -52,7 +52,6 @@ typedef struct page_buf_private_s {
page_buf_t
pb_common
;
/* public part of structure */
page_buf_t
pb_common
;
/* public part of structure */
struct
semaphore
pb_sema
;
/* semaphore for lockables */
struct
semaphore
pb_sema
;
/* semaphore for lockables */
unsigned
long
pb_flushtime
;
/* time to flush pagebuf */
unsigned
long
pb_flushtime
;
/* time to flush pagebuf */
atomic_t
pb_io_remaining
;
/* #outstanding I/O requests */
atomic_t
pb_pin_count
;
/* pin count */
atomic_t
pb_pin_count
;
/* pin count */
wait_queue_head_t
pb_waiters
;
/* unpin waiters */
wait_queue_head_t
pb_waiters
;
/* unpin waiters */
#ifdef PAGEBUF_LOCK_TRACKING
#ifdef PAGEBUF_LOCK_TRACKING
...
...
fs/xfs/pagebuf/page_buf_locking.c
View file @
b35ed010
...
@@ -113,8 +113,7 @@ pagebuf_lock(
...
@@ -113,8 +113,7 @@ pagebuf_lock(
ASSERT
(
pb
->
pb_flags
&
_PBF_LOCKABLE
);
ASSERT
(
pb
->
pb_flags
&
_PBF_LOCKABLE
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
lock
),
0
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
lock
),
0
);
if
(
atomic_read
(
&
PBP
(
pb
)
->
pb_io_remaining
))
pagebuf_run_task_queue
(
pb
);
blk_run_queues
();
down
(
&
PBP
(
pb
)
->
pb_sema
);
down
(
&
PBP
(
pb
)
->
pb_sema
);
PB_SET_OWNER
(
pb
);
PB_SET_OWNER
(
pb
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
locked
),
0
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
locked
),
0
);
...
...
fs/xfs/xfs_buf.h
View file @
b35ed010
...
@@ -210,7 +210,7 @@ static inline int xfs_bawrite(void *mp, page_buf_t *bp)
...
@@ -210,7 +210,7 @@ static inline int xfs_bawrite(void *mp, page_buf_t *bp)
bp
->
pb_strat
=
xfs_bdstrat_cb
;
bp
->
pb_strat
=
xfs_bdstrat_cb
;
xfs_buf_undelay
(
bp
);
xfs_buf_undelay
(
bp
);
if
((
ret
=
pagebuf_iostart
(
bp
,
PBF_WRITE
|
PBF_ASYNC
))
==
0
)
if
((
ret
=
pagebuf_iostart
(
bp
,
PBF_WRITE
|
PBF_ASYNC
))
==
0
)
blk_run_queues
(
);
pagebuf_run_task_queue
(
bp
);
return
ret
;
return
ret
;
}
}
...
@@ -236,7 +236,7 @@ static inline void xfs_buf_relse(page_buf_t *bp)
...
@@ -236,7 +236,7 @@ static inline void xfs_buf_relse(page_buf_t *bp)
#define xfs_biodone(pb) \
#define xfs_biodone(pb) \
pagebuf_iodone(pb)
pagebuf_iodone(pb
, 0
)
#define xfs_incore(buftarg,blkno,len,lockit) \
#define xfs_incore(buftarg,blkno,len,lockit) \
pagebuf_find(buftarg, blkno ,len, lockit)
pagebuf_find(buftarg, blkno ,len, lockit)
...
@@ -265,7 +265,7 @@ static inline int XFS_bwrite(page_buf_t *pb)
...
@@ -265,7 +265,7 @@ static inline int XFS_bwrite(page_buf_t *pb)
error
=
pagebuf_iowait
(
pb
);
error
=
pagebuf_iowait
(
pb
);
xfs_buf_relse
(
pb
);
xfs_buf_relse
(
pb
);
}
else
{
}
else
{
blk_run_queues
(
);
pagebuf_run_task_queue
(
pb
);
error
=
0
;
error
=
0
;
}
}
...
...
fs/xfs/xfsidbg.c
View file @
b35ed010
...
@@ -1824,7 +1824,8 @@ kdbm_pb(int argc, const char **argv, const char **envp, struct pt_regs *regs)
...
@@ -1824,7 +1824,8 @@ kdbm_pb(int argc, const char **argv, const char **envp, struct pt_regs *regs)
bp
.
pb_common
.
pb_bn
,
bp
.
pb_common
.
pb_bn
,
(
unsigned
long
)
bp
.
pb_common
.
pb_count_desired
);
(
unsigned
long
)
bp
.
pb_common
.
pb_count_desired
);
kdb_printf
(
" pb_io_remaining %d pb_error %u
\n
"
,
kdb_printf
(
" pb_io_remaining %d pb_error %u
\n
"
,
bp
.
pb_io_remaining
.
counter
,
bp
.
pb_common
.
pb_error
);
bp
.
pb_common
.
pb_io_remaining
.
counter
,
bp
.
pb_common
.
pb_error
);
kdb_printf
(
" pb_page_count %u pb_offset 0x%x pb_pages 0x%p
\n
"
,
kdb_printf
(
" pb_page_count %u pb_offset 0x%x pb_pages 0x%p
\n
"
,
bp
.
pb_common
.
pb_page_count
,
bp
.
pb_common
.
pb_offset
,
bp
.
pb_common
.
pb_page_count
,
bp
.
pb_common
.
pb_offset
,
bp
.
pb_common
.
pb_pages
);
bp
.
pb_common
.
pb_pages
);
...
...
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