Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1709830 > unrolled thread
| Started by | Tejun Heo <tj@kernel.org> |
|---|---|
| First post | 2017-08-11 18:40 +0200 |
| Last post | 2017-08-24 19:30 +0200 |
| Articles | 9 — 2 participants |
Back to article view | Back to linux.kernel
[PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting Tejun Heo <tj@kernel.org> - 2017-08-11 18:40 +0200
[PATCH 1/3] sched/cputime: Expose cputime_adjust() Tejun Heo <tj@kernel.org> - 2017-08-11 18:40 +0200
[PATCH 2/3] cpuacct: Introduce cgroup_account_cputime[_field]() Tejun Heo <tj@kernel.org> - 2017-08-11 18:40 +0200
[PATCH v2 2/3] cpuacct: Introduce cgroup_account_cputime[_field]() Tejun Heo <tj@kernel.org> - 2017-08-11 19:30 +0200
Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting Tejun Heo <tj@kernel.org> - 2017-08-16 21:00 +0200
Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting Ingo Molnar <mingo@kernel.org> - 2017-08-17 10:20 +0200
Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting Tejun Heo <tj@kernel.org> - 2017-08-17 15:10 +0200
Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting Ingo Molnar <mingo@kernel.org> - 2017-08-17 17:10 +0200
Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting Tejun Heo <tj@kernel.org> - 2017-08-24 19:30 +0200
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2017-08-11 18:40 +0200 |
| Subject | [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting |
| Message-ID | <udl8B-5QR-19@gated-at.bofh.it> |
Hello, This patchset implement cgroup2 basic resource accounting and track CPU usages on all cgroups by default. In cgroup1, collecting non-trivial statistics by default wasn't viable because there can be any number of hierarchies. While cgroup2's single hierarchy removes that part of the problem, propagating up the hierarchy on each accounting event is still problematic. This patchset implements cgroup2 basic resource accounting mechanism which keeps all the counters per-cpu and propagates lazily to allow the accounting side to only perform single per-cpu accounting in most cases and the reader side's complexity to be O(nr updated descendants) instead of O(nr total descendants). This will be used by cgroup2 CPU interface later. The patchset contains the following three patches. 0001-sched-cputime-Expose-cputime_adjust.patch 0002-cpuacct-Introduce-cgroup_account_cputime-_field.patch 0003-cgroup-Implement-cgroup2-basic-CPU-usage-accounting.patch The patchset is on top of cgroup/for-4.14 and available in the following git branch. git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git review-cgroup2-basic-acct diffstat follows. Thanks. Documentation/cgroup-v2.txt | 9 + include/linux/cgroup-defs.h | 47 +++++ include/linux/cgroup.h | 60 +++++++ include/linux/sched/cputime.h | 3 kernel/cgroup/Makefile | 2 kernel/cgroup/cgroup-internal.h | 8 kernel/cgroup/cgroup.c | 24 ++ kernel/cgroup/stat.c | 333 ++++++++++++++++++++++++++++++++++++++++ kernel/sched/cpuacct.h | 17 -- kernel/sched/cputime.c | 7 kernel/sched/deadline.c | 2 kernel/sched/fair.c | 2 kernel/sched/rt.c | 2 kernel/sched/sched.h | 1 kernel/sched/stop_task.c | 2 15 files changed, 489 insertions(+), 30 deletions(-) -- tejun
[toc] | [next] | [standalone]
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2017-08-11 18:40 +0200 |
| Subject | [PATCH 1/3] sched/cputime: Expose cputime_adjust() |
| Message-ID | <udl8B-5QR-21@gated-at.bofh.it> |
| In reply to | #1709830 |
Will be used by basic cgroup resource stat reporting later.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Li Zefan <lizefan@huawei.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
---
include/linux/sched/cputime.h | 3 ++-
kernel/sched/cputime.c | 5 ++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/linux/sched/cputime.h b/include/linux/sched/cputime.h
index 4c5b973..9251044 100644
--- a/include/linux/sched/cputime.h
+++ b/include/linux/sched/cputime.h
@@ -53,7 +53,8 @@ static inline void task_cputime_scaled(struct task_struct *t,
extern void task_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st);
extern void thread_group_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st);
-
+extern void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev,
+ u64 *ut, u64 *st);
/*
* Thread group CPU time accounting.
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index 6e3ea4a..3a8bfcc 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -585,9 +585,8 @@ static u64 scale_stime(u64 stime, u64 rtime, u64 total)
*
* Assuming that rtime_i+1 >= rtime_i.
*/
-static void cputime_adjust(struct task_cputime *curr,
- struct prev_cputime *prev,
- u64 *ut, u64 *st)
+void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev,
+ u64 *ut, u64 *st)
{
u64 rtime, stime, utime;
unsigned long flags;
--
2.9.3
[toc] | [prev] | [next] | [standalone]
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2017-08-11 18:40 +0200 |
| Subject | [PATCH 2/3] cpuacct: Introduce cgroup_account_cputime[_field]() |
| Message-ID | <udl8C-5QR-43@gated-at.bofh.it> |
| In reply to | #1709830 |
Introduce cgroup_account_cputime[_field]() which wrap cpuacct_charge()
and cgroup_account_field(). This doesn't introduce any functional
changes and will be used to add cgroup basic resource accounting.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
---
include/linux/cgroup.h | 38 ++++++++++++++++++++++++++++++++++++++
kernel/sched/cpuacct.h | 17 -----------------
kernel/sched/cputime.c | 2 +-
kernel/sched/deadline.c | 2 +-
kernel/sched/fair.c | 2 +-
kernel/sched/rt.c | 2 +-
kernel/sched/sched.h | 1 -
kernel/sched/stop_task.c | 2 +-
8 files changed, 43 insertions(+), 23 deletions(-)
delete mode 100644 kernel/sched/cpuacct.h
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 085056e..f395e02 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -22,6 +22,7 @@
#include <linux/nsproxy.h>
#include <linux/user_namespace.h>
#include <linux/refcount.h>
+#include <linux/kernel_stat.h>
#include <linux/cgroup-defs.h>
@@ -675,6 +676,43 @@ static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
#endif /* !CONFIG_CGROUPS */
/*
+ * Basic resource stats.
+ */
+#ifdef CONFIG_CGROUPS
+
+#ifdef CONFIG_CGROUP_CPUACCT
+void cpuacct_charge(struct task_struct *tsk, u64 cputime);
+void cpuacct_account_field(struct task_struct *tsk, int index, u64 val);
+#else
+static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime) {}
+static inline void cpuacct_account_field(struct task_struct *tsk, int index,
+ u64 val) {}
+#endif
+
+static inline void cgroup_account_cputime(struct task_struct *task,
+ u64 delta_exec)
+{
+ cpuacct_charge(task, delta_exec);
+}
+
+static inline void cgroup_account_cputime_field(struct task_struct *task,
+ enum cpu_usage_stat index,
+ u64 delta_exec)
+{
+ cpuacct_account_field(task, index, delta_exec);
+}
+
+#else /* CONFIG_CGROUPS */
+
+static inline void cgroup_account_cputime(struct task_struct *task,
+ u64 delta_exec) {}
+static inline void cgroup_account_cputime_field(struct task_struct *task,
+ enum cpu_usage_stat index,
+ u64 delta_exec) {}
+
+#endif /* CONFIG_CGROUPS */
+
+/*
* sock->sk_cgrp_data handling. For more info, see sock_cgroup_data
* definition in cgroup-defs.h.
*/
diff --git a/kernel/sched/cpuacct.h b/kernel/sched/cpuacct.h
deleted file mode 100644
index ba72807..0000000
--- a/kernel/sched/cpuacct.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifdef CONFIG_CGROUP_CPUACCT
-
-extern void cpuacct_charge(struct task_struct *tsk, u64 cputime);
-extern void cpuacct_account_field(struct task_struct *tsk, int index, u64 val);
-
-#else
-
-static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime)
-{
-}
-
-static inline void
-cpuacct_account_field(struct task_struct *tsk, int index, u64 val)
-{
-}
-
-#endif
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index 3a8bfcc..d13149d 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -109,7 +109,7 @@ static inline void task_group_account_field(struct task_struct *p, int index,
*/
__this_cpu_add(kernel_cpustat.cpustat[index], tmp);
- cpuacct_account_field(p, index, tmp);
+ cgroup_account_cputime_field(p, index, tmp);
}
/*
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index a84299f..4d5119f 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1145,7 +1145,7 @@ static void update_curr_dl(struct rq *rq)
account_group_exec_runtime(curr, delta_exec);
curr->se.exec_start = rq_clock_task(rq);
- cpuacct_charge(curr, delta_exec);
+ cgroup_account_cputime(curr, delta_exec);
sched_rt_avg_update(rq, delta_exec);
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c95880e..9b2e0b6 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -864,7 +864,7 @@ static void update_curr(struct cfs_rq *cfs_rq)
struct task_struct *curtask = task_of(curr);
trace_sched_stat_runtime(curtask, delta_exec, curr->vruntime);
- cpuacct_charge(curtask, delta_exec);
+ cgroup_account_cputime(curtask, delta_exec);
account_group_exec_runtime(curtask, delta_exec);
}
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 45caf93..ed6e95d 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -979,7 +979,7 @@ static void update_curr_rt(struct rq *rq)
account_group_exec_runtime(curr, delta_exec);
curr->se.exec_start = rq_clock_task(rq);
- cpuacct_charge(curr, delta_exec);
+ cgroup_account_cputime(curr, delta_exec);
sched_rt_avg_update(rq, delta_exec);
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index eeef1a3..35812d779 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -36,7 +36,6 @@
#include "cpupri.h"
#include "cpudeadline.h"
-#include "cpuacct.h"
#ifdef CONFIG_SCHED_DEBUG
# define SCHED_WARN_ON(x) WARN_ONCE(x, #x)
diff --git a/kernel/sched/stop_task.c b/kernel/sched/stop_task.c
index 9f69fb6..ec0bb5a 100644
--- a/kernel/sched/stop_task.c
+++ b/kernel/sched/stop_task.c
@@ -71,7 +71,7 @@ static void put_prev_task_stop(struct rq *rq, struct task_struct *prev)
account_group_exec_runtime(curr, delta_exec);
curr->se.exec_start = rq_clock_task(rq);
- cpuacct_charge(curr, delta_exec);
+ cgroup_account_cputime(curr, delta_exec);
}
static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued)
--
2.9.3
[toc] | [prev] | [next] | [standalone]
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2017-08-11 19:30 +0200 |
| Subject | [PATCH v2 2/3] cpuacct: Introduce cgroup_account_cputime[_field]() |
| Message-ID | <udlUZ-6mk-9@gated-at.bofh.it> |
| In reply to | #1709837 |
From 1f88d33de13b02e2d6235c0d9451cd10c6e8210f Mon Sep 17 00:00:00 2001
From: Tejun Heo <tj@kernel.org>
Date: Fri, 11 Aug 2017 10:24:12 -0700
Introduce cgroup_account_cputime[_field]() which wrap cpuacct_charge()
and cgroup_account_field(). This doesn't introduce any functional
changes and will be used to add cgroup basic resource accounting.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
---
Fix build failure from missing include.
Thanks.
include/linux/cgroup.h | 38 ++++++++++++++++++++++++++++++++++++++
kernel/sched/cpuacct.h | 17 -----------------
kernel/sched/cputime.c | 2 +-
kernel/sched/deadline.c | 2 +-
kernel/sched/fair.c | 2 +-
kernel/sched/rt.c | 2 +-
kernel/sched/sched.h | 2 +-
kernel/sched/stop_task.c | 2 +-
8 files changed, 44 insertions(+), 23 deletions(-)
delete mode 100644 kernel/sched/cpuacct.h
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 085056e..f395e02 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -22,6 +22,7 @@
#include <linux/nsproxy.h>
#include <linux/user_namespace.h>
#include <linux/refcount.h>
+#include <linux/kernel_stat.h>
#include <linux/cgroup-defs.h>
@@ -675,6 +676,43 @@ static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
#endif /* !CONFIG_CGROUPS */
/*
+ * Basic resource stats.
+ */
+#ifdef CONFIG_CGROUPS
+
+#ifdef CONFIG_CGROUP_CPUACCT
+void cpuacct_charge(struct task_struct *tsk, u64 cputime);
+void cpuacct_account_field(struct task_struct *tsk, int index, u64 val);
+#else
+static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime) {}
+static inline void cpuacct_account_field(struct task_struct *tsk, int index,
+ u64 val) {}
+#endif
+
+static inline void cgroup_account_cputime(struct task_struct *task,
+ u64 delta_exec)
+{
+ cpuacct_charge(task, delta_exec);
+}
+
+static inline void cgroup_account_cputime_field(struct task_struct *task,
+ enum cpu_usage_stat index,
+ u64 delta_exec)
+{
+ cpuacct_account_field(task, index, delta_exec);
+}
+
+#else /* CONFIG_CGROUPS */
+
+static inline void cgroup_account_cputime(struct task_struct *task,
+ u64 delta_exec) {}
+static inline void cgroup_account_cputime_field(struct task_struct *task,
+ enum cpu_usage_stat index,
+ u64 delta_exec) {}
+
+#endif /* CONFIG_CGROUPS */
+
+/*
* sock->sk_cgrp_data handling. For more info, see sock_cgroup_data
* definition in cgroup-defs.h.
*/
diff --git a/kernel/sched/cpuacct.h b/kernel/sched/cpuacct.h
deleted file mode 100644
index ba72807..0000000
--- a/kernel/sched/cpuacct.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifdef CONFIG_CGROUP_CPUACCT
-
-extern void cpuacct_charge(struct task_struct *tsk, u64 cputime);
-extern void cpuacct_account_field(struct task_struct *tsk, int index, u64 val);
-
-#else
-
-static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime)
-{
-}
-
-static inline void
-cpuacct_account_field(struct task_struct *tsk, int index, u64 val)
-{
-}
-
-#endif
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index 3a8bfcc..d13149d 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -109,7 +109,7 @@ static inline void task_group_account_field(struct task_struct *p, int index,
*/
__this_cpu_add(kernel_cpustat.cpustat[index], tmp);
- cpuacct_account_field(p, index, tmp);
+ cgroup_account_cputime_field(p, index, tmp);
}
/*
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index a84299f..4d5119f 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1145,7 +1145,7 @@ static void update_curr_dl(struct rq *rq)
account_group_exec_runtime(curr, delta_exec);
curr->se.exec_start = rq_clock_task(rq);
- cpuacct_charge(curr, delta_exec);
+ cgroup_account_cputime(curr, delta_exec);
sched_rt_avg_update(rq, delta_exec);
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c95880e..9b2e0b6 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -864,7 +864,7 @@ static void update_curr(struct cfs_rq *cfs_rq)
struct task_struct *curtask = task_of(curr);
trace_sched_stat_runtime(curtask, delta_exec, curr->vruntime);
- cpuacct_charge(curtask, delta_exec);
+ cgroup_account_cputime(curtask, delta_exec);
account_group_exec_runtime(curtask, delta_exec);
}
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 45caf93..ed6e95d 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -979,7 +979,7 @@ static void update_curr_rt(struct rq *rq)
account_group_exec_runtime(curr, delta_exec);
curr->se.exec_start = rq_clock_task(rq);
- cpuacct_charge(curr, delta_exec);
+ cgroup_account_cputime(curr, delta_exec);
sched_rt_avg_update(rq, delta_exec);
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index eeef1a3..06f606c 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -29,6 +29,7 @@
#include <linux/irq_work.h>
#include <linux/tick.h>
#include <linux/slab.h>
+#include <linux/cgroup.h>
#ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h>
@@ -36,7 +37,6 @@
#include "cpupri.h"
#include "cpudeadline.h"
-#include "cpuacct.h"
#ifdef CONFIG_SCHED_DEBUG
# define SCHED_WARN_ON(x) WARN_ONCE(x, #x)
diff --git a/kernel/sched/stop_task.c b/kernel/sched/stop_task.c
index 9f69fb6..ec0bb5a 100644
--- a/kernel/sched/stop_task.c
+++ b/kernel/sched/stop_task.c
@@ -71,7 +71,7 @@ static void put_prev_task_stop(struct rq *rq, struct task_struct *prev)
account_group_exec_runtime(curr, delta_exec);
curr->se.exec_start = rq_clock_task(rq);
- cpuacct_charge(curr, delta_exec);
+ cgroup_account_cputime(curr, delta_exec);
}
static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued)
--
2.9.3
[toc] | [prev] | [next] | [standalone]
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2017-08-16 21:00 +0200 |
| Subject | Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting |
| Message-ID | <ufbHQ-2eE-9@gated-at.bofh.it> |
| In reply to | #1709830 |
Hello, On Fri, Aug 11, 2017 at 09:37:51AM -0700, Tejun Heo wrote: > This patchset implement cgroup2 basic resource accounting and track > CPU usages on all cgroups by default. Ping. I've renamed as Waiman suggested. If there's no further objection, how should we route these patches and the following cpu cgroup2 interface patch? Thanks. -- tejun
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2017-08-17 10:20 +0200 |
| Subject | Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting |
| Message-ID | <ufoc1-29K-1@gated-at.bofh.it> |
| In reply to | #1713233 |
* Tejun Heo <tj@kernel.org> wrote: > Hello, > > On Fri, Aug 11, 2017 at 09:37:51AM -0700, Tejun Heo wrote: > > This patchset implement cgroup2 basic resource accounting and track > > CPU usages on all cgroups by default. > > Ping. I've renamed as Waiman suggested. If there's no further > objection, how should we route these patches and the following cpu > cgroup2 interface patch? Please hold off on applying it before PeterZ gets back from vacation and has had a chance to review it. Thanks, Ingo
[toc] | [prev] | [next] | [standalone]
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2017-08-17 15:10 +0200 |
| Subject | Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting |
| Message-ID | <ufsIG-5i2-29@gated-at.bofh.it> |
| In reply to | #1713654 |
Hello, Ingo. On Thu, Aug 17, 2017 at 10:13:04AM +0200, Ingo Molnar wrote: > Please hold off on applying it before PeterZ gets back from vacation and has had a > chance to review it. Of course. These aren't going anywhere without Peter's explicit acks. Thanks. -- tejun
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2017-08-17 17:10 +0200 |
| Subject | Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting |
| Message-ID | <ufuAP-6yO-49@gated-at.bofh.it> |
| In reply to | #1714002 |
* Tejun Heo <tj@kernel.org> wrote: > Hello, Ingo. > > On Thu, Aug 17, 2017 at 10:13:04AM +0200, Ingo Molnar wrote: > > Please hold off on applying it before PeterZ gets back from vacation and has had a > > chance to review it. > > Of course. These aren't going anywhere without Peter's explicit acks. Thank you! Ingo
[toc] | [prev] | [next] | [standalone]
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2017-08-24 19:30 +0200 |
| Subject | Re: [PATCHSET for-4.14] cgroup, sched: cgroup2 basic resource accounting |
| Message-ID | <ui478-14g-15@gated-at.bofh.it> |
| In reply to | #1709830 |
A friendly ping. Thanks! -- tejun
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web