Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
W
wendelin.core
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
Joshua
wendelin.core
Commits
a3299f60
Commit
a3299f60
authored
Jul 09, 2019
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
8cbc77ab
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
49 additions
and
12 deletions
+49
-12
Makefile
Makefile
+2
-1
bigfile/tests/test_virtmem.c
bigfile/tests/test_virtmem.c
+21
-0
bigfile/virtmem.c
bigfile/virtmem.c
+26
-11
No files found.
Makefile
View file @
a3299f60
...
...
@@ -96,7 +96,8 @@ LINKC = $(LINK.c) $< $(LOADLIBES) $(LDLIBS) -o $@
# tests without instrumentation
test.t
:
$(TESTS:%=%.trun)
%.trun
:
%.t
gdb
-q
-ex
run
-ex
backtrace
-ex
quit
$
(
XRUN<
)
#gdb -q -ex run -ex backtrace -ex quit
$
(
XRUN<
)
$
(
XRUN<
)
%.t
:
%.c $(ccan_config)
$(LINKC)
...
...
bigfile/tests/test_virtmem.c
View file @
a3299f60
...
...
@@ -1179,11 +1179,15 @@ void test_file_access_mmapbase(void)
RAM
*
ram
;
BigFileH
fh_struct
,
*
fh
=
&
fh_struct
;
VMA
vma_struct
,
*
vma
=
&
vma_struct
;
Page
*
page0
,
*
page2
,
*
page3
;
size_t
PS
,
PSb
;
int
fd
,
err
;
diag
(
"Testing file access (mmap base)"
);
// XXX save/restore sigaction ?
ok1
(
!
pagefault_init
());
ram
=
ram_new
(
NULL
,
NULL
);
ok1
(
ram
);
PS
=
ram
->
pagesize
;
...
...
@@ -1243,6 +1247,7 @@ void test_file_access_mmapbase(void)
ok1
(
!
M
(
vma
,
3
));
CHECK_NOPAGE
(
103
);
ok1
(
list_empty
(
&
ram
->
lru_list
));
ok1
(
list_empty
(
&
fh
->
dirty_pages
));
/* read page[0] - served from base mmap and no RAM page is loaded */
ok1
(
B
(
vma
,
0
*
PSb
)
==
100
);
...
...
@@ -1251,6 +1256,22 @@ void test_file_access_mmapbase(void)
ok1
(
!
M
(
vma
,
1
));
CHECK_NOPAGE
(
101
);
ok1
(
!
M
(
vma
,
2
));
CHECK_NOPAGE
(
102
);
ok1
(
!
M
(
vma
,
3
));
CHECK_NOPAGE
(
103
);
ok1
(
list_empty
(
&
ram
->
lru_list
));
ok1
(
list_empty
(
&
fh
->
dirty_pages
));
/* write to page[2] = XXX */
B
(
vma
,
2
*
PSb
)
=
12
;
page2
=
pagemap_get
(
&
fh
->
pagemap
,
102
);
ok1
(
!
M
(
vma
,
0
));
CHECK_NOPAGE
(
100
);
ok1
(
!
M
(
vma
,
1
));
CHECK_NOPAGE
(
101
);
ok1
(
M
(
vma
,
2
));
CHECK_PAGE
(
page2
,
102
,
PAGE_DIRTY
,
1
);
ok1
(
!
M
(
vma
,
3
));
CHECK_NOPAGE
(
103
);
ok1
(
ram
->
lru_list
.
prev
==
&
page2
->
lru
);
ok1
(
page2
->
lru
.
prev
==
&
ram
->
lru_list
);
}
...
...
bigfile/virtmem.c
View file @
a3299f60
...
...
@@ -615,7 +615,9 @@ VMFaultResult vma_on_pagefault(VMA *vma, uintptr_t addr, int write)
/* continuing on_pagefault() - see (1) there ... */
// XXX overlay: assert write
/* wcfs: we should get into SIGSEGV handler only on write access */
if
(
vma
->
mmap_overlay
)
BUG_ON
(
!
write
);
/* (2) vma, addr -> fileh, pagen ;idx of fileh page covering addr */
fileh
=
vma
->
fileh
;
...
...
@@ -624,7 +626,12 @@ VMFaultResult vma_on_pagefault(VMA *vma, uintptr_t addr, int write)
/* (3) fileh, pagen -> page (via pagemap) */
page
=
pagemap_get
(
&
fileh
->
pagemap
,
pagen
);
// XXX overlay: assert !page
/* wcfs: all dirty pages are mmapped when vma is created */
// FIXME no: it could be in PAGE_LOADING state
// XXX and after VM_RETRY it could be in PAGE_LOADED state
// XXX ----//---- even for write
if
(
vma
->
mmap_overlay
)
BUG_ON
(
page
);
/* (4) no page found - allocate new from ram */
while
(
!
page
)
{
...
...
@@ -697,7 +704,7 @@ VMFaultResult vma_on_pagefault(VMA *vma, uintptr_t addr, int write)
// XXX overlay: copy data from base image, page.state=DIRTY
// XXX overlay: goto inject_page
/* load
blk()
-> pageram memory */
/* load
block
-> pageram memory */
blk
=
page
->
f_pgoffset
;
// NOTE because blksize = pagesize
/* mark page as loading and unlock virtmem before calling loadblk()
...
...
@@ -709,15 +716,23 @@ VMFaultResult vma_on_pagefault(VMA *vma, uintptr_t addr, int write)
page
->
state
=
PAGE_LOADING
;
virt_unlock
();
err
=
file
->
file_ops
->
loadblk
(
file
,
blk
,
pageram
);
if
(
vma
->
mmap_overlay
)
{
/* wcfs: copy block data from read-only base mmap.
* NOTE we'll get SIGBUG here if wcfs returns EIO when loading block data */
memcpy
(
pageram
,
vma_page_addr
(
vma
,
page
),
page_size
(
page
));
}
else
{
/* !wcfs: call loadblk */
err
=
file
->
file_ops
->
loadblk
(
file
,
blk
,
pageram
);
/* TODO on error -> try to throw exception somehow to the caller, so
* that it can abort current transaction, but not die.
*
* NOTE for analogue situation when read for mmaped file fails, the
* kernel sends SIGBUS
*/
TODO
(
err
);
/* TODO on error -> try to throw exception somehow to the caller, so
* that it can abort current transaction, but not die.
*
* NOTE for analogue situation when read for mmaped file fails, the
* kernel sends SIGBUS
*/
TODO
(
err
);
}
/* relock virtmem */
virt_lock
();
...
...
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