Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
ea3c4b12
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
ea3c4b12
编写于
9月 04, 2007
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'release' of
git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
上级
a5229e6b
7b3166db
变更
20
隐藏空白更改
内联
并排
Showing
20 changed file
with
137 addition
and
37 deletion
+137
-37
arch/ia64/hp/sim/hpsim_console.c
arch/ia64/hp/sim/hpsim_console.c
+14
-2
arch/ia64/hp/sim/hpsim_setup.c
arch/ia64/hp/sim/hpsim_setup.c
+2
-7
arch/ia64/hp/sim/simeth.c
arch/ia64/hp/sim/simeth.c
+3
-9
arch/ia64/hp/sim/simscsi.c
arch/ia64/hp/sim/simscsi.c
+1
-2
arch/ia64/kernel/irq_ia64.c
arch/ia64/kernel/irq_ia64.c
+22
-6
arch/ia64/kernel/setup.c
arch/ia64/kernel/setup.c
+7
-6
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/smpboot.c
+6
-0
arch/ia64/mm/contig.c
arch/ia64/mm/contig.c
+3
-0
arch/ia64/mm/discontig.c
arch/ia64/mm/discontig.c
+3
-0
arch/ia64/sn/kernel/huberror.c
arch/ia64/sn/kernel/huberror.c
+10
-4
arch/ia64/sn/kernel/irq.c
arch/ia64/sn/kernel/irq.c
+15
-0
arch/ia64/sn/kernel/sn2/sn2_smp.c
arch/ia64/sn/kernel/sn2/sn2_smp.c
+26
-0
arch/ia64/sn/kernel/sn2/sn_hwperf.c
arch/ia64/sn/kernel/sn2/sn_hwperf.c
+2
-1
arch/ia64/sn/pci/pcibr/pcibr_provider.c
arch/ia64/sn/pci/pcibr/pcibr_provider.c
+1
-0
arch/ia64/sn/pci/tioca_provider.c
arch/ia64/sn/pci/tioca_provider.c
+2
-0
arch/ia64/sn/pci/tioce_provider.c
arch/ia64/sn/pci/tioce_provider.c
+1
-0
include/asm-ia64/hpsim.h
include/asm-ia64/hpsim.h
+16
-0
include/asm-ia64/sn/arch.h
include/asm-ia64/sn/arch.h
+1
-0
include/asm-ia64/sn/intr.h
include/asm-ia64/sn/intr.h
+1
-0
include/asm-ia64/sn/sn_feature_sets.h
include/asm-ia64/sn/sn_feature_sets.h
+1
-0
未找到文件。
arch/ia64/hp/sim/hpsim_console.c
浏览文件 @
ea3c4b12
...
...
@@ -21,6 +21,7 @@
#include <asm/machvec.h>
#include <asm/pgtable.h>
#include <asm/sal.h>
#include <asm/hpsim.h>
#include "hpsim_ssc.h"
...
...
@@ -28,7 +29,7 @@ static int simcons_init (struct console *, char *);
static
void
simcons_write
(
struct
console
*
,
const
char
*
,
unsigned
);
static
struct
tty_driver
*
simcons_console_device
(
struct
console
*
,
int
*
);
struct
console
hpsim_cons
=
{
st
atic
st
ruct
console
hpsim_cons
=
{
.
name
=
"simcons"
,
.
write
=
simcons_write
,
.
device
=
simcons_console_device
,
...
...
@@ -58,7 +59,18 @@ simcons_write (struct console *cons, const char *buf, unsigned count)
static
struct
tty_driver
*
simcons_console_device
(
struct
console
*
c
,
int
*
index
)
{
extern
struct
tty_driver
*
hp_simserial_driver
;
*
index
=
c
->
index
;
return
hp_simserial_driver
;
}
int
simcons_register
(
void
)
{
if
(
!
ia64_platform_is
(
"hpsim"
))
return
1
;
if
(
hpsim_cons
.
flags
&
CON_ENABLED
)
return
1
;
register_console
(
&
hpsim_cons
);
return
0
;
}
arch/ia64/hp/sim/hpsim_setup.c
浏览文件 @
ea3c4b12
...
...
@@ -21,6 +21,7 @@
#include <asm/machvec.h>
#include <asm/pgtable.h>
#include <asm/sal.h>
#include <asm/hpsim.h>
#include "hpsim_ssc.h"
...
...
@@ -41,11 +42,5 @@ hpsim_setup (char **cmdline_p)
{
ROOT_DEV
=
Root_SDA1
;
/* default to first SCSI drive */
#ifdef CONFIG_HP_SIMSERIAL_CONSOLE
{
extern
struct
console
hpsim_cons
;
if
(
ia64_platform_is
(
"hpsim"
))
register_console
(
&
hpsim_cons
);
}
#endif
simcons_register
();
}
arch/ia64/hp/sim/simeth.c
浏览文件 @
ea3c4b12
...
...
@@ -22,6 +22,9 @@
#include <linux/bitops.h>
#include <asm/system.h>
#include <asm/irq.h>
#include <asm/hpsim.h>
#include "hpsim_ssc.h"
#define SIMETH_RECV_MAX 10
...
...
@@ -35,12 +38,6 @@
#define SIMETH_FRAME_SIZE ETH_FRAME_LEN
#define SSC_NETDEV_PROBE 100
#define SSC_NETDEV_SEND 101
#define SSC_NETDEV_RECV 102
#define SSC_NETDEV_ATTACH 103
#define SSC_NETDEV_DETACH 104
#define NETWORK_INTR 8
struct
simeth_local
{
...
...
@@ -124,9 +121,6 @@ simeth_probe (void)
return
r
;
}
extern
long
ia64_ssc
(
long
,
long
,
long
,
long
,
int
);
extern
void
ia64_ssc_connect_irq
(
long
intr
,
long
irq
);
static
inline
int
netdev_probe
(
char
*
name
,
unsigned
char
*
ether
)
{
...
...
arch/ia64/hp/sim/simscsi.c
浏览文件 @
ea3c4b12
...
...
@@ -14,6 +14,7 @@
#include <linux/kernel.h>
#include <linux/timer.h>
#include <asm/irq.h>
#include "hpsim_ssc.h"
#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
...
...
@@ -59,8 +60,6 @@ struct disk_stat {
unsigned
count
;
};
extern
long
ia64_ssc
(
long
arg0
,
long
arg1
,
long
arg2
,
long
arg3
,
int
nr
);
static
int
desc
[
16
]
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
};
...
...
arch/ia64/kernel/irq_ia64.c
浏览文件 @
ea3c4b12
...
...
@@ -82,7 +82,7 @@ struct irq_cfg irq_cfg[NR_IRQS] __read_mostly = {
};
DEFINE_PER_CPU
(
int
[
IA64_NUM_VECTORS
],
vector_irq
)
=
{
[
0
...
IA64_NUM_VECTORS
-
1
]
=
IA64_SPURIOUS_INT_VECTOR
[
0
...
IA64_NUM_VECTORS
-
1
]
=
-
1
};
static
cpumask_t
vector_table
[
IA64_NUM_VECTORS
]
=
{
...
...
@@ -179,7 +179,7 @@ static void __clear_irq_vector(int irq)
domain
=
cfg
->
domain
;
cpus_and
(
mask
,
cfg
->
domain
,
cpu_online_map
);
for_each_cpu_mask
(
cpu
,
mask
)
per_cpu
(
vector_irq
,
cpu
)[
vector
]
=
IA64_SPURIOUS_INT_VECTOR
;
per_cpu
(
vector_irq
,
cpu
)[
vector
]
=
-
1
;
cfg
->
vector
=
IRQ_VECTOR_UNASSIGNED
;
cfg
->
domain
=
CPU_MASK_NONE
;
irq_status
[
irq
]
=
IRQ_UNUSED
;
...
...
@@ -249,7 +249,7 @@ void __setup_vector_irq(int cpu)
/* Clear vector_irq */
for
(
vector
=
0
;
vector
<
IA64_NUM_VECTORS
;
++
vector
)
per_cpu
(
vector_irq
,
cpu
)[
vector
]
=
IA64_SPURIOUS_INT_VECTOR
;
per_cpu
(
vector_irq
,
cpu
)[
vector
]
=
-
1
;
/* Mark the inuse vectors */
for
(
irq
=
0
;
irq
<
NR_IRQS
;
++
irq
)
{
if
(
!
cpu_isset
(
cpu
,
irq_cfg
[
irq
].
domain
))
...
...
@@ -432,10 +432,18 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)
}
else
if
(
unlikely
(
IS_RESCHEDULE
(
vector
)))
kstat_this_cpu
.
irqs
[
vector
]
++
;
else
{
int
irq
=
local_vector_to_irq
(
vector
);
ia64_setreg
(
_IA64_REG_CR_TPR
,
vector
);
ia64_srlz_d
();
generic_handle_irq
(
local_vector_to_irq
(
vector
));
if
(
unlikely
(
irq
<
0
))
{
printk
(
KERN_ERR
"%s: Unexpected interrupt "
"vector %d on CPU %d is not mapped "
"to any IRQ!
\n
"
,
__FUNCTION__
,
vector
,
smp_processor_id
());
}
else
generic_handle_irq
(
irq
);
/*
* Disable interrupts and send EOI:
...
...
@@ -483,6 +491,7 @@ void ia64_process_pending_intr(void)
kstat_this_cpu
.
irqs
[
vector
]
++
;
else
{
struct
pt_regs
*
old_regs
=
set_irq_regs
(
NULL
);
int
irq
=
local_vector_to_irq
(
vector
);
ia64_setreg
(
_IA64_REG_CR_TPR
,
vector
);
ia64_srlz_d
();
...
...
@@ -493,8 +502,15 @@ void ia64_process_pending_intr(void)
* it will work. I hope it works!.
* Probably could shared code.
*/
vectors_in_migration
[
local_vector_to_irq
(
vector
)]
=
0
;
generic_handle_irq
(
local_vector_to_irq
(
vector
));
if
(
unlikely
(
irq
<
0
))
{
printk
(
KERN_ERR
"%s: Unexpected interrupt "
"vector %d on CPU %d not being mapped "
"to any IRQ!!
\n
"
,
__FUNCTION__
,
vector
,
smp_processor_id
());
}
else
{
vectors_in_migration
[
irq
]
=
0
;
generic_handle_irq
(
irq
);
}
set_irq_regs
(
old_regs
);
/*
...
...
arch/ia64/kernel/setup.c
浏览文件 @
ea3c4b12
...
...
@@ -60,6 +60,7 @@
#include <asm/smp.h>
#include <asm/system.h>
#include <asm/unistd.h>
#include <asm/hpsim.h>
#if defined(CONFIG_SMP) && (IA64_CPU_SIZE > PAGE_SIZE)
# error "struct cpuinfo_ia64 too big!"
...
...
@@ -389,13 +390,8 @@ early_console_setup (char *cmdline)
if
(
!
efi_setup_pcdp_console
(
cmdline
))
earlycons
++
;
#endif
#ifdef CONFIG_HP_SIMSERIAL_CONSOLE
{
extern
struct
console
hpsim_cons
;
register_console
(
&
hpsim_cons
);
if
(
!
simcons_register
())
earlycons
++
;
}
#endif
return
(
earlycons
)
?
0
:
-
1
;
}
...
...
@@ -960,6 +956,11 @@ cpu_init (void)
/* clear TPR & XTP to enable all interrupt classes: */
ia64_setreg
(
_IA64_REG_CR_TPR
,
0
);
/* Clear any pending interrupts left by SAL/EFI */
while
(
ia64_get_ivr
()
!=
IA64_SPURIOUS_INT_VECTOR
)
ia64_eoi
();
#ifdef CONFIG_SMP
normal_xtp
();
#endif
...
...
arch/ia64/kernel/smpboot.c
浏览文件 @
ea3c4b12
...
...
@@ -58,6 +58,7 @@
#include <asm/system.h>
#include <asm/tlbflush.h>
#include <asm/unistd.h>
#include <asm/sn/arch.h>
#define SMP_DEBUG 0
...
...
@@ -730,6 +731,11 @@ int __cpu_disable(void)
return
(
-
EBUSY
);
}
if
(
ia64_platform_is
(
"sn2"
))
{
if
(
!
sn_cpu_disable_allowed
(
cpu
))
return
-
EBUSY
;
}
cpu_clear
(
cpu
,
cpu_online_map
);
if
(
migrate_platform_irqs
(
cpu
))
{
...
...
arch/ia64/mm/contig.c
浏览文件 @
ea3c4b12
...
...
@@ -17,6 +17,7 @@
#include <linux/bootmem.h>
#include <linux/efi.h>
#include <linux/mm.h>
#include <linux/nmi.h>
#include <linux/swap.h>
#include <asm/meminit.h>
...
...
@@ -56,6 +57,8 @@ void show_mem(void)
present
=
pgdat
->
node_present_pages
;
for
(
i
=
0
;
i
<
pgdat
->
node_spanned_pages
;
i
++
)
{
struct
page
*
page
;
if
(
unlikely
(
i
%
MAX_ORDER_NR_PAGES
==
0
))
touch_nmi_watchdog
();
if
(
pfn_valid
(
pgdat
->
node_start_pfn
+
i
))
page
=
pfn_to_page
(
pgdat
->
node_start_pfn
+
i
);
else
{
...
...
arch/ia64/mm/discontig.c
浏览文件 @
ea3c4b12
...
...
@@ -16,6 +16,7 @@
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/nmi.h>
#include <linux/swap.h>
#include <linux/bootmem.h>
#include <linux/acpi.h>
...
...
@@ -533,6 +534,8 @@ void show_mem(void)
present
=
pgdat
->
node_present_pages
;
for
(
i
=
0
;
i
<
pgdat
->
node_spanned_pages
;
i
++
)
{
struct
page
*
page
;
if
(
unlikely
(
i
%
MAX_ORDER_NR_PAGES
==
0
))
touch_nmi_watchdog
();
if
(
pfn_valid
(
pgdat
->
node_start_pfn
+
i
))
page
=
pfn_to_page
(
pgdat
->
node_start_pfn
+
i
);
else
{
...
...
arch/ia64/sn/kernel/huberror.c
浏览文件 @
ea3c4b12
...
...
@@ -185,11 +185,14 @@ void hubiio_crb_error_handler(struct hubdev_info *hubdev_info)
*/
void
hub_error_init
(
struct
hubdev_info
*
hubdev_info
)
{
if
(
request_irq
(
SGI_II_ERROR
,
hub_eint_handler
,
IRQF_SHARED
,
"SN_hub_error"
,
(
void
*
)
hubdev_info
))
"SN_hub_error"
,
(
void
*
)
hubdev_info
))
{
printk
(
"hub_error_init: Failed to request_irq for 0x%p
\n
"
,
hubdev_info
);
return
;
return
;
}
sn_set_err_irq_affinity
(
SGI_II_ERROR
);
}
...
...
@@ -202,11 +205,14 @@ void hub_error_init(struct hubdev_info *hubdev_info)
*/
void
ice_error_init
(
struct
hubdev_info
*
hubdev_info
)
{
if
(
request_irq
(
SGI_TIO_ERROR
,
(
void
*
)
hub_eint_handler
,
IRQF_SHARED
,
"SN_TIO_error"
,
(
void
*
)
hubdev_info
))
(
void
*
)
hubdev_info
))
{
printk
(
"ice_error_init: request_irq() error hubdev_info 0x%p
\n
"
,
hubdev_info
);
return
;
return
;
}
sn_set_err_irq_affinity
(
SGI_TIO_ERROR
);
}
arch/ia64/sn/kernel/irq.c
浏览文件 @
ea3c4b12
...
...
@@ -19,6 +19,7 @@
#include <asm/sn/pcidev.h>
#include <asm/sn/shub_mmr.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/sn_feature_sets.h>
static
void
force_interrupt
(
int
irq
);
static
void
register_intr_pda
(
struct
sn_irq_info
*
sn_irq_info
);
...
...
@@ -233,6 +234,20 @@ static void sn_set_affinity_irq(unsigned int irq, cpumask_t mask)
(
void
)
sn_retarget_vector
(
sn_irq_info
,
nasid
,
slice
);
}
#ifdef CONFIG_SMP
void
sn_set_err_irq_affinity
(
unsigned
int
irq
)
{
/*
* On systems which support CPU disabling (SHub2), all error interrupts
* are targetted at the boot CPU.
*/
if
(
is_shub2
()
&&
sn_prom_feature_available
(
PRF_CPU_DISABLE_SUPPORT
))
set_irq_affinity_info
(
irq
,
cpu_physical_id
(
0
),
0
);
}
#else
void
sn_set_err_irq_affinity
(
unsigned
int
irq
)
{
}
#endif
static
void
sn_mask_irq
(
unsigned
int
irq
)
{
...
...
arch/ia64/sn/kernel/sn2/sn2_smp.c
浏览文件 @
ea3c4b12
...
...
@@ -40,6 +40,7 @@
#include <asm/sn/shub_mmr.h>
#include <asm/sn/nodepda.h>
#include <asm/sn/rw_mmr.h>
#include <asm/sn/sn_feature_sets.h>
DEFINE_PER_CPU
(
struct
ptc_stats
,
ptcstats
);
DECLARE_PER_CPU
(
struct
ptc_stats
,
ptcstats
);
...
...
@@ -429,6 +430,31 @@ void sn2_send_IPI(int cpuid, int vector, int delivery_mode, int redirect)
sn_send_IPI_phys
(
nasid
,
physid
,
vector
,
delivery_mode
);
}
#ifdef CONFIG_HOTPLUG_CPU
/**
* sn_cpu_disable_allowed - Determine if a CPU can be disabled.
* @cpu - CPU that is requested to be disabled.
*
* CPU disable is only allowed on SHub2 systems running with a PROM
* that supports CPU disable. It is not permitted to disable the boot processor.
*/
bool
sn_cpu_disable_allowed
(
int
cpu
)
{
if
(
is_shub2
()
&&
sn_prom_feature_available
(
PRF_CPU_DISABLE_SUPPORT
))
{
if
(
cpu
!=
0
)
return
true
;
else
printk
(
KERN_WARNING
"Disabling the boot processor is not allowed.
\n
"
);
}
else
printk
(
KERN_WARNING
"CPU disable is not supported on this system.
\n
"
);
return
false
;
}
#endif
/* CONFIG_HOTPLUG_CPU */
#ifdef CONFIG_PROC_FS
#define PTC_BASENAME "sgi_sn/ptc_statistics"
...
...
arch/ia64/sn/kernel/sn2/sn_hwperf.c
浏览文件 @
ea3c4b12
...
...
@@ -66,7 +66,8 @@ static int sn_hwperf_enum_objects(int *nobj, struct sn_hwperf_object_info **ret)
}
sz
=
sn_hwperf_obj_cnt
*
sizeof
(
struct
sn_hwperf_object_info
);
if
((
objbuf
=
(
struct
sn_hwperf_object_info
*
)
vmalloc
(
sz
))
==
NULL
)
{
objbuf
=
vmalloc
(
sz
);
if
(
objbuf
==
NULL
)
{
printk
(
"sn_hwperf_enum_objects: vmalloc(%d) failed
\n
"
,
(
int
)
sz
);
e
=
-
ENOMEM
;
goto
out
;
...
...
arch/ia64/sn/pci/pcibr/pcibr_provider.c
浏览文件 @
ea3c4b12
...
...
@@ -145,6 +145,7 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
printk
(
KERN_WARNING
"pcibr cannot allocate interrupt for error handler
\n
"
);
}
sn_set_err_irq_affinity
(
SGI_PCIASIC_ERROR
);
/*
* Update the Bridge with the "kernel" pagesize
...
...
arch/ia64/sn/pci/tioca_provider.c
浏览文件 @
ea3c4b12
...
...
@@ -654,6 +654,8 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
__FUNCTION__
,
SGI_TIOCA_ERROR
,
(
int
)
tioca_common
->
ca_common
.
bs_persist_busnum
);
sn_set_err_irq_affinity
(
SGI_TIOCA_ERROR
);
/* Setup locality information */
controller
->
node
=
tioca_kern
->
ca_closest_node
;
return
tioca_common
;
...
...
arch/ia64/sn/pci/tioce_provider.c
浏览文件 @
ea3c4b12
...
...
@@ -1034,6 +1034,7 @@ tioce_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
tioce_common
->
ce_pcibus
.
bs_persist_segment
,
tioce_common
->
ce_pcibus
.
bs_persist_busnum
);
sn_set_err_irq_affinity
(
SGI_PCIASIC_ERROR
);
return
tioce_common
;
}
...
...
include/asm-ia64/hpsim.h
0 → 100644
浏览文件 @
ea3c4b12
#ifndef _ASMIA64_HPSIM_H
#define _ASMIA64_HPSIM_H
#ifndef CONFIG_HP_SIMSERIAL_CONSOLE
static
inline
int
simcons_register
(
void
)
{
return
1
;
}
#else
int
simcons_register
(
void
);
#endif
struct
tty_driver
;
extern
struct
tty_driver
*
hp_simserial_driver
;
void
ia64_ssc_connect_irq
(
long
intr
,
long
irq
);
void
ia64_ctl_trace
(
long
on
);
#endif
include/asm-ia64/sn/arch.h
浏览文件 @
ea3c4b12
...
...
@@ -81,5 +81,6 @@ extern u8 sn_sharing_domain_size;
extern
u8
sn_region_size
;
extern
void
sn_flush_all_caches
(
long
addr
,
long
bytes
);
extern
bool
sn_cpu_disable_allowed
(
int
cpu
);
#endif
/* _ASM_IA64_SN_ARCH_H */
include/asm-ia64/sn/intr.h
浏览文件 @
ea3c4b12
...
...
@@ -60,6 +60,7 @@ extern u64 sn_intr_alloc(nasid_t, int,
int
,
nasid_t
,
int
);
extern
void
sn_intr_free
(
nasid_t
,
int
,
struct
sn_irq_info
*
);
extern
struct
sn_irq_info
*
sn_retarget_vector
(
struct
sn_irq_info
*
,
nasid_t
,
int
);
extern
void
sn_set_err_irq_affinity
(
unsigned
int
);
extern
struct
list_head
**
sn_irq_lh
;
#define CPU_VECTOR_TO_IRQ(cpuid,vector) (vector)
...
...
include/asm-ia64/sn/sn_feature_sets.h
浏览文件 @
ea3c4b12
...
...
@@ -31,6 +31,7 @@ extern int sn_prom_feature_available(int id);
#define PRF_PAL_CACHE_FLUSH_SAFE 0
#define PRF_DEVICE_FLUSH_LIST 1
#define PRF_HOTPLUG_SUPPORT 2
#define PRF_CPU_DISABLE_SUPPORT 3
/* --------------------- OS Features -------------------------------*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录