[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH] [linux-2.6.39.x for xen] tmem: self-ballooning and frontswap-selfshrinking



> From: Ian Campbell [mailto:Ian.Campbell@xxxxxxxxxx]

Thanks, Ian, for taking the time for review!  Comments below.

> > Since this is the first time I've ported this code to a kernel
> > later than 2.6.34(?), and since this code hasn't gotten formal
> > review even though it's been floating about in various forms
> > for 18 months, I thought I would post it publicly for review,
> > rather than just ask for a pull.  (I'll put it in a git tree after
> > a round or two of feedback.)
> 
> checkpatch.pl says:
> 
> total: 8 errors, 14 warnings, 395 lines checked
> 
> most of them look valid to me. (I commented on a few below before it
> became clear you hadn't run it yourself)

Oops, yes, sorry, I should have done that first :-}
 
> > +unsigned long frontswap_inertia_counter = 0;
> 
> static?

Yes, will fix.
 
> > +       //frontswap_inertia_counter = balloon_stats.frontswap_inertia;
> 
> Please drop this.

Will fix.

> > +       extern unsigned long vm_get_committed_as(void);
> 
> In a header please.

In an ideal world, yes, see below.

> > +       balloon_stats.frontswap_inertia = 3;
> > +#endif
> > +       schedule_delayed_work(&selfballoon_worker,
> > +               balloon_stats.selfballoon_interval * HZ);
> > +#endif
> 
> balloon_init already has paragraphs initialising balloon_stats -- this
> should go up with them I think.

OK, will move.
 
> > +static ssize_t show_selfballooning(struct sys_device *dev, struct 
> > sysdev_attribute *attr,
> > +                             char *buf)
> > +{
> > +       return sprintf(buf, "%d\n", balloon_stats.selfballooning_enabled);
> > +}
> 
> For the show_* you define here you could largely use BALLOON_SHOW to
> define the function, I think.

Thanks, will take a look at that.  I think when I first wrote
this, that wasn't the case but may work now.

> > --- a/mm/mmap.c
> > +++ b/mm/mmap.c
> > @@ -89,6 +89,13 @@ int sysctl_overcommit_ratio = 50;    /* default is 50% */
> >  int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT;
> >  struct percpu_counter vm_committed_as;
> >
> > +unsigned long vm_get_committed_as(void)
> > +{
> > +       return percpu_counter_read_positive(&vm_committed_as);
> > +
> > +}
> > +EXPORT_SYMBOL(vm_get_committed_as);
> > +
> 
> This needs to be split out and go upstream via the mm maintainers (with
> an extern in a header, not a C file).

Although you're right, as I am fresh off a 2-1/2 year odyssey of
upstreaming cleancache, AND since this is almost certainly Xen
specific AND since there will likely be some changes over time
which could conceivably make this unnecessary, I would be content
with carrying this in a Xen-only tree for the foreseeable future.
 
> You add a lot of code to {xen-,}balloon.c which is entirely encased in
> #ifdef CONFIG_THIS_AND_THAT, without very much interaction with existing
> code in those files. That suggests to me that the code should live in
> its own file.
> 
> Some careful consideration needs to go into the split between balloon.c
> (core kernel functionality, non-modular), xen-balloon.c (user
> interfaces, potentially modular, not actually at the moment) and
> $NEWFILE.c.
> 
> In fact it seems as if all this functionality is a second user of the
> core functionality exposed by balloon.c which is independent of the
> existing xen-balloon.c user of that API. Therefore it should all live in
> a new module next to xen-balloon.c module rather than be intertwined
> with both xen-balloon.c and balloon.c.

Could be.  I think when I first wrote this, it would have required
some more things to be externified, so I didn't bother.  Will
take a look again.

I was wondering why xen-balloon.c and balloon.c are separate to
begin with?  It forces a global variable balloon_stats which could
be static otherwise.  Though it might be possible for a kernel to be
built with only one of the two to save space, is there any good reason?
Or is it just because the file was getting too big?

I note that both of them have a balloon_init and both pr_info
a (not quite identical) message.

> Is there any particular reason this (all) needs to be in the kernel at
> all? Can a userspace daemon, using (possibly new) statistics exported
> via /sys and /proc plus the existing balloon interfaces not implement
> much the same thing? One nice advantage of doing that is that a
> userspace daemon can more easily implement complex (or multiple)
> algorithms, tune them etc. If there is a good reason for this to be in
> kernel I think it should be expanded upon in the commit message.

Will answer separately since I see this part of the thread has
already been continued.

Thanks again!
Dan

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.