mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
libdm: Introduce dm_malloc_aligned
This commit is contained in:
parent
943b217797
commit
ea96381534
@ -1,5 +1,6 @@
|
||||
Version 1.02.147 -
|
||||
=====================================
|
||||
Introduce dm_malloc_aligned for page alignment of buffers.
|
||||
|
||||
Version 1.02.146 - 18th December 2017
|
||||
=====================================
|
||||
|
@ -257,6 +257,13 @@ static int _aligned_io(struct device_area *where, char *buffer,
|
||||
/* Perform the I/O directly. */
|
||||
return _io(where, buffer, should_write, reason);
|
||||
|
||||
#ifndef DEBUG_MEM
|
||||
/* Allocate a bounce buffer with an extra block */
|
||||
if (!(bounce_buf = bounce = dm_malloc_aligned((size_t) widened.size, 0))) {
|
||||
log_error("Bounce buffer malloc failed");
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
/* Allocate a bounce buffer with an extra block */
|
||||
if (!(bounce_buf = bounce = dm_malloc((size_t) widened.size + block_size))) {
|
||||
log_error("Bounce buffer malloc failed");
|
||||
@ -268,6 +275,7 @@ static int _aligned_io(struct device_area *where, char *buffer,
|
||||
*/
|
||||
if (((uintptr_t) bounce) & mask)
|
||||
bounce = (char *) ((((uintptr_t) bounce) + mask) & ~mask);
|
||||
#endif
|
||||
|
||||
/* Do we need to read into the bounce buffer? */
|
||||
if ((!should_write || buffer_was_widened) &&
|
||||
@ -887,7 +895,7 @@ int dev_write(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t r
|
||||
int dev_set(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t reason, int value)
|
||||
{
|
||||
size_t s;
|
||||
char buffer[4096] __attribute__((aligned(8)));
|
||||
char buffer[4096] __attribute__((aligned(4096)));
|
||||
|
||||
if (!dev_open(dev))
|
||||
return_0;
|
||||
|
@ -318,7 +318,6 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label **
|
||||
{
|
||||
struct lvmcache_info *info;
|
||||
struct find_labeller_params *flp;
|
||||
char *readbuf = NULL;
|
||||
|
||||
if ((info = lvmcache_info_from_pvid(dev->pvid, dev, 1))) {
|
||||
log_debug_devs("Reading label from lvmcache for %s", dev_name(dev));
|
||||
|
1
libdm/.exported_symbols.DM_1_02_147
Normal file
1
libdm/.exported_symbols.DM_1_02_147
Normal file
@ -0,0 +1 @@
|
||||
dm_malloc_aligned_wrapper
|
@ -2075,6 +2075,8 @@ uint32_t dm_tree_get_cookie(struct dm_tree_node *node);
|
||||
*/
|
||||
void *dm_malloc_wrapper(size_t s, const char *file, int line)
|
||||
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
|
||||
void *dm_malloc_aligned_wrapper(size_t s, size_t a, const char *file, int line)
|
||||
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
|
||||
void *dm_zalloc_wrapper(size_t s, const char *file, int line)
|
||||
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
|
||||
void *dm_realloc_wrapper(void *p, unsigned int s, const char *file, int line)
|
||||
@ -2086,6 +2088,7 @@ int dm_dump_memory_wrapper(void);
|
||||
void dm_bounds_check_wrapper(void);
|
||||
|
||||
#define dm_malloc(s) dm_malloc_wrapper((s), __FILE__, __LINE__)
|
||||
#define dm_malloc_aligned(s, a) dm_malloc_aligned_wrapper((s), (a), __FILE__, __LINE__)
|
||||
#define dm_zalloc(s) dm_zalloc_wrapper((s), __FILE__, __LINE__)
|
||||
#define dm_strdup(s) dm_strdup_wrapper((s), __FILE__, __LINE__)
|
||||
#define dm_free(p) dm_free_wrapper(p)
|
||||
|
@ -18,7 +18,6 @@
|
||||
#ifdef VALGRIND_POOL
|
||||
#include "memcheck.h"
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
@ -26,6 +25,8 @@ void *dm_malloc_aux(size_t s, const char *file, int line)
|
||||
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
|
||||
void *dm_malloc_aux_debug(size_t s, const char *file, int line)
|
||||
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
|
||||
static void *_dm_malloc_aligned_aux(size_t s, size_t a, const char *file, int line)
|
||||
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
|
||||
void *dm_zalloc_aux(size_t s, const char *file, int line)
|
||||
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
|
||||
void *dm_zalloc_aux_debug(size_t s, const char *file, int line)
|
||||
@ -286,6 +287,30 @@ void *dm_malloc_aux(size_t s, const char *file __attribute__((unused)),
|
||||
return malloc(s);
|
||||
}
|
||||
|
||||
/* Allocate size s with alignment a (or page size if 0) */
|
||||
static void *_dm_malloc_aligned_aux(size_t s, size_t a, const char *file __attribute__((unused)),
|
||||
int line __attribute__((unused)))
|
||||
{
|
||||
void *memptr;
|
||||
int r;
|
||||
|
||||
if (!a)
|
||||
a = getpagesize();
|
||||
|
||||
if (s > 50000000) {
|
||||
log_error("Huge memory allocation (size %" PRIsize_t
|
||||
") rejected - metadata corruption?", s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((r = posix_memalign(&memptr, a, s))) {
|
||||
log_error("Failed to allocate %" PRIsize_t " bytes aligned to %d: %s", s, a, strerror(r));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return memptr;
|
||||
}
|
||||
|
||||
void *dm_zalloc_aux(size_t s, const char *file, int line)
|
||||
{
|
||||
void *ptr = dm_malloc_aux(s, file, line);
|
||||
@ -303,6 +328,12 @@ void *dm_malloc_wrapper(size_t s, const char *file, int line)
|
||||
return dm_malloc_aux_debug(s, file, line);
|
||||
}
|
||||
|
||||
void *dm_malloc_aligned_wrapper(size_t s, size_t a, const char *file, int line)
|
||||
{
|
||||
/* FIXME Implement alignment when debugging - currently just ignored */
|
||||
return _dm_malloc_aux_debug(s, file, line);
|
||||
}
|
||||
|
||||
void *dm_zalloc_wrapper(size_t s, const char *file, int line)
|
||||
{
|
||||
return dm_zalloc_aux_debug(s, file, line);
|
||||
@ -340,6 +371,11 @@ void *dm_malloc_wrapper(size_t s, const char *file, int line)
|
||||
return dm_malloc_aux(s, file, line);
|
||||
}
|
||||
|
||||
void *dm_malloc_aligned_wrapper(size_t s, size_t a, const char *file, int line)
|
||||
{
|
||||
return _dm_malloc_aligned_aux(s, a, file, line);
|
||||
}
|
||||
|
||||
void *dm_zalloc_wrapper(size_t s, const char *file, int line)
|
||||
{
|
||||
return dm_zalloc_aux(s, file, line);
|
||||
|
Loading…
Reference in New Issue
Block a user