Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: wapbl panic on new system with too much memory!



paul%whooppee.com@localhost (Paul Goyette) writes:

>In any case, if the bp->b_flags access needs to be protected by the 
>mutex, a cursory grep shows that there are some other places that might 
>need similar treatment, in wapbl_do_io(), wapbl_resize_buf(), and 
>wapbl_write_blocks().

Not b_flags, just the B_LOCKED flag which is abused as a "is already
in wl_bufs list" marker.

These are the two operations that need to be protected:

add_buf:
	if (B_LOCKED) {
		remove from wl_bufs
	} else {
		do accounting for that buf
	}
	add to wl_bufs
	set B_LOCKED

remove_buf:
	remove from wl_bufs
	clear B_LOCKED


wapbl_resize_buf apparently assumes that it cannot be
called concurrently with wapbl_remove_buf. That should
be ok since add_buf/remove_buf/resize_buf are just
additions to vfs_bio functions.

bdwrite()  -> WAPBL_ADD_BUF
brelsel()  -> WAPBL_REMOVE_BUF
allocbuf() -> WAPBL_RESIZE_BUF

I doubt that allocbuf() and brelsel() run concurrently on
the same buffer.


wapbl_doio only initializes the flags in a new buffer. That's
not relevant.

wapbl_write_blocks iterates over the whole wl_bufs list
and uses wl_rwlock to protect it. But is that sufficient?



-- 
-- 
                                Michael van Elst
Internet: mlelstv%serpens.de@localhost
                                "A potential Snark may lurk in every tree."


Home | Main Index | Thread Index | Old Index