mirror of https://github.com/ipxe/ipxe.git
				
				
				
			[iobuf] Limit automatic I/O buffer alignment to page size
Without any explicit alignment requirement, we will currently allocate I/O buffers on their own size rounded up to the nearest power of two. This is done to simplify driver transmit code paths, which can assume that a standard Ethernet frame lies within a single physical page and therefore does not need to be split even for devices with DMA engines that cannot cross page boundaries. Limit this automatic alignment to a maximum of the page size, to avoid requiring excessive alignment for unusually large buffers (such as a buffer allocated for an HTTP POST with a large parameter list). Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1437/head
							parent
							
								
									7fe467a46d
								
							
						
					
					
						commit
						5818529f39
					
				|  | @ -124,18 +124,24 @@ struct io_buffer * alloc_iob_raw ( size_t len, size_t align, size_t offset ) { | |||
|  * @ret iobuf	I/O buffer, or NULL if none available | ||||
|  * | ||||
|  * The I/O buffer will be physically aligned on its own size (rounded | ||||
|  * up to the nearest power of two). | ||||
|  * up to the nearest power of two), up to a maximum of page-size | ||||
|  * alignment. | ||||
|  */ | ||||
| struct io_buffer * alloc_iob ( size_t len ) { | ||||
| 	size_t align; | ||||
| 
 | ||||
| 	/* Pad to minimum length */ | ||||
| 	if ( len < IOB_ZLEN ) | ||||
| 		len = IOB_ZLEN; | ||||
| 
 | ||||
| 	/* Align buffer on its own size to avoid potential problems
 | ||||
| 	 * with boundary-crossing DMA. | ||||
| 	/* Align buffer on its own size (up to page size) to avoid
 | ||||
| 	 * potential problems with boundary-crossing DMA. | ||||
| 	 */ | ||||
| 	return alloc_iob_raw ( len, len, 0 ); | ||||
| 	align = len; | ||||
| 	if ( align > PAGE_SIZE ) | ||||
| 		align = PAGE_SIZE; | ||||
| 
 | ||||
| 	return alloc_iob_raw ( len, align, 0 ); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue