mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge branches 'x86/cleanups', 'x86/mm', 'x86/setup' and 'linus' into x86/core
This commit is contained in:
3
Makefile
3
Makefile
@@ -567,6 +567,9 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
||||
# disable pointer signed / unsigned warnings in gcc 4.0
|
||||
KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
||||
|
||||
# disable invalid "can't wrap" optimzations for signed / pointers
|
||||
KBUILD_CFLAGS += $(call cc-option,-fwrapv)
|
||||
|
||||
# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
|
||||
# But warn user when we do so
|
||||
warn-assign = \
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -241,9 +241,11 @@ extern const char *powerpc_base_platform;
|
||||
/* We need to mark all pages as being coherent if we're SMP or we have a
|
||||
* 74[45]x and an MPC107 host bridge. Also 83xx and PowerQUICC II
|
||||
* require it for PCI "streaming/prefetch" to work properly.
|
||||
* This is also required by 52xx family.
|
||||
*/
|
||||
#if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE) \
|
||||
|| defined(CONFIG_PPC_83xx) || defined(CONFIG_8260)
|
||||
|| defined(CONFIG_PPC_83xx) || defined(CONFIG_8260) \
|
||||
|| defined(CONFIG_PPC_MPC52xx)
|
||||
#define CPU_FTR_COMMON CPU_FTR_NEED_COHERENT
|
||||
#else
|
||||
#define CPU_FTR_COMMON 0
|
||||
|
||||
@@ -511,7 +511,7 @@ InstructionTLBMiss:
|
||||
and r1,r1,r2 /* writable if _RW and _DIRTY */
|
||||
rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
|
||||
rlwimi r3,r3,32-1,31,31 /* _PAGE_USER -> PP lsb */
|
||||
ori r1,r1,0xe14 /* clear out reserved bits and M */
|
||||
ori r1,r1,0xe04 /* clear out reserved bits */
|
||||
andc r1,r3,r1 /* PP = user? (rw&dirty? 2: 3): 0 */
|
||||
mtspr SPRN_RPA,r1
|
||||
mfspr r3,SPRN_IMISS
|
||||
@@ -585,7 +585,7 @@ DataLoadTLBMiss:
|
||||
and r1,r1,r2 /* writable if _RW and _DIRTY */
|
||||
rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
|
||||
rlwimi r3,r3,32-1,31,31 /* _PAGE_USER -> PP lsb */
|
||||
ori r1,r1,0xe14 /* clear out reserved bits and M */
|
||||
ori r1,r1,0xe04 /* clear out reserved bits */
|
||||
andc r1,r3,r1 /* PP = user? (rw&dirty? 2: 3): 0 */
|
||||
mtspr SPRN_RPA,r1
|
||||
mfspr r3,SPRN_DMISS
|
||||
@@ -653,7 +653,7 @@ DataStoreTLBMiss:
|
||||
stw r3,0(r2) /* update PTE (accessed/dirty bits) */
|
||||
/* Convert linux-style PTE to low word of PPC-style PTE */
|
||||
rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
|
||||
li r1,0xe15 /* clear out reserved bits and M */
|
||||
li r1,0xe05 /* clear out reserved bits & PP lsb */
|
||||
andc r1,r3,r1 /* PP = user? 2: 0 */
|
||||
mtspr SPRN_RPA,r1
|
||||
mfspr r3,SPRN_DMISS
|
||||
|
||||
@@ -128,6 +128,13 @@ config PS3_FLASH
|
||||
be disabled on the kernel command line using "ps3flash=off", to
|
||||
not allocate this fixed buffer.
|
||||
|
||||
config PS3_VRAM
|
||||
tristate "PS3 Video RAM Storage Driver"
|
||||
depends on FB_PS3=y && BLOCK && m
|
||||
help
|
||||
This driver allows you to use excess PS3 video RAM as volatile
|
||||
storage or system swap.
|
||||
|
||||
config PS3_LPM
|
||||
tristate "PS3 Logical Performance Monitor support"
|
||||
depends on PPC_PS3
|
||||
|
||||
@@ -22,4 +22,9 @@
|
||||
#define MCL_CURRENT 1 /* lock all current mappings */
|
||||
#define MCL_FUTURE 2 /* lock all future mappings */
|
||||
|
||||
#if defined(__KERNEL__) && !defined(__ASSEMBLY__) && defined(CONFIG_64BIT)
|
||||
int s390_mmap_check(unsigned long addr, unsigned long len);
|
||||
#define arch_mmap_check(addr,len,flags) s390_mmap_check(addr,len)
|
||||
#endif
|
||||
|
||||
#endif /* __S390_MMAN_H__ */
|
||||
|
||||
@@ -61,7 +61,7 @@ extern void print_cpu_info(struct cpuinfo_S390 *);
|
||||
extern int get_cpu_capability(unsigned int *);
|
||||
|
||||
/*
|
||||
* User space process size: 2GB for 31 bit, 4TB for 64 bit.
|
||||
* User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
|
||||
*/
|
||||
#ifndef __s390x__
|
||||
|
||||
@@ -70,8 +70,7 @@ extern int get_cpu_capability(unsigned int *);
|
||||
|
||||
#else /* __s390x__ */
|
||||
|
||||
#define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk,TIF_31BIT) ? \
|
||||
(1UL << 31) : (1UL << 53))
|
||||
#define TASK_SIZE_OF(tsk) ((tsk)->mm->context.asce_limit)
|
||||
#define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \
|
||||
(1UL << 30) : (1UL << 41))
|
||||
#define TASK_SIZE TASK_SIZE_OF(current)
|
||||
|
||||
@@ -30,6 +30,8 @@ static inline void s390_init_cpu_topology(void)
|
||||
};
|
||||
#endif
|
||||
|
||||
#define SD_MC_INIT SD_CPU_INIT
|
||||
|
||||
#include <asm-generic/topology.h>
|
||||
|
||||
#endif /* _ASM_S390_TOPOLOGY_H */
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
.globl _mcount
|
||||
_mcount:
|
||||
@@ -14,7 +16,7 @@ _mcount:
|
||||
ahi %r15,-96
|
||||
l %r3,100(%r15)
|
||||
la %r2,0(%r14)
|
||||
st %r1,0(%r15)
|
||||
st %r1,__SF_BACKCHAIN(%r15)
|
||||
la %r3,0(%r3)
|
||||
bras %r14,0f
|
||||
.long ftrace_trace_function
|
||||
@@ -38,7 +40,7 @@ _mcount:
|
||||
stg %r14,112(%r15)
|
||||
lgr %r1,%r15
|
||||
aghi %r15,-160
|
||||
stg %r1,0(%r15)
|
||||
stg %r1,__SF_BACKCHAIN(%r15)
|
||||
lgr %r2,%r14
|
||||
lg %r3,168(%r15)
|
||||
larl %r14,ftrace_trace_function
|
||||
|
||||
@@ -61,7 +61,7 @@ static uint32_t __div64_31(uint64_t *n, uint32_t base)
|
||||
" clr %0,%3\n"
|
||||
" jl 0f\n"
|
||||
" slr %0,%3\n"
|
||||
" alr %1,%2\n"
|
||||
" ahi %1,1\n"
|
||||
"0:\n"
|
||||
: "+d" (reg2), "+d" (reg3), "=d" (tmp)
|
||||
: "d" (base), "2" (1UL) : "cc" );
|
||||
|
||||
@@ -119,8 +119,6 @@ retry:
|
||||
goto fault;
|
||||
|
||||
pfn = pte_pfn(*pte);
|
||||
if (!pfn_valid(pfn))
|
||||
goto out;
|
||||
|
||||
offset = uaddr & (PAGE_SIZE - 1);
|
||||
size = min(n - done, PAGE_SIZE - offset);
|
||||
@@ -135,7 +133,6 @@ retry:
|
||||
done += size;
|
||||
uaddr += size;
|
||||
} while (done < n);
|
||||
out:
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
return n - done;
|
||||
fault:
|
||||
@@ -163,9 +160,6 @@ retry:
|
||||
goto fault;
|
||||
|
||||
pfn = pte_pfn(*pte);
|
||||
if (!pfn_valid(pfn))
|
||||
goto out;
|
||||
|
||||
ret = (pfn << PAGE_SHIFT) + (uaddr & (PAGE_SIZE - 1));
|
||||
out:
|
||||
return ret;
|
||||
@@ -244,11 +238,6 @@ retry:
|
||||
goto fault;
|
||||
|
||||
pfn = pte_pfn(*pte);
|
||||
if (!pfn_valid(pfn)) {
|
||||
done = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
offset = uaddr & (PAGE_SIZE-1);
|
||||
addr = (char *)(pfn << PAGE_SHIFT) + offset;
|
||||
len = min(count - done, PAGE_SIZE - offset);
|
||||
@@ -256,7 +245,6 @@ retry:
|
||||
done += len_str;
|
||||
uaddr += len_str;
|
||||
} while ((len_str == len) && (done < count));
|
||||
out:
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
return done + 1;
|
||||
fault:
|
||||
@@ -325,12 +313,7 @@ retry:
|
||||
}
|
||||
|
||||
pfn_from = pte_pfn(*pte_from);
|
||||
if (!pfn_valid(pfn_from))
|
||||
goto out;
|
||||
pfn_to = pte_pfn(*pte_to);
|
||||
if (!pfn_valid(pfn_to))
|
||||
goto out;
|
||||
|
||||
offset_from = uaddr_from & (PAGE_SIZE-1);
|
||||
offset_to = uaddr_from & (PAGE_SIZE-1);
|
||||
offset_max = max(offset_from, offset_to);
|
||||
@@ -342,7 +325,6 @@ retry:
|
||||
uaddr_from += size;
|
||||
uaddr_to += size;
|
||||
} while (done < n);
|
||||
out:
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
return n - done;
|
||||
fault:
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
* Leave an at least ~128 MB hole.
|
||||
*/
|
||||
#define MIN_GAP (128*1024*1024)
|
||||
#define MAX_GAP (TASK_SIZE/6*5)
|
||||
#define MAX_GAP (STACK_TOP/6*5)
|
||||
|
||||
static inline unsigned long mmap_base(void)
|
||||
{
|
||||
@@ -46,7 +46,7 @@ static inline unsigned long mmap_base(void)
|
||||
else if (gap > MAX_GAP)
|
||||
gap = MAX_GAP;
|
||||
|
||||
return TASK_SIZE - (gap & PAGE_MASK);
|
||||
return STACK_TOP - (gap & PAGE_MASK);
|
||||
}
|
||||
|
||||
static inline int mmap_is_legacy(void)
|
||||
@@ -89,42 +89,58 @@ EXPORT_SYMBOL_GPL(arch_pick_mmap_layout);
|
||||
|
||||
#else
|
||||
|
||||
int s390_mmap_check(unsigned long addr, unsigned long len)
|
||||
{
|
||||
if (!test_thread_flag(TIF_31BIT) &&
|
||||
len >= TASK_SIZE && TASK_SIZE < (1UL << 53))
|
||||
return crst_table_upgrade(current->mm, 1UL << 53);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
s390_get_unmapped_area(struct file *filp, unsigned long addr,
|
||||
unsigned long len, unsigned long pgoff, unsigned long flags)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long area;
|
||||
int rc;
|
||||
|
||||
addr = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
|
||||
if (addr & ~PAGE_MASK)
|
||||
return addr;
|
||||
if (unlikely(mm->context.asce_limit < addr + len)) {
|
||||
rc = crst_table_upgrade(mm, addr + len);
|
||||
area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
|
||||
if (!(area & ~PAGE_MASK))
|
||||
return area;
|
||||
if (area == -ENOMEM &&
|
||||
!test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) {
|
||||
/* Upgrade the page table to 4 levels and retry. */
|
||||
rc = crst_table_upgrade(mm, 1UL << 53);
|
||||
if (rc)
|
||||
return (unsigned long) rc;
|
||||
area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
|
||||
}
|
||||
return addr;
|
||||
return area;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
||||
s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr,
|
||||
const unsigned long len, const unsigned long pgoff,
|
||||
const unsigned long flags)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long addr = addr0;
|
||||
unsigned long area;
|
||||
int rc;
|
||||
|
||||
addr = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags);
|
||||
if (addr & ~PAGE_MASK)
|
||||
return addr;
|
||||
if (unlikely(mm->context.asce_limit < addr + len)) {
|
||||
rc = crst_table_upgrade(mm, addr + len);
|
||||
area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags);
|
||||
if (!(area & ~PAGE_MASK))
|
||||
return area;
|
||||
if (area == -ENOMEM &&
|
||||
!test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) {
|
||||
/* Upgrade the page table to 4 levels and retry. */
|
||||
rc = crst_table_upgrade(mm, 1UL << 53);
|
||||
if (rc)
|
||||
return (unsigned long) rc;
|
||||
area = arch_get_unmapped_area_topdown(filp, addr, len,
|
||||
pgoff, flags);
|
||||
}
|
||||
return addr;
|
||||
return area;
|
||||
}
|
||||
/*
|
||||
* This function, called very early during the creation of a new
|
||||
|
||||
@@ -117,6 +117,7 @@ repeat:
|
||||
crst_table_init(table, entry);
|
||||
pgd_populate(mm, (pgd_t *) table, (pud_t *) pgd);
|
||||
mm->pgd = (pgd_t *) table;
|
||||
mm->task_size = mm->context.asce_limit;
|
||||
table = NULL;
|
||||
}
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
@@ -154,6 +155,7 @@ void crst_table_downgrade(struct mm_struct *mm, unsigned long limit)
|
||||
BUG();
|
||||
}
|
||||
mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN);
|
||||
mm->task_size = mm->context.asce_limit;
|
||||
crst_table_free(mm, (unsigned long *) pgd);
|
||||
}
|
||||
update_mm(mm, current);
|
||||
|
||||
@@ -129,41 +129,45 @@ u16 vga_crtc(void)
|
||||
return (inb(0x3cc) & 1) ? 0x3d4 : 0x3b4;
|
||||
}
|
||||
|
||||
static void vga_set_480_scanlines(int end)
|
||||
static void vga_set_480_scanlines(int lines)
|
||||
{
|
||||
u16 crtc;
|
||||
u8 csel;
|
||||
u16 crtc; /* CRTC base address */
|
||||
u8 csel; /* CRTC miscellaneous output register */
|
||||
u8 ovfw; /* CRTC overflow register */
|
||||
int end = lines-1;
|
||||
|
||||
crtc = vga_crtc();
|
||||
|
||||
ovfw = 0x3c | ((end >> (8-1)) & 0x02) | ((end >> (9-6)) & 0x40);
|
||||
|
||||
out_idx(0x0c, crtc, 0x11); /* Vertical sync end, unlock CR0-7 */
|
||||
out_idx(0x0b, crtc, 0x06); /* Vertical total */
|
||||
out_idx(0x3e, crtc, 0x07); /* Vertical overflow */
|
||||
out_idx(ovfw, crtc, 0x07); /* Vertical overflow */
|
||||
out_idx(0xea, crtc, 0x10); /* Vertical sync start */
|
||||
out_idx(end, crtc, 0x12); /* Vertical display end */
|
||||
out_idx(end, crtc, 0x12); /* Vertical display end */
|
||||
out_idx(0xe7, crtc, 0x15); /* Vertical blank start */
|
||||
out_idx(0x04, crtc, 0x16); /* Vertical blank end */
|
||||
csel = inb(0x3cc);
|
||||
csel &= 0x0d;
|
||||
csel |= 0xe2;
|
||||
outb(csel, 0x3cc);
|
||||
outb(csel, 0x3c2);
|
||||
}
|
||||
|
||||
static void vga_set_80x30(void)
|
||||
{
|
||||
vga_set_480_scanlines(0xdf);
|
||||
vga_set_480_scanlines(30*16);
|
||||
}
|
||||
|
||||
static void vga_set_80x34(void)
|
||||
{
|
||||
vga_set_14font();
|
||||
vga_set_480_scanlines(0xdb);
|
||||
vga_set_480_scanlines(34*14);
|
||||
}
|
||||
|
||||
static void vga_set_80x60(void)
|
||||
{
|
||||
vga_set_8font();
|
||||
vga_set_480_scanlines(0xdf);
|
||||
vga_set_480_scanlines(60*8);
|
||||
}
|
||||
|
||||
static int vga_set_mode(struct mode_info *mode)
|
||||
|
||||
@@ -317,8 +317,6 @@ struct pv_mmu_ops {
|
||||
#if PAGETABLE_LEVELS >= 3
|
||||
#ifdef CONFIG_X86_PAE
|
||||
void (*set_pte_atomic)(pte_t *ptep, pte_t pteval);
|
||||
void (*set_pte_present)(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pte);
|
||||
void (*pte_clear)(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep);
|
||||
void (*pmd_clear)(pmd_t *pmdp);
|
||||
@@ -1365,13 +1363,6 @@ static inline void set_pte_atomic(pte_t *ptep, pte_t pte)
|
||||
pte.pte, pte.pte >> 32);
|
||||
}
|
||||
|
||||
static inline void set_pte_present(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
/* 5 arg words */
|
||||
pv_mmu_ops.set_pte_present(mm, addr, ptep, pte);
|
||||
}
|
||||
|
||||
static inline void pte_clear(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep)
|
||||
{
|
||||
@@ -1388,12 +1379,6 @@ static inline void set_pte_atomic(pte_t *ptep, pte_t pte)
|
||||
set_pte(ptep, pte);
|
||||
}
|
||||
|
||||
static inline void set_pte_present(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
set_pte(ptep, pte);
|
||||
}
|
||||
|
||||
static inline void pte_clear(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep)
|
||||
{
|
||||
|
||||
@@ -26,13 +26,6 @@ static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte)
|
||||
native_set_pte(ptep, pte);
|
||||
}
|
||||
|
||||
static inline void native_set_pte_present(struct mm_struct *mm,
|
||||
unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
native_set_pte(ptep, pte);
|
||||
}
|
||||
|
||||
static inline void native_pmd_clear(pmd_t *pmdp)
|
||||
{
|
||||
native_set_pmd(pmdp, __pmd(0));
|
||||
|
||||
@@ -31,23 +31,6 @@ static inline void native_set_pte(pte_t *ptep, pte_t pte)
|
||||
ptep->pte_low = pte.pte_low;
|
||||
}
|
||||
|
||||
/*
|
||||
* Since this is only called on user PTEs, and the page fault handler
|
||||
* must handle the already racy situation of simultaneous page faults,
|
||||
* we are justified in merely clearing the PTE present bit, followed
|
||||
* by a set. The ordering here is important.
|
||||
*/
|
||||
static inline void native_set_pte_present(struct mm_struct *mm,
|
||||
unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
ptep->pte_low = 0;
|
||||
smp_wmb();
|
||||
ptep->pte_high = pte.pte_high;
|
||||
smp_wmb();
|
||||
ptep->pte_low = pte.pte_low;
|
||||
}
|
||||
|
||||
static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte)
|
||||
{
|
||||
set_64bit((unsigned long long *)(ptep), native_pte_val(pte));
|
||||
|
||||
@@ -31,8 +31,6 @@ extern struct list_head pgd_list;
|
||||
#define set_pte(ptep, pte) native_set_pte(ptep, pte)
|
||||
#define set_pte_at(mm, addr, ptep, pte) native_set_pte_at(mm, addr, ptep, pte)
|
||||
|
||||
#define set_pte_present(mm, addr, ptep, pte) \
|
||||
native_set_pte_present(mm, addr, ptep, pte)
|
||||
#define set_pte_atomic(ptep, pte) \
|
||||
native_set_pte_atomic(ptep, pte)
|
||||
|
||||
|
||||
@@ -138,12 +138,6 @@ static void kvm_set_pte_atomic(pte_t *ptep, pte_t pte)
|
||||
kvm_mmu_write(ptep, pte_val(pte));
|
||||
}
|
||||
|
||||
static void kvm_set_pte_present(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
kvm_mmu_write(ptep, pte_val(pte));
|
||||
}
|
||||
|
||||
static void kvm_pte_clear(struct mm_struct *mm,
|
||||
unsigned long addr, pte_t *ptep)
|
||||
{
|
||||
@@ -220,7 +214,6 @@ static void paravirt_ops_setup(void)
|
||||
#if PAGETABLE_LEVELS >= 3
|
||||
#ifdef CONFIG_X86_PAE
|
||||
pv_mmu_ops.set_pte_atomic = kvm_set_pte_atomic;
|
||||
pv_mmu_ops.set_pte_present = kvm_set_pte_present;
|
||||
pv_mmu_ops.pte_clear = kvm_pte_clear;
|
||||
pv_mmu_ops.pmd_clear = kvm_pmd_clear;
|
||||
#endif
|
||||
|
||||
@@ -470,7 +470,6 @@ struct pv_mmu_ops pv_mmu_ops = {
|
||||
#if PAGETABLE_LEVELS >= 3
|
||||
#ifdef CONFIG_X86_PAE
|
||||
.set_pte_atomic = native_set_pte_atomic,
|
||||
.set_pte_present = native_set_pte_present,
|
||||
.pte_clear = native_pte_clear,
|
||||
.pmd_clear = native_pmd_clear,
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user