Come to think of it, the meta page can hold some freelist info. mdb_txn_commit() can hopefully decide at some point that its current freelist is what gets written to the freeDB. Further changes go to an amendment in the meta page. "Stolen oldpages" info goes there, not in the freeDB.
Next write-transaction initializes oldpages and mt_free_pgs from the meta page. Those mt_free_pgs pages become reusable one transaction later than they do today.
MDB_RDONLY txns will not copy MDB_meta.mm_dbs[FREE_DBI] and can no longer read the freeDB. Unless they get an MDB_STAT flag for use by ./mdb_stat & co. Seems a good place to move the complexity since it happens rarely. Maybe that'd create a readonly txn with the structure of a write txn so the freelist can be used and and mdb_stat0()ed.
Could use the opportunity to align mm_dbs[MAIN_DBI] with a cache line. Then the variable metadata a readonly txn copies, will all come from one cache line.