[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/5] xen/console: allow log level threshold adjustments
>>> On 04.07.16 at 17:13, <wei.liu2@xxxxxxxxxx> wrote: In case this (or a variant thereof) is to be used despite the earlier voiced concerns, a couple of mechanical comments: > +static const char *loglvl_to_str(int lvl) > +{ > + unsigned int i; > + > + if ( lvl < LOG_LEVEL_MIN || lvl > LOG_LEVEL_MAX ) > + return "???"; > + > + /* Multiple log levels can use the same number. Return the most > + * comprehensive log level string. > + */ Comment style. > + for ( i = ARRAY_SIZE(log_levels) - 1; i >= 0; i-- ) Possibly infinite loop - i is unsigned and hence always non-negative. > +int console_loglvl_op(struct xen_sysctl_loglvl_op *op) > +{ > + int ret; > + > + switch ( op->cmd ) > + { > + default: > + ret = -EOPNOTSUPP; > + break; > + > + case XEN_SYSCTL_LOGLVL_set: > + { > + char *buf; > + unsigned int buf_size = 0; Pointless initializer. > + int host_lower_thresh, host_upper_thresh; > + int guest_lower_thresh, guest_upper_thresh; > + > + buf_size = op->host.lower_thresh_len; > + if ( buf_size < op->host.upper_thresh_len ) > + buf_size = op->host.upper_thresh_len; > + if ( buf_size < op->guest.lower_thresh_len ) > + buf_size = op->guest.lower_thresh_len; > + if ( buf_size < op->guest.upper_thresh_len ) > + buf_size = op->guest.upper_thresh_len; > + > + buf = xmalloc_array(char, buf_size); > + if ( !buf ) > + { > + ret = -ENOMEM; > + goto set_done; > + } > + > +#define parse(hg, lu) \ > + hg##_##lu##_thresh = -1; \ > + if ( op->hg.lu ##_thresh_len ) \ > + { \ > + if ( copy_from_guest(buf, op->hg.lu ##_thresh, \ > + op->hg.lu ##_thresh_len) ) \ > + { \ > + ret = -EFAULT; \ > + goto set_done; \ > + } \ > + \ > + buf[buf_size-1] = 0; \ > + \ > + ret = parse_log_level(buf); \ > + if ( ret == -1 ) \ > + { \ > + ret = -EINVAL; \ > + goto set_done; \ > + } \ > + \ > + hg##_##lu##_thresh = ret; \ > + } > + > + parse(host, lower); > + parse(host, upper); > + parse(guest, lower); > + parse(guest, upper); > + > +#undef parse > + > + if ( (host_lower_thresh >= 0 && host_upper_thresh >= 0 && > + host_lower_thresh > host_upper_thresh) || > + (guest_lower_thresh >= 0 && guest_upper_thresh >= 0 && > + guest_lower_thresh > guest_upper_thresh) ) > + { > + ret = -EINVAL; > + goto set_done; > + } > + > + do_loglvl_op(host_lower_thresh, host_upper_thresh, > + &xenlog_lower_thresh, &xenlog_upper_thresh, > + "standard"); > + > + do_loglvl_op(guest_lower_thresh, guest_upper_thresh, > + &xenlog_guest_lower_thresh, &xenlog_guest_upper_thresh, > + "guest"); > + > + ret = 0; > + set_done: > + xfree(buf); > + break; > + } > + case XEN_SYSCTL_LOGLVL_get: Blank line ahead of the case label please. > + { > + unsigned int host_lower_thresh_len = > + strlen(loglvl_to_str(xenlog_lower_thresh)) + 1; > + unsigned int host_upper_thresh_len = > + strlen(loglvl_to_str(xenlog_upper_thresh)) + 1; > + unsigned int guest_lower_thresh_len = > + strlen(loglvl_to_str(xenlog_guest_lower_thresh)) + 1; > + unsigned int guest_upper_thresh_len = > + strlen(loglvl_to_str(xenlog_guest_upper_thresh)) + 1; > + char scratch[LOG_LEVEL_STRLEN_MAX+1]; > + > + if ( (op->host.lower_thresh_len && > + op->host.lower_thresh_len < host_lower_thresh_len) || > + (op->host.upper_thresh_len && > + op->host.upper_thresh_len < host_upper_thresh_len) || > + (op->guest.lower_thresh_len && > + op->guest.lower_thresh_len < guest_lower_thresh_len) || > + (op->guest.upper_thresh_len > + && op->guest.upper_thresh_len < guest_upper_thresh_len) > + ) > + { > + ret = -ENOBUFS; > + goto get_done; > + } > + > + ret = -EFAULT; > + > + if ( op->host.lower_thresh_len ) > + { > + snprintf(scratch, sizeof(scratch), "%s", > + loglvl_to_str(xenlog_lower_thresh)); > + if ( copy_to_guest(op->host.lower_thresh, scratch, > + strlen(scratch)+1) ) > + goto get_done; Why the indirection through snprintf()? > --- a/xen/include/public/sysctl.h > +++ b/xen/include/public/sysctl.h > @@ -1031,6 +1031,45 @@ struct xen_sysctl_livepatch_op { > typedef struct xen_sysctl_livepatch_op xen_sysctl_livepatch_op_t; > DEFINE_XEN_GUEST_HANDLE(xen_sysctl_livepatch_op_t); > > +/* XEN_SYSCTL_loglvl_op */ > +#define XEN_SYSCTL_LOGLVL_get 0 > +#define XEN_SYSCTL_LOGLVL_set 1 > +struct xen_sysctl_loglvl_op { > + uint32_t cmd; /* XEN_SYSCTL_LOGLVL_* */ > + struct xen_sysctl_loglvl_thresh { Explicit padding please ahead of this struct. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |