On Thu, Oct 01 2020 at 22:51, Erez Geva wrote: > Add kernel functions to fetch a pointer to a POSIX dynamic clock > using a user file description dynamic clock ID.
And how is that supposed to work. What are the lifetime rules? > +struct posix_clock *posix_clock_get_clock(clockid_t id) > +{ > + int err; > + struct posix_clock_desc cd; The core code uses reverse fir tree ordering of variable declaration based on the length: struct posix_clock_desc cd; int err; > + /* Verify we use posix clock ID */ > + if (!is_clockid_fd_clock(id)) > + return ERR_PTR(-EINVAL); > + > + err = get_clock_desc(id, &cd); So this is a kernel interface and get_clock_desc() does: struct file *fp = fget(clockid_to_fd(id)); How is that file descriptor valid in random kernel context? > + if (err) > + return ERR_PTR(err); > + > + get_device(cd.clk->dev); The purpose of this is? Comments are overrated... > + put_clock_desc(&cd); > + > + return cd.clk; > +} > +EXPORT_SYMBOL_GPL(posix_clock_get_clock); > + > +int posix_clock_put_clock(struct posix_clock *clk) > +{ > + if (IS_ERR_OR_NULL(clk)) > + return -EINVAL; > + put_device(clk->dev); > + return 0; > +} > +EXPORT_SYMBOL_GPL(posix_clock_put_clock); > + > +int posix_clock_gettime(struct posix_clock *clk, struct timespec64 *ts) > +{ > + int err; > + > + if (IS_ERR_OR_NULL(clk)) > + return -EINVAL; > + > + down_read(&clk->rwsem); Open coding the logic of get_posix_clock() and having a copy here and in the next function is really useful. Thanks, tglx