tech-kern archive

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

Re: Anonymous vnodes?



> Date: Tue, 27 Jun 2023 16:27:34 -0400
> From: Theodore Preduta <theo%pta.gg@localhost>
> 
> On 2023-06-26 20:03, Taylor R Campbell wrote:
> > For a syscall, you should implement it in terms of uvm anonymous
> > objects:
> 
> Is there a preexisting way to resize a uvm_object?  Or do I need to
> write a function similar (but not really that similar) to uvm_vnp_setsize?

Hmm, yes, it looks like we will need a uao_setsize operation.

Here's a quick hack:

1. New flag UAO_FLAG_RESIZABLE.  In uao_create and others, always use
   a max-size u_swhash table when this flag is set, so we don't have
   to worry about resizing u_swslots array, rehashing u_swhash, or
   converting between array and hash table.  Not ideal but it'll do
   without much effort.

2. Define uao_resize to:
   (a) assert UAO_FLAG_RESIZABLE is set;
   (b) if truncating: uao_put the parts that will be discarded, from
       round_page(newsize) to oldsize, with PGO_FREE; and
   (c) update u_pages,
   all under a write-lock on uobj->vmobjlock.

Then .fo_write and .fo_truncate can just do uao_setsize -- or at
least, .fo_truncate could do that if it existed!  Currently
sys_ftruncate is vnode-specific, so we'll need to introduce a new
.fo_truncate fileops member like we've done for various other things
recently like .fo_seek, .fo_advlock, &c.:

https://mail-index.netbsd.org/source-changes-hg/2023/04/22/msg364655.html
https://mail-index.netbsd.org/source-changes-hg/2023/04/22/msg364656.html
https://mail-index.netbsd.org/source-changes-hg/2023/04/22/msg364657.html


P.S.  I wonder whether this procedure is racy -- uao_put can drop the
lock; what happens if a concurrent uao_get/put swoops in while the
lock is dropped?  But uvm_vnp_setsize must have the same issue, since
uvn_put can drop the lock too.  So if there is a problem here, it'll
probably be easier if the logic is essentially the same, so that it
can be fixed in both of them the same way.


Home | Main Index | Thread Index | Old Index