Messages in this thread | | | Date | Tue, 5 Sep 2023 18:17:26 +0200 | Subject | Re: [PATCH v4 7/7] sched/fair: Fair server interface | From | Daniel Bristot de Oliveira <> |
| |
On 9/5/23 15:55, Peter Zijlstra wrote: > On Thu, Aug 31, 2023 at 10:28:58PM +0200, Daniel Bristot de Oliveira wrote: >> +static ssize_t >> +sched_fair_server_runtime_write(struct file *filp, const char __user *ubuf, >> + size_t cnt, loff_t *ppos) >> +{ >> + long cpu = (long) ((struct seq_file *) filp->private_data)->private; >> + struct rq *rq = cpu_rq(cpu); >> + unsigned long flags; >> + u64 runtime; >> + int err; >> + >> + err = kstrtoull_from_user(ubuf, cnt, 10, &runtime); >> + if (err) >> + return err; >> + >> + raw_spin_rq_lock_irqsave(rq, flags); >> + if (runtime > rq->fair_server.dl_period) >> + err = -EINVAL; >> + else >> + rq->fair_server.dl_runtime = runtime; >> + raw_spin_rq_unlock_irqrestore(rq, flags); >> + >> + if (err) >> + return err; >> + >> + *ppos += cnt; >> + return cnt; >> +} > >> +static ssize_t >> +sched_fair_server_period_write(struct file *filp, const char __user *ubuf, >> + size_t cnt, loff_t *ppos) >> +{ >> + long cpu = (long) ((struct seq_file *) filp->private_data)->private; >> + struct rq *rq = cpu_rq(cpu); >> + unsigned long flags; >> + u64 period; >> + int err; >> + >> + err = kstrtoull_from_user(ubuf, cnt, 10, &period); >> + if (err) >> + return err; >> + >> + if (period < fair_server_period_min || period > fair_server_period_max) >> + return -EINVAL; >> + >> + raw_spin_rq_lock_irqsave(rq, flags); >> + if (period < rq->fair_server.dl_runtime) >> + err = -EINVAL; >> + else >> + rq->fair_server.dl_period = period; >> + raw_spin_rq_unlock_irqrestore(rq, flags); >> + >> + if (err) >> + return err; >> + >> + *ppos += cnt; >> + return cnt; >> +} > >> +static ssize_t >> +sched_fair_server_defer_write(struct file *filp, const char __user *ubuf, >> + size_t cnt, loff_t *ppos) >> +{ >> + long cpu = (long) ((struct seq_file *) filp->private_data)->private; >> + struct rq *rq = cpu_rq(cpu); >> + unsigned long flags; >> + u64 defer; >> + int err; >> + >> + err = kstrtoull_from_user(ubuf, cnt, 10, &defer); >> + if (err) >> + return err; >> + >> + if (defer < 0 || defer > 1) >> + return -EINVAL; >> + >> + raw_spin_rq_lock_irqsave(rq, flags); >> + rq->fair_server_defer = defer; >> + raw_spin_rq_unlock_irqrestore(rq, flags); >> + >> + *ppos += cnt; >> + return cnt; >> +} > > Surely we can write a single function that does all of that with less > duplication?
I agree, I will use your code as starting point for that...
> > Additionally, should not the deadline parameters be vetted by access > control before being accepted ?
like security_task_getscheduler(p)? But we have no p...
I checked rt throttling, but it seems that it does not check. Do you have a pointer?
-- Daniel
| |