Re: [lc-devel] Announce: Compressed cache alpha-007 (kernel 2.6.18)
Status: Beta
Brought to you by:
nitin_sf
From: Peter Z. <a.p...@ch...> - 2006-09-20 14:37:55
|
On Wed, 2006-09-20 at 19:34 +0530, Nitin Gupta wrote: > Peter Zijlstra wrote: > > On Wed, 2006-09-20 at 18:23 +0530, Nitin Gupta wrote: > > > >>> Don't like the bit_spin_trylock/bit_spin_unlock in handle_ccache_fault; > >>> what's wrong with TestSetPageLocked() and unlock_page() ? > >>> > >> If (PageCompressed(page)) is true then 'page' is 'struct chunk_head' > >> not 'struct page' and you cannot use unlock_page() on chunk_head. > > > > ClearPageLocked() > > > > But then how will you do equivalent of wait_on_chunk_head() ? Doh, now I see, its not &page->flags but &ch->flags. Humm, you'd need to open code this I think, bit_spin_trylock() may not be ordered strong enough (on !x86). Got my head in a twist, but I think this is correct: static inline int chunk_head_trylock(struct chunk_head *ch) { int locked = test_set_bit(PG_locked, &ch->flags); if (!locked) smb_wmb(); return !locked; } static inline void chunk_head_unlock(struct chunk_head *ch) { int locked; smp_wmb(); locked = test_clear_bit(PG_locked, &ch->flags); BUG_ON(!locked); } static inline int chunk_head_wait(struct chunk_head *ch) { while (test_bit(PG_locked, &ch->flags)) relax_cpu(); smp_rmb(); } |