On Thu 20-12-12 12:27:46, Andrew Morton wrote:
On Thu, 20 Dec 2012 13:47:10 +0100
Michal Hocko [off-list ref] wrote:
quoted
quoted
quoted
+ */
+#if defined(CONFIG_PREEMPT_COUNT)
+#define MAX_GATHER_BATCH_COUNT (UINT_MAX)
+#else
+#define MAX_GATHER_BATCH_COUNT (((1UL<<(30-PAGE_SHIFT))/MAX_GATHER_BATCH))
Geeze. I spent waaaaay too long staring at that expression trying to
work out "how many pages is in a batch" and gave up.
Realistically, I don't think we need to worry about CONFIG_PREEMPT here
- if we just limit the thing to, say, 64k pages per batch then that
will be OK for preemptible and non-preemptible kernels.
I wanted the fix to be as non-intrusive as possible so I didn't want to
touch PREEMPT (which is default in many configs) at all. I am OK to a
single limit of course.
non-intrusive is nice, but best-implementation is nicer.
quoted
quoted
The performance difference between "64k" and "infinite" will be
miniscule and unmeasurable.
Also, the batch count should be independent of PAGE_SIZE. Because
PAGE_SIZE can vary by a factor of 16 and you don't want to fix the
problem on 4k page size but leave it broken on 64k page size.
MAX_GATHER_BATCH depends on the page size so I didn't want to differ
without a good reason.
There's a good reason! PAGE_SIZE can vary by a factor of 16, and if
this results in the unpreemptible-CPU-effort varying by a factor of 16
then that's bad, and we should change things so the
unpreemptible-CPU-effort is independent of PAGE_SIZE.
Yes you are right. Let's make the number of entries (pages) fixed instead
(in the end we are just freeing pages which have more or less constant
cost). Then something like the following should work:
---