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
d831e5a2
Commit
d831e5a2
authored
May 25, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
160cc4eb
5209a2ab
Changes
13
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
114 additions
and
97 deletions
+114
-97
arch/ppc64/kernel/xics.c
arch/ppc64/kernel/xics.c
+1
-1
drivers/ide/ide-disk.c
drivers/ide/ide-disk.c
+16
-26
drivers/ide/ide-iops.c
drivers/ide/ide-iops.c
+4
-4
drivers/ide/ide-probe.c
drivers/ide/ide-probe.c
+17
-18
drivers/ide/ide.c
drivers/ide/ide.c
+0
-20
drivers/ide/legacy/pdc4030.c
drivers/ide/legacy/pdc4030.c
+2
-8
include/asm-generic/pgtable.h
include/asm-generic/pgtable.h
+21
-9
include/asm-i386/pgtable.h
include/asm-i386/pgtable.h
+7
-3
include/asm-ppc/pgtable.h
include/asm-ppc/pgtable.h
+10
-0
include/asm-ppc64/pgtable.h
include/asm-ppc64/pgtable.h
+32
-3
include/asm-s390/pgtable.h
include/asm-s390/pgtable.h
+1
-1
include/linux/ide.h
include/linux/ide.h
+0
-1
mm/memory.c
mm/memory.c
+3
-3
No files found.
arch/ppc64/kernel/xics.c
View file @
d831e5a2
...
...
@@ -620,7 +620,7 @@ static void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
cpumask_t
tmp
=
CPU_MASK_NONE
;
irq
=
virt_irq_to_real
(
irq_offset_down
(
virq
));
if
(
irq
==
XICS_IPI
)
if
(
irq
==
XICS_IPI
||
irq
==
NO_IRQ
)
return
;
status
=
rtas_call
(
ibm_get_xive
,
1
,
3
,
(
void
*
)
&
xics_status
,
irq
);
...
...
drivers/ide/ide-disk.c
View file @
d831e5a2
...
...
@@ -358,13 +358,6 @@ ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector
nsectors
.
all
=
(
u16
)
rq
->
nr_sectors
;
if
(
drive
->
using_tcq
&&
idedisk_start_tag
(
drive
,
rq
))
{
if
(
!
ata_pending_commands
(
drive
))
BUG
();
return
ide_started
;
}
if
(
IDE_CONTROL_REG
)
hwif
->
OUTB
(
drive
->
ctl
,
IDE_CONTROL_REG
);
...
...
@@ -482,7 +475,7 @@ ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector
((
lba48
)
?
WIN_READ_EXT
:
WIN_READ
));
ide_execute_command
(
drive
,
command
,
&
read_intr
,
WAIT_CMD
,
NULL
);
return
ide_started
;
}
else
if
(
rq_data_dir
(
rq
)
==
WRITE
)
{
}
else
{
ide_startstop_t
startstop
;
#ifdef CONFIG_BLK_DEV_IDE_TCQ
if
(
blk_rq_tagged
(
rq
))
...
...
@@ -520,9 +513,6 @@ ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector
}
return
ide_started
;
}
blk_dump_rq_flags
(
rq
,
"__ide_do_rw_disk - bad command"
);
ide_end_request
(
drive
,
0
,
0
);
return
ide_stopped
;
}
EXPORT_SYMBOL_GPL
(
__ide_do_rw_disk
);
...
...
@@ -539,26 +529,11 @@ static ide_startstop_t lba_48_rw_disk(ide_drive_t *, struct request *, unsigned
*/
ide_startstop_t
__ide_do_rw_disk
(
ide_drive_t
*
drive
,
struct
request
*
rq
,
sector_t
block
)
{
BUG_ON
(
drive
->
blocked
);
if
(
!
blk_fs_request
(
rq
))
{
blk_dump_rq_flags
(
rq
,
"__ide_do_rw_disk - bad command"
);
ide_end_request
(
drive
,
0
,
0
);
return
ide_stopped
;
}
/*
* 268435455 == 137439 MB or 28bit limit
*
* need to add split taskfile operations based on 28bit threshold.
*/
if
(
drive
->
using_tcq
&&
idedisk_start_tag
(
drive
,
rq
))
{
if
(
!
ata_pending_commands
(
drive
))
BUG
();
return
ide_started
;
}
if
(
drive
->
addressing
==
1
)
/* 48-bit LBA */
return
lba_48_rw_disk
(
drive
,
rq
,
(
unsigned
long
long
)
block
);
if
(
drive
->
select
.
b
.
lba
)
/* 28-bit LBA */
...
...
@@ -734,6 +709,21 @@ static ide_startstop_t ide_do_rw_disk (ide_drive_t *drive, struct request *rq, s
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
BUG_ON
(
drive
->
blocked
);
if
(
!
blk_fs_request
(
rq
))
{
blk_dump_rq_flags
(
rq
,
"ide_do_rw_disk - bad command"
);
ide_end_request
(
drive
,
0
,
0
);
return
ide_stopped
;
}
if
(
drive
->
using_tcq
&&
idedisk_start_tag
(
drive
,
rq
))
{
if
(
!
ata_pending_commands
(
drive
))
BUG
();
return
ide_started
;
}
if
(
hwif
->
rw_disk
)
return
hwif
->
rw_disk
(
drive
,
rq
,
block
);
else
...
...
drivers/ide/ide-iops.c
View file @
d831e5a2
...
...
@@ -767,7 +767,7 @@ int ide_driveid_update (ide_drive_t *drive)
SELECT_MASK
(
drive
,
1
);
if
(
IDE_CONTROL_REG
)
hwif
->
OUTB
(
drive
->
ctl
,
IDE_CONTROL_REG
);
ide_delay_50ms
(
);
msleep
(
50
);
hwif
->
OUTB
(
WIN_IDENTIFY
,
IDE_COMMAND_REG
);
timeout
=
jiffies
+
WAIT_WORSTCASE
;
do
{
...
...
@@ -775,9 +775,9 @@ int ide_driveid_update (ide_drive_t *drive)
SELECT_MASK
(
drive
,
0
);
return
0
;
/* drive timed-out */
}
ide_delay_50ms
(
);
/* give drive a breather */
msleep
(
50
);
/* give drive a breather */
}
while
(
hwif
->
INB
(
IDE_ALTSTATUS_REG
)
&
BUSY_STAT
);
ide_delay_50ms
(
);
/* wait for IRQ and DRQ_STAT */
msleep
(
50
);
/* wait for IRQ and DRQ_STAT */
if
(
!
OK_STAT
(
hwif
->
INB
(
IDE_STATUS_REG
),
DRQ_STAT
,
BAD_R_STAT
))
{
SELECT_MASK
(
drive
,
0
);
printk
(
"%s: CHECK for good STATUS
\n
"
,
drive
->
name
);
...
...
@@ -827,7 +827,7 @@ int ide_config_drive_speed (ide_drive_t *drive, u8 speed)
u8
stat
;
// while (HWGROUP(drive)->busy)
//
ide_delay_50ms(
);
//
msleep(50
);
#ifdef CONFIG_BLK_DEV_IDEDMA
if
(
hwif
->
ide_dma_check
)
/* check if host supports DMA */
...
...
drivers/ide/ide-probe.c
View file @
d831e5a2
...
...
@@ -283,9 +283,10 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
unsigned
long
timeout
;
u8
s
=
0
,
a
=
0
;
if
(
IDE_CONTROL_REG
)
{
/* take a deep breath */
ide_delay_50ms
();
msleep
(
50
);
if
(
IDE_CONTROL_REG
)
{
a
=
hwif
->
INB
(
IDE_ALTSTATUS_REG
);
s
=
hwif
->
INB
(
IDE_STATUS_REG
);
if
((
a
^
s
)
&
~
INDEX_STAT
)
{
...
...
@@ -297,10 +298,8 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
/* use non-intrusive polling */
hd_status
=
IDE_ALTSTATUS_REG
;
}
}
else
{
ide_delay_50ms
();
}
else
hd_status
=
IDE_STATUS_REG
;
}
/* set features register for atapi
* identify command to be sure of reply
...
...
@@ -324,11 +323,11 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
return
1
;
}
/* give drive a breather */
ide_delay_50ms
(
);
msleep
(
50
);
}
while
((
hwif
->
INB
(
hd_status
))
&
BUSY_STAT
);
/* wait for IRQ and DRQ_STAT */
ide_delay_50ms
(
);
msleep
(
50
);
if
(
OK_STAT
((
hwif
->
INB
(
IDE_STATUS_REG
)),
DRQ_STAT
,
BAD_R_STAT
))
{
unsigned
long
flags
;
...
...
@@ -457,15 +456,15 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
/* needed for some systems
* (e.g. crw9624 as drive0 with disk as slave)
*/
ide_delay_50ms
(
);
msleep
(
50
);
SELECT_DRIVE
(
drive
);
ide_delay_50ms
(
);
msleep
(
50
);
if
(
hwif
->
INB
(
IDE_SELECT_REG
)
!=
drive
->
select
.
all
&&
!
drive
->
present
)
{
if
(
drive
->
select
.
b
.
unit
!=
0
)
{
/* exit with drive0 selected */
SELECT_DRIVE
(
&
hwif
->
drives
[
0
]);
/* allow BUSY_STAT to assert & clear */
ide_delay_50ms
(
);
msleep
(
50
);
}
/* no i/f present: mmm.. this should be a 4 -ml */
return
3
;
...
...
@@ -488,14 +487,14 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
printk
(
"%s: no response (status = 0x%02x), "
"resetting drive
\n
"
,
drive
->
name
,
hwif
->
INB
(
IDE_STATUS_REG
));
ide_delay_50ms
(
);
msleep
(
50
);
hwif
->
OUTB
(
drive
->
select
.
all
,
IDE_SELECT_REG
);
ide_delay_50ms
(
);
msleep
(
50
);
hwif
->
OUTB
(
WIN_SRST
,
IDE_COMMAND_REG
);
timeout
=
jiffies
;
while
(((
hwif
->
INB
(
IDE_STATUS_REG
))
&
BUSY_STAT
)
&&
time_before
(
jiffies
,
timeout
+
WAIT_WORSTCASE
))
ide_delay_50ms
(
);
msleep
(
50
);
rc
=
try_to_identify
(
drive
,
cmd
);
}
if
(
rc
==
1
)
...
...
@@ -510,7 +509,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
if
(
drive
->
select
.
b
.
unit
!=
0
)
{
/* exit with drive0 selected */
SELECT_DRIVE
(
&
hwif
->
drives
[
0
]);
ide_delay_50ms
(
);
msleep
(
50
);
/* ensure drive irq is clear */
(
void
)
hwif
->
INB
(
IDE_STATUS_REG
);
}
...
...
@@ -527,7 +526,7 @@ static void enable_nest (ide_drive_t *drive)
printk
(
"%s: enabling %s -- "
,
hwif
->
name
,
drive
->
id
->
model
);
SELECT_DRIVE
(
drive
);
ide_delay_50ms
(
);
msleep
(
50
);
hwif
->
OUTB
(
EXABYTE_ENABLE_NEST
,
IDE_COMMAND_REG
);
timeout
=
jiffies
+
WAIT_WORSTCASE
;
do
{
...
...
@@ -535,10 +534,10 @@ static void enable_nest (ide_drive_t *drive)
printk
(
"failed (timeout)
\n
"
);
return
;
}
ide_delay_50ms
(
);
msleep
(
50
);
}
while
((
hwif
->
INB
(
IDE_STATUS_REG
))
&
BUSY_STAT
);
ide_delay_50ms
(
);
msleep
(
50
);
if
(
!
OK_STAT
((
hwif
->
INB
(
IDE_STATUS_REG
)),
0
,
BAD_STAT
))
{
printk
(
"failed (status = 0x%02x)
\n
"
,
hwif
->
INB
(
IDE_STATUS_REG
));
...
...
@@ -781,7 +780,7 @@ void probe_hwif (ide_hwif_t *hwif)
udelay
(
10
);
hwif
->
OUTB
(
8
,
hwif
->
io_ports
[
IDE_CONTROL_OFFSET
]);
do
{
ide_delay_50ms
(
);
msleep
(
50
);
stat
=
hwif
->
INB
(
hwif
->
io_ports
[
IDE_STATUS_OFFSET
]);
}
while
((
stat
&
BUSY_STAT
)
&&
time_after
(
timeout
,
jiffies
));
...
...
drivers/ide/ide.c
View file @
d831e5a2
...
...
@@ -1387,26 +1387,6 @@ void ide_add_generic_settings (ide_drive_t *drive)
ide_add_setting
(
drive
,
"ide-scsi"
,
SETTING_RW
,
-
1
,
HDIO_SET_IDE_SCSI
,
TYPE_BYTE
,
0
,
1
,
1
,
1
,
&
drive
->
scsi
,
ide_atapi_to_scsi
);
}
/*
* Delay for *at least* 50ms. As we don't know how much time is left
* until the next tick occurs, we wait an extra tick to be safe.
* This is used only during the probing/polling for drives at boot time.
*
* However, its usefullness may be needed in other places, thus we export it now.
* The future may change this to a millisecond setable delay.
*/
void
ide_delay_50ms
(
void
)
{
#ifndef CONFIG_BLK_DEV_IDECS
mdelay
(
50
);
#else
__set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
(
1
+
HZ
/
20
);
#endif
/* CONFIG_BLK_DEV_IDECS */
}
EXPORT_SYMBOL
(
ide_delay_50ms
);
int
system_bus_clock
(
void
)
{
return
((
int
)
((
!
system_bus_speed
)
?
ide_system_bus_speed
()
:
system_bus_speed
));
...
...
drivers/ide/legacy/pdc4030.c
View file @
d831e5a2
...
...
@@ -283,7 +283,7 @@ int __init detect_pdc4030(ide_hwif_t *hwif)
hwif
->
OUTB
(
0x14
,
IDE_SELECT_REG
);
hwif
->
OUTB
(
PROMISE_EXTENDED_COMMAND
,
IDE_COMMAND_REG
);
ide_delay_50ms
(
);
msleep
(
50
);
if
(
hwif
->
INB
(
IDE_ERROR_REG
)
==
'P'
&&
hwif
->
INB
(
IDE_NSECTOR_REG
)
==
'T'
&&
...
...
@@ -756,12 +756,6 @@ static ide_startstop_t promise_rw_disk (ide_drive_t *drive, struct request *rq,
BUG_ON
(
rq
->
nr_sectors
>
127
);
if
(
!
blk_fs_request
(
rq
))
{
blk_dump_rq_flags
(
rq
,
"promise_rw_disk - bad command"
);
DRIVER
(
drive
)
->
end_request
(
drive
,
0
,
0
);
return
ide_stopped
;
}
#ifdef DEBUG
printk
(
KERN_DEBUG
"%s: %sing: LBAsect=%lu, sectors=%lu
\n
"
,
drive
->
name
,
rq_data_dir
(
rq
)
?
"writ"
:
"read"
,
...
...
include/asm-generic/pgtable.h
View file @
d831e5a2
...
...
@@ -2,22 +2,34 @@
#define _ASM_GENERIC_PGTABLE_H
#ifndef __HAVE_ARCH_PTEP_ESTABLISH
#ifndef ptep_update_dirty_accessed
#define ptep_update_dirty_accessed(__ptep, __entry, __dirty) set_pte(__ptep, __entry)
#endif
/*
* Establish a new mapping:
* - flush the old one
* - update the page tables
* - inform the TLB about the new one
*
* We hold the mm semaphore for reading and vma->vm_mm->page_table_lock
* We hold the mm semaphore for reading and vma->vm_mm->page_table_lock.
*
* Note: the old pte is known to not be writable, so we don't need to
* worry about dirty bits etc getting lost.
*/
#define ptep_establish(__vma, __address, __ptep, __entry) \
do { \
set_pte(__ptep, __entry); \
flush_tlb_page(__vma, __address); \
} while (0)
#endif
#ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
/*
* Largely same as above, but only sets the access flags (dirty,
* accessed, and writable). Furthermore, we know it always gets set
* to a "more permissive" setting, which allows most architectures
* to optimize this.
*/
#define ptep_
establish(__vma, __address, __ptep, __entry, __dirty)
\
#define ptep_
set_access_flags(__vma, __address, __ptep, __entry, __dirty)
\
do { \
ptep_update_dirty_accessed(__ptep, __entry, __dirty);
\
set_pte(__ptep, __entry);
\
flush_tlb_page(__vma, __address); \
} while (0)
#endif
...
...
include/asm-i386/pgtable.h
View file @
d831e5a2
...
...
@@ -325,9 +325,13 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
* bit at the same time.
*/
#define update_mmu_cache(vma,address,pte) do { } while (0)
#define ptep_update_dirty_accessed(__ptep, __entry, __dirty) \
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
do { \
if (__dirty) set_pte(__ptep, __entry); \
if (__dirty) { \
(__ptep)->pte_low = (__entry).pte_low; \
flush_tlb_page(__vma, __address); \
} \
} while (0)
/* Encode and de-code a swap entry */
...
...
include/asm-ppc/pgtable.h
View file @
d831e5a2
...
...
@@ -548,6 +548,16 @@ static inline void ptep_mkdirty(pte_t *ptep)
pte_update
(
ptep
,
0
,
_PAGE_DIRTY
);
}
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
static
inline
void
__ptep_set_access_flags
(
pte_t
*
ptep
,
pte_t
entry
,
int
dirty
)
{
unsigned
long
bits
=
pte_val
(
entry
)
&
(
_PAGE_DIRTY
|
_PAGE_ACCESSED
|
_PAGE_RW
);
pte_update
(
ptep
,
0
,
bits
);
}
#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
__ptep_set_access_flags(__ptep, __entry, __dirty)
/*
* Macro to mark a page protection value as "uncacheable".
*/
...
...
include/asm-ppc64/pgtable.h
View file @
d831e5a2
...
...
@@ -306,7 +306,10 @@ static inline unsigned long pte_update(pte_t *p, unsigned long clr)
return
old
;
}
/* PTE updating functions */
/* PTE updating functions, this function puts the PTE in the
* batch, doesn't actually triggers the hash flush immediately,
* you need to call flush_tlb_pending() to do that.
*/
extern
void
hpte_update
(
pte_t
*
ptep
,
unsigned
long
pte
,
int
wrprot
);
static
inline
int
ptep_test_and_clear_young
(
pte_t
*
ptep
)
...
...
@@ -318,7 +321,7 @@ static inline int ptep_test_and_clear_young(pte_t *ptep)
old
=
pte_update
(
ptep
,
_PAGE_ACCESSED
);
if
(
old
&
_PAGE_HASHPTE
)
{
hpte_update
(
ptep
,
old
,
0
);
flush_tlb_pending
();
/* XXX generic code doesn't flush */
flush_tlb_pending
();
}
return
(
old
&
_PAGE_ACCESSED
)
!=
0
;
}
...
...
@@ -396,11 +399,37 @@ static inline void pte_clear(pte_t * ptep)
*/
static
inline
void
set_pte
(
pte_t
*
ptep
,
pte_t
pte
)
{
if
(
pte_present
(
*
ptep
))
if
(
pte_present
(
*
ptep
))
{
pte_clear
(
ptep
);
flush_tlb_pending
();
}
*
ptep
=
__pte
(
pte_val
(
pte
))
&
~
_PAGE_HPTEFLAGS
;
}
/* Set the dirty and/or accessed bits atomically in a linux PTE, this
* function doesn't need to flush the hash entry
*/
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
static
inline
void
__ptep_set_access_flags
(
pte_t
*
ptep
,
pte_t
entry
,
int
dirty
)
{
unsigned
long
bits
=
pte_val
(
entry
)
&
(
_PAGE_DIRTY
|
_PAGE_ACCESSED
|
_PAGE_RW
);
unsigned
long
old
,
tmp
;
__asm__
__volatile__
(
"1: ldarx %0,0,%4
\n
\
andi. %1,%0,%6
\n
\
bne- 1b
\n
\
or %0,%3,%0
\n
\
stdcx. %0,0,%4
\n
\
bne- 1b"
:
"=&r"
(
old
),
"=&r"
(
tmp
),
"=m"
(
*
ptep
)
:
"r"
(
bits
),
"r"
(
ptep
),
"m"
(
ptep
),
"i"
(
_PAGE_BUSY
)
:
"cc"
);
}
#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
__ptep_set_access_flags(__ptep, __entry, __dirty)
/*
* Macro to mark a page protection value as "uncacheable".
*/
...
...
include/asm-s390/pgtable.h
View file @
d831e5a2
...
...
@@ -581,7 +581,7 @@ static inline void ptep_mkdirty(pte_t *ptep)
static
inline
void
ptep_establish
(
struct
vm_area_struct
*
vma
,
unsigned
long
address
,
pte_t
*
ptep
,
pte_t
entry
,
int
dirty
)
pte_t
entry
)
{
ptep_clear_flush
(
vma
,
address
,
ptep
);
set_pte
(
ptep
,
entry
);
...
...
include/linux/ide.h
View file @
d831e5a2
...
...
@@ -1477,7 +1477,6 @@ int ide_taskfile_ioctl(ide_drive_t *, unsigned int, unsigned long);
int
ide_cmd_ioctl
(
ide_drive_t
*
,
unsigned
int
,
unsigned
long
);
int
ide_task_ioctl
(
ide_drive_t
*
,
unsigned
int
,
unsigned
long
);
extern
void
ide_delay_50ms
(
void
);
extern
int
system_bus_clock
(
void
);
extern
u8
ide_auto_reduce_xfer
(
ide_drive_t
*
);
...
...
mm/memory.c
View file @
d831e5a2
...
...
@@ -1004,7 +1004,7 @@ static inline void break_cow(struct vm_area_struct * vma, struct page * new_page
flush_cache_page
(
vma
,
address
);
entry
=
maybe_mkwrite
(
pte_mkdirty
(
mk_pte
(
new_page
,
vma
->
vm_page_prot
)),
vma
);
ptep_establish
(
vma
,
address
,
page_table
,
entry
,
1
);
ptep_establish
(
vma
,
address
,
page_table
,
entry
);
update_mmu_cache
(
vma
,
address
,
entry
);
}
...
...
@@ -1056,7 +1056,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,
flush_cache_page
(
vma
,
address
);
entry
=
maybe_mkwrite
(
pte_mkyoung
(
pte_mkdirty
(
pte
)),
vma
);
ptep_
establish
(
vma
,
address
,
page_table
,
entry
,
1
);
ptep_
set_access_flags
(
vma
,
address
,
page_table
,
entry
,
1
);
update_mmu_cache
(
vma
,
address
,
entry
);
pte_unmap
(
page_table
);
spin_unlock
(
&
mm
->
page_table_lock
);
...
...
@@ -1646,7 +1646,7 @@ static inline int handle_pte_fault(struct mm_struct *mm,
entry
=
pte_mkdirty
(
entry
);
}
entry
=
pte_mkyoung
(
entry
);
ptep_
establish
(
vma
,
address
,
pte
,
entry
,
write_access
);
ptep_
set_access_flags
(
vma
,
address
,
pte
,
entry
,
write_access
);
update_mmu_cache
(
vma
,
address
,
entry
);
pte_unmap
(
pte
);
spin_unlock
(
&
mm
->
page_table_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