Skip to content

Commit e93a1cb

Browse files
hcahcaarndb
authored andcommitted
s390: use generic strncpy/strnlen from_user
The s390 variant of strncpy_from_user() is slightly faster than the generic variant, however convert to the generic variant now to follow most if not all other architectures. Converting to the generic variant was already considered a couple of years ago. See commit f5c8b96 ("s390/uaccess: use sane length for __strncpy_from_user()"). Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
1 parent b26b181 commit e93a1cb

3 files changed

Lines changed: 4 additions & 68 deletions

File tree

arch/s390/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ config S390
130130
select GENERIC_GETTIMEOFDAY
131131
select GENERIC_PTDUMP
132132
select GENERIC_SMP_IDLE_THREAD
133+
select GENERIC_STRNCPY_FROM_USER
134+
select GENERIC_STRNLEN_USER
133135
select GENERIC_TIME_VSYSCALL
134136
select GENERIC_VDSO_TIME_NS
135137
select HAVE_ALIGNED_STRUCT_PAGE if SLUB

arch/s390/include/asm/uaccess.h

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -233,23 +233,9 @@ raw_copy_in_user(void __user *to, const void __user *from, unsigned long n);
233233
/*
234234
* Copy a null terminated string from userspace.
235235
*/
236+
long __must_check strncpy_from_user(char *dst, const char __user *src, long count);
236237

237-
long __strncpy_from_user(char *dst, const char __user *src, long count);
238-
239-
static inline long __must_check
240-
strncpy_from_user(char *dst, const char __user *src, long count)
241-
{
242-
might_fault();
243-
return __strncpy_from_user(dst, src, count);
244-
}
245-
246-
unsigned long __must_check __strnlen_user(const char __user *src, unsigned long count);
247-
248-
static inline unsigned long strnlen_user(const char __user *src, unsigned long n)
249-
{
250-
might_fault();
251-
return __strnlen_user(src, n);
252-
}
238+
long __must_check strnlen_user(const char __user *src, long count);
253239

254240
/*
255241
* Zero Userspace

arch/s390/lib/uaccess.c

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -338,55 +338,3 @@ unsigned long __clear_user(void __user *to, unsigned long size)
338338
return clear_user_xc(to, size);
339339
}
340340
EXPORT_SYMBOL(__clear_user);
341-
342-
static inline unsigned long strnlen_user_srst(const char __user *src,
343-
unsigned long size)
344-
{
345-
unsigned long tmp1, tmp2;
346-
347-
asm volatile(
348-
" lghi 0,0\n"
349-
" la %2,0(%1)\n"
350-
" la %3,0(%0,%1)\n"
351-
" slgr %0,%0\n"
352-
" sacf 256\n"
353-
"0: srst %3,%2\n"
354-
" jo 0b\n"
355-
" la %0,1(%3)\n" /* strnlen_user results includes \0 */
356-
" slgr %0,%1\n"
357-
"1: sacf 768\n"
358-
EX_TABLE(0b,1b)
359-
: "+a" (size), "+a" (src), "=a" (tmp1), "=a" (tmp2)
360-
:
361-
: "cc", "memory", "0");
362-
return size;
363-
}
364-
365-
unsigned long __strnlen_user(const char __user *src, unsigned long size)
366-
{
367-
if (unlikely(!size))
368-
return 0;
369-
return strnlen_user_srst(src, size);
370-
}
371-
EXPORT_SYMBOL(__strnlen_user);
372-
373-
long __strncpy_from_user(char *dst, const char __user *src, long size)
374-
{
375-
size_t done, len, offset, len_str;
376-
377-
if (unlikely(size <= 0))
378-
return 0;
379-
done = 0;
380-
do {
381-
offset = (size_t)src & (L1_CACHE_BYTES - 1);
382-
len = min(size - done, L1_CACHE_BYTES - offset);
383-
if (copy_from_user(dst, src, len))
384-
return -EFAULT;
385-
len_str = strnlen(dst, len);
386-
done += len_str;
387-
src += len_str;
388-
dst += len_str;
389-
} while ((len_str == len) && (done < size));
390-
return done;
391-
}
392-
EXPORT_SYMBOL(__strncpy_from_user);

0 commit comments

Comments
 (0)