Block Allocation in Fixed-Size Block Allocator
These comments all have to do with optimization, not "logic holes."  Also, they are written without having tested them.  Obviously you'll want to both ensure correct function, and profile to see if they actually improve anything.

1) As an obvious first step:

xorq %rcx, %rcx


can be done as

xorq %ecx, %ecx


It produces the same effect, but it's 1 byte shorter.

2) It looks like you are using notw %dx (in 2 different places) to see if dx is 0xffff?  I might try cmp $0xffff, %dx instead.  It's 2 bytes longer, but you don't have to "put it back" if it's not (the extra notw %dx costs 3 bytes).

3) (Check me on this one) You are using movslq %edx, %rcx to move edx to rcx.  However because of how you populate edx, I believe it already clears the upper bits.  Such being the case, a simple movq %rdx, %rcx might suffice.

4) The __ZN10Superblock11alloc_blockEv.i_pubchalloc loop should probably have a pause inserted.  Perhaps something like this:

__ZN10Superblock11alloc_blockEv.i_pubchalloc2:
  pause
__ZN10Superblock11alloc_blockEv.i_pubchalloc:
  movq 16(%rdi), %rax
  // if this-&gt;last_publicly_freed_block == NULL
  testq %rax, %rax
  jz __ZN10Superblock11alloc_blockEv.i_pubchalloc2


See the docs on pause for why this is a good idea.

These are all pretty nitpicky.  Since there's only the 1 loop, there's just not that much to optimize.