Hello, What is the intended difference between these two flags? The former seems to carry some specific semantic meaning while the latter seems like it is merely a statement of requirement. However, within the code they seem to be used synonymously, to the point that if an IO engine uses FIO_RAWIO and not FIO_MEMALIGN it would potentially crash. >From memory.c:196 if (td->o.odirect || td->o.mem_align || (td->io_ops->flags & FIO_MEMALIGN)) { total_mem += page_mask; if (td->o.mem_align && td->o.mem_align > page_size) total_mem += td->o.mem_align - page_size; } >From fio.c:830 if (td->o.odirect || td->o.mem_align || (td->io_ops->flags & FIO_RAWIO)) p = PAGE_ALIGN(td->orig_buffer) + td->o.mem_align; These two pieces of code seem like they are a pair that should always execute together, yet they have slightly different conditions. The result seems like if FIO_RAWIO is used without FIO_MEMALIGN, it will try to page align the buffer (Which of course involves just padding it to the next alignment) without the actual memory available to do so, resulting in the IO buffer overwriting other parts of the heap. If this is changed one way or the other, however, it would result in an unused flag. The condition in memory.c is the only place FIO_MEMALIGN appears, and FIO_RAWIO only makes two other appearances... >From init.c:320 if (o->bs_unaligned && (o->odirect || td->io_ops->flags & FIO_RAWIO)) log_err("fio: bs_unaligned may not work with raw io\n"); >From init.c:585 if (td->o.odirect) td->io_ops->flags |= FIO_RAWIO; The former doesn't actually do anything but print a message and run anyway (And should probably use the same form of the flag as the other two anyway), and the latter is redundant since the same check for FIO_RAWIO/FIO_MEMALIGN also checks for o.direct. - Steven -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html