do_mmap: don't pre-populate the whole file when asked for smaller segment
The linker maps parts of libs with different access flags, so we cannot prepopulate the whole file. [dominique.martinet@cea.fr: moved min and friends in compiler.h] Change-Id: Ifbeddc0908699099cfae5ce9cc2adc578221db31
This commit is contained in:
committed by
Dominique Martinet
parent
641d9f1b39
commit
e828398c8b
@@ -545,4 +545,40 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
|
|||||||
#define WRITE_ONCE(x, val) \
|
#define WRITE_ONCE(x, val) \
|
||||||
({ typeof(x) __val = (val); __write_once_size(&(x), &__val, sizeof(__val)); __val; })
|
({ typeof(x) __val = (val); __write_once_size(&(x), &__val, sizeof(__val)); __val; })
|
||||||
|
|
||||||
|
#define min(x, y) ({ \
|
||||||
|
__typeof__(x) _min1 = (x); \
|
||||||
|
__typeof__(y) _min2 = (y); \
|
||||||
|
(void) (&_min1 == &_min2); \
|
||||||
|
_min1 < _min2 ? _min1 : _min2; })
|
||||||
|
|
||||||
|
#define max(x, y) ({ \
|
||||||
|
__typeof__(x) _max1 = (x); \
|
||||||
|
__typeof__(y) _max2 = (y); \
|
||||||
|
(void) (&_max1 == &_max2); \
|
||||||
|
_max1 > _max2 ? _max1 : _max2; })
|
||||||
|
|
||||||
|
#define MAX_ERRNO 4095
|
||||||
|
|
||||||
|
#define IS_ERR_VALUE(x) ((x) >= (unsigned long)-MAX_ERRNO)
|
||||||
|
|
||||||
|
static inline void *ERR_PTR(long error)
|
||||||
|
{
|
||||||
|
return (void *)error;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long PTR_ERR(const void *ptr)
|
||||||
|
{
|
||||||
|
return (long)ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long IS_ERR(const void *ptr)
|
||||||
|
{
|
||||||
|
return IS_ERR_VALUE((unsigned long)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long IS_ERR_OR_NULL(const void *ptr)
|
||||||
|
{
|
||||||
|
return !ptr || IS_ERR_VALUE((unsigned long)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __LWK_COMPILER_H */
|
#endif /* __LWK_COMPILER_H */
|
||||||
|
|||||||
@@ -48,42 +48,6 @@
|
|||||||
|
|
||||||
#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
|
#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
|
||||||
|
|
||||||
#define min(x, y) ({ \
|
|
||||||
__typeof__(x) _min1 = (x); \
|
|
||||||
__typeof__(y) _min2 = (y); \
|
|
||||||
(void) (&_min1 == &_min2); \
|
|
||||||
_min1 < _min2 ? _min1 : _min2;})
|
|
||||||
|
|
||||||
#define max(x, y) ({ \
|
|
||||||
__typeof__(x) _max1 = (x); \
|
|
||||||
__typeof__(y) _max2 = (y); \
|
|
||||||
(void) (&_max1 == &_max2); \
|
|
||||||
_max1 > _max2 ? _max1 : _max2;})
|
|
||||||
|
|
||||||
#define MAX_ERRNO 4095
|
|
||||||
|
|
||||||
#define IS_ERR_VALUE(x) ((x) >= (unsigned long)-MAX_ERRNO)
|
|
||||||
|
|
||||||
static inline void * ERR_PTR(long error)
|
|
||||||
{
|
|
||||||
return (void *)error;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline long PTR_ERR(const void *ptr)
|
|
||||||
{
|
|
||||||
return (long)ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline long IS_ERR(const void *ptr)
|
|
||||||
{
|
|
||||||
return IS_ERR_VALUE((unsigned long)ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline long IS_ERR_OR_NULL(const void *ptr)
|
|
||||||
{
|
|
||||||
return !ptr || IS_ERR_VALUE((unsigned long)ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Both the xpmem_segid_t and xpmem_apid_t are of type __s64 and designed
|
* Both the xpmem_segid_t and xpmem_apid_t are of type __s64 and designed
|
||||||
* to be opaque to the user. Both consist of the same underlying fields.
|
* to be opaque to the user. Both consist of the same underlying fields.
|
||||||
|
|||||||
@@ -1925,13 +1925,12 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Determine pre-populated size */
|
/* Determine pre-populated size */
|
||||||
populate_len = len;
|
populate_len = memobj ? min(len, memobj->size) : len;
|
||||||
|
|
||||||
if (!(flags & MAP_ANONYMOUS)) {
|
if (!(flags & MAP_ANONYMOUS)) {
|
||||||
if (atomic_cmpxchg4(&memobj->status, MEMOBJ_TO_BE_PREFETCHED,
|
if (atomic_cmpxchg4(&memobj->status, MEMOBJ_TO_BE_PREFETCHED,
|
||||||
MEMOBJ_READY)) {
|
MEMOBJ_READY)) {
|
||||||
populated_mapping = 1;
|
populated_mapping = 1;
|
||||||
populate_len = memobj->size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update PTEs for pre-mapped memory object */
|
/* Update PTEs for pre-mapped memory object */
|
||||||
|
|||||||
Reference in New Issue
Block a user