Messages in this thread | | | Date | Mon, 24 Nov 2008 17:00:08 -0800 (PST) | From | David Rientjes <> | Subject | Re: [patch 2/2] mm: add dirty_background_bytes and dirty_bytes sysctls |
| |
On Mon, 24 Nov 2008, Andrew Morton wrote:
> > @@ -365,23 +429,29 @@ void > > get_dirty_limits(unsigned long *pbackground, unsigned long *pdirty, > > unsigned long *pbdi_dirty, struct backing_dev_info *bdi) > > { > > - int background_ratio; /* Percentages */ > > - int dirty_ratio; > > unsigned long background; > > unsigned long dirty; > > unsigned long available_memory = determine_dirtyable_memory(); > > struct task_struct *tsk; > > > > - dirty_ratio = vm_dirty_ratio; > > - if (dirty_ratio < 5) > > - dirty_ratio = 5; > > + if (vm_dirty_bytes) > > + dirty = (vm_dirty_bytes + PAGE_SIZE) / PAGE_SIZE; > > It would be conventional to use DIV_ROUND_UP() here. >
Ah, indeed. I forgot about those.
> > + else { > > + int dirty_ratio; > > hm, I wonder why vm_dirty_ratio has a signed type. >
vm_dirty_ratio only has an acceptable range between 0 and 100 since it uses proc_dointvec_minmax(), so it's not really important. It could definitely be changed, however.
There's a limitation in the sysctl interface where we don't handle unsigned ints very well (ignore the reference to unsigned int in the proc_dointvec comment). We lack an unsigned int handler, so all proc_dointvec() users are implicitly signed.
For example, if a sysctl's data object were declared with a type specifier of unsigned int and it uses proc_dointvec() as the handler, it would have a x86_64 max of 2147483648, that of a signed integer.
> > - background_ratio = dirty_background_ratio; > > - if (background_ratio >= dirty_ratio) > > - background_ratio = dirty_ratio / 2; > > + dirty_ratio = vm_dirty_ratio; > > + if (dirty_ratio < 5) > > + dirty_ratio = 5; > > + dirty = (dirty_ratio * available_memory) / 100; > > + } > > + > > + if (dirty_background_bytes) > > + background = (dirty_background_bytes + PAGE_SIZE) / PAGE_SIZE; > > DIV_ROUND_UP()? > > > + else > > + background = (dirty_background_ratio * available_memory) / 100; > > > > - background = (background_ratio * available_memory) / 100; > > - dirty = (dirty_ratio * available_memory) / 100; > > + if (background >= dirty) > > + background = dirty / 2; > > tsk = current; > > if (tsk->flags & PF_LESS_THROTTLE || rt_task(tsk)) { > > background += background / 4; >
| |