Avoid multiple two-way splits to get from a large power-of-two free block to a small one, and instead maintain lists of free blocks of sizes that are differences of powers of two (or, equivalently, sequences of consecutive powers of two).
This increases the number of free lists to be examined, so add a bitmask to quickly identify nonempty free lists.
Select a superblock (sequence of consecutive powers-of-two blocks of increasing size) to split by seeking first a superblock from which the desired allocation can be made without increasing the number of free superblocks.
For merging free superblocks, maintain in the first and last order fields of a free superblock the largest and smallest block orders for the blocks in the superblock sequence. That allows a newly freed block to be combined with a superblock on its left in constant time.
For allocating a number of pages smaller than the maximum block size, find the best fitting superblock.