diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-12-01 20:36:41 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-12-01 20:36:41 -0800 | 
| commit | 596cf45cbf6e4fa7bcb0df33e373a7d062b644b5 (patch) | |
| tree | 3f24095d65cbdaaae8e89ff02b87df373ada1bfb /lib/vsprintf.c | |
| parent | c3bfc5dd73c6f519ff0636d4e709515f06edef78 (diff) | |
| parent | 937790699be9c8100e5358625e7dfa8b32bd33f2 (diff) | |
Merge branch 'akpm' (patches from Andrew)
Merge updates from Andrew Morton:
 "Incoming:
   - a small number of updates to scripts/, ocfs2 and fs/buffer.c
   - most of MM
  I still have quite a lot of material (mostly not MM) staged after
  linux-next due to -next dependencies. I'll send those across next week
  as the preprequisites get merged up"
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (135 commits)
  mm/page_io.c: annotate refault stalls from swap_readpage
  mm/Kconfig: fix trivial help text punctuation
  mm/Kconfig: fix indentation
  mm/memory_hotplug.c: remove __online_page_set_limits()
  mm: fix typos in comments when calling __SetPageUptodate()
  mm: fix struct member name in function comments
  mm/shmem.c: cast the type of unmap_start to u64
  mm: shmem: use proper gfp flags for shmem_writepage()
  mm/shmem.c: make array 'values' static const, makes object smaller
  userfaultfd: require CAP_SYS_PTRACE for UFFD_FEATURE_EVENT_FORK
  fs/userfaultfd.c: wp: clear VM_UFFD_MISSING or VM_UFFD_WP during userfaultfd_register()
  userfaultfd: wrap the common dst_vma check into an inlined function
  userfaultfd: remove unnecessary WARN_ON() in __mcopy_atomic_hugetlb()
  userfaultfd: use vma_pagesize for all huge page size calculation
  mm/madvise.c: use PAGE_ALIGN[ED] for range checking
  mm/madvise.c: replace with page_size() in madvise_inject_error()
  mm/mmap.c: make vma_merge() comment more easy to understand
  mm/hwpoison-inject: use DEFINE_DEBUGFS_ATTRIBUTE to define debugfs fops
  autonuma: reduce cache footprint when scanning page tables
  autonuma: fix watermark checking in migrate_balanced_pgdat()
  ...
Diffstat (limited to 'lib/vsprintf.c')
| -rw-r--r-- | lib/vsprintf.c | 40 | 
1 files changed, 29 insertions, 11 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index dee8fc467fcf..7c488a1ce318 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -761,11 +761,38 @@ static int __init initialize_ptr_random(void)  early_initcall(initialize_ptr_random);  /* Maps a pointer to a 32 bit unique identifier. */ +static inline int __ptr_to_hashval(const void *ptr, unsigned long *hashval_out) +{ +	unsigned long hashval; + +	if (static_branch_unlikely(¬_filled_random_ptr_key)) +		return -EAGAIN; + +#ifdef CONFIG_64BIT +	hashval = (unsigned long)siphash_1u64((u64)ptr, &ptr_key); +	/* +	 * Mask off the first 32 bits, this makes explicit that we have +	 * modified the address (and 32 bits is plenty for a unique ID). +	 */ +	hashval = hashval & 0xffffffff; +#else +	hashval = (unsigned long)siphash_1u32((u32)ptr, &ptr_key); +#endif +	*hashval_out = hashval; +	return 0; +} + +int ptr_to_hashval(const void *ptr, unsigned long *hashval_out) +{ +	return __ptr_to_hashval(ptr, hashval_out); +} +  static char *ptr_to_id(char *buf, char *end, const void *ptr,  		       struct printf_spec spec)  {  	const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)";  	unsigned long hashval; +	int ret;  	/* When debugging early boot use non-cryptographically secure hash. */  	if (unlikely(debug_boot_weak_hash)) { @@ -773,22 +800,13 @@ static char *ptr_to_id(char *buf, char *end, const void *ptr,  		return pointer_string(buf, end, (const void *)hashval, spec);  	} -	if (static_branch_unlikely(¬_filled_random_ptr_key)) { +	ret = __ptr_to_hashval(ptr, &hashval); +	if (ret) {  		spec.field_width = 2 * sizeof(ptr);  		/* string length must be less than default_width */  		return error_string(buf, end, str, spec);  	} -#ifdef CONFIG_64BIT -	hashval = (unsigned long)siphash_1u64((u64)ptr, &ptr_key); -	/* -	 * Mask off the first 32 bits, this makes explicit that we have -	 * modified the address (and 32 bits is plenty for a unique ID). -	 */ -	hashval = hashval & 0xffffffff; -#else -	hashval = (unsigned long)siphash_1u32((u32)ptr, &ptr_key); -#endif  	return pointer_string(buf, end, (const void *)hashval, spec);  }  | 
