== Highlights ==
* Deep dive into signal/clone/exit handling to better understand
current LMK technical flaws. As a side effect noticed a lot of other
bugs (not only in LMK).
* Further investigation on interactive cpufreq dependencies. Looking
into various CPU idle notifiers, PM callbacks and cpuidle stuff.
This is all parts of proper handling of cpufreq interactive governor.
(Well, now it appears that idle notifiers are no good, as scheduler
might provide a per-cpu load avg values, which, if accurate enough,
might be a suitable replacement.)
* Got not much time to continue LMK-userland stuff, though. But this
is still near the top of my 'interesting things to do' list.
--
Anton Vorontsov
Email: cbouatmailru(a)gmail.com
== Rajendra Nayak <rnayak> ==
=== Highlights ===
* Started writing a generic system control module driver for
OMAP2/3/4, with exported api's for system control read/write.
Needed mainly for omap-hsmmc-dt adaptation as omap-hsmmc
currently does system control read/writes from machine code by
passing function pointers to the driver. This needs cleanup
before omap_hsmmc can work with DT.
* Cleaned up the use/abuse of pdev->id across omap-hsmmc driver.
Again a pre-requisite step before omap-hsmmc can work with DT.
* Reworked TWL DT regulator patches based on off-list discussions
with Benoit to make non-DT and DT both use a common lookup table.
* Caught-up on all the pinctrl DT discussions on list while I was
off 3 weeks in nice.
=== Plans ===
* Repost v3 of TWL DT series. Need to wait for Benoit to post his
which adds twl*.dtsi files.
* Continue work on system control module driver.
* omap-hsmmc DT adaptation.
* Attend connect.
=== Misc ===
* Was off on 27th and 26th was a holiday in India.
=== Highlights ===
* Sent android-alarm drivers to Greg for inclusion into staging. He's
currently changing employers, but said he's planning on merging them
into staging for 3.4.
* Worked on getting origen board booting with Android on a vanilla
3.3-rc kernel. Got close, even have boot console graphics working, but
for some reason gralloc is failing. Will try to work this out over
connect.
* Got Panda board ready for Android demo running on a (almost) vanilla
linux 3.3-rc2 kernel. Only required a single ~4 line patch.
* Spent a good chunk of the week trying to integrate the range-tree
implementation into fadvise volatile work. Unfortunately this was much
more difficult then I expected, and I had three or four false starts
that required entirely rearchitecting the approach each time. Almost
gave up, but finally last night I came up with a reasonable approach,
and have integrated a first pass. Wanted to send something out by
friday, but its just not well enough tested, so I'll hopefully get it
out next week.
* Sent out my 3.4 queue to tglx for merging.
* Reviewed a couple of ELC presentations and provided feedback.
* Ran email meeting for Android Kernel Sub-team
=== Plans ===
* Lots of connect stuff
* Finish and send out first working range-tree fadivse volatile
implementation
* Do presentation on merge_config.sh script
* Work on origen Android issues w/ vanilla kernel.
* Present on Linaro's Android upstreaming
=== Issues ===
NA
== Linus Walleij linusw ==
=== Highlights ===
* Pushed pin control fixes for -rc1 and Torvalds pulled
them in.
* I have a branch for the nVidia Tegra pin control.
* Discussing pin control, pinmux ...
* Upstreaming the PL022 SPI driver, Mark Brown
suggested we move messages queues to the SPI
core. It was easy to to so I hacked a v1 and then
a v2 based on Grant's suggestions.
* Preparing a conference presentation on pin control
for the Embedded Linux Conference. This will be
used as a basis for public explanation and transparency
into the subject as well.
=== Plans ===
* Linaro Connect, Android Builders and ELC.
* Send patches upstream for -rc2.
* dummy pinmuxes akin to dummy regulators, we need
to see if this is a good idea or not.
* Drive generalization of Nomadik GPIO
by using the pinctrl framework.
drivers/gpio/gpio-nomadik.c
* Test the PL08x patches on the Ericsson Research
PB11MPCore and submit platform data for using
pl08x DMA on that platform.
* Look into other Ux500 stuff in need of mainlining...
like
- Ux500 clocks
- the HWMON stuff.
=== Issues ===
* At first I merged the Tegra pin control into my for-next
branch, then had second thoughts and removed it
because the size scares me. The author thinks I'm lame
and claims to lose interest in pin control. Wrote back
in private that I feel bad about this.
* Ux500 mainlining having second priority.
Thanks,
Linus Walleij
== Saugata Das sdas ==
=== Activity Summary ===
* Context ID patch submitted to MMC mailing list for comments
* CMD23 patch submitted for mmci driver
=== Plans ===
* Attend connect
* Integration of context ID, tag and packed command features
=== Issues ===
* None
We'd like to use this function in the android low memory killer driver, so
let's export it.
Also, move next_tgid() to kernel/pid.c, so now it lives with the rest of
pid library functions and does not depend on procfs. Plus, we may now hide
find_ge_pid() from the global namespace.
While at it, also turn next_tgid()'s comments into kerneldoc format.
There should be no functional changes.
Signed-off-by: Anton Vorontsov <anton.vorontsov(a)linaro.org>
---
fs/proc/base.c | 43 -------------------------------------------
include/linux/pid.h | 9 ++++++++-
kernel/pid.c | 41 ++++++++++++++++++++++++++++++++++++++++-
3 files changed, 48 insertions(+), 45 deletions(-)
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 5485a53..84b8625 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -3324,49 +3324,6 @@ out:
return result;
}
-/*
- * Find the first task with tgid >= tgid
- *
- */
-struct tgid_iter {
- unsigned int tgid;
- struct task_struct *task;
-};
-static struct tgid_iter next_tgid(struct pid_namespace *ns, struct tgid_iter iter)
-{
- struct pid *pid;
-
- if (iter.task)
- put_task_struct(iter.task);
- rcu_read_lock();
-retry:
- iter.task = NULL;
- pid = find_ge_pid(iter.tgid, ns);
- if (pid) {
- iter.tgid = pid_nr_ns(pid, ns);
- iter.task = pid_task(pid, PIDTYPE_PID);
- /* What we to know is if the pid we have find is the
- * pid of a thread_group_leader. Testing for task
- * being a thread_group_leader is the obvious thing
- * todo but there is a window when it fails, due to
- * the pid transfer logic in de_thread.
- *
- * So we perform the straight forward test of seeing
- * if the pid we have found is the pid of a thread
- * group leader, and don't worry if the task we have
- * found doesn't happen to be a thread group leader.
- * As we don't care in the case of readdir.
- */
- if (!iter.task || !has_group_leader_pid(iter.task)) {
- iter.tgid += 1;
- goto retry;
- }
- get_task_struct(iter.task);
- }
- rcu_read_unlock();
- return iter;
-}
-
#define TGID_OFFSET (FIRST_PROCESS_ENTRY + ARRAY_SIZE(proc_base_stuff))
static int proc_pid_fill_cache(struct file *filp, void *dirent, filldir_t filldir,
diff --git a/include/linux/pid.h b/include/linux/pid.h
index b152d44..33e350b 100644
--- a/include/linux/pid.h
+++ b/include/linux/pid.h
@@ -116,7 +116,6 @@ extern struct pid *find_vpid(int nr);
* Lookup a PID in the hash table, and return with it's count elevated.
*/
extern struct pid *find_get_pid(int nr);
-extern struct pid *find_ge_pid(int nr, struct pid_namespace *);
int next_pidmap(struct pid_namespace *pid_ns, unsigned int last);
extern struct pid *alloc_pid(struct pid_namespace *ns);
@@ -199,4 +198,12 @@ pid_t pid_vnr(struct pid *pid);
} while_each_thread(tg___, task); \
task = tg___; \
} while_each_pid_task(pid, type, task)
+
+struct tgid_iter {
+ unsigned int tgid;
+ struct task_struct *task;
+};
+
+struct tgid_iter next_tgid(struct pid_namespace *ns, struct tgid_iter iter);
+
#endif /* _LINUX_PID_H */
diff --git a/kernel/pid.c b/kernel/pid.c
index ce8e00d..34a52a6 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -522,7 +522,7 @@ EXPORT_SYMBOL_GPL(task_active_pid_ns);
*
* If there is a pid at nr this function is exactly the same as find_pid_ns.
*/
-struct pid *find_ge_pid(int nr, struct pid_namespace *ns)
+static struct pid *find_ge_pid(int nr, struct pid_namespace *ns)
{
struct pid *pid;
@@ -536,6 +536,45 @@ struct pid *find_ge_pid(int nr, struct pid_namespace *ns)
return pid;
}
+/**
+ * next_tgid() - Find the first task with tgid >= tgid
+ * @ns: pointer to the pid namespace
+ * @iter: iterator
+ */
+struct tgid_iter next_tgid(struct pid_namespace *ns, struct tgid_iter iter)
+{
+ struct pid *pid;
+
+ if (iter.task)
+ put_task_struct(iter.task);
+ rcu_read_lock();
+retry:
+ iter.task = NULL;
+ pid = find_ge_pid(iter.tgid, ns);
+ if (pid) {
+ iter.tgid = pid_nr_ns(pid, ns);
+ iter.task = pid_task(pid, PIDTYPE_PID);
+ /* What we to know is if the pid we have find is the
+ * pid of a thread_group_leader. Testing for task
+ * being a thread_group_leader is the obvious thing
+ * todo but there is a window when it fails, due to
+ * the pid transfer logic in de_thread.
+ *
+ * So we perform the straight forward test of seeing
+ * if the pid we have found is the pid of a thread
+ * group leader, and don't worry if the task we have
+ * found doesn't happen to be a thread group leader.
+ */
+ if (!iter.task || !has_group_leader_pid(iter.task)) {
+ iter.tgid += 1;
+ goto retry;
+ }
+ get_task_struct(iter.task);
+ }
+ rcu_read_unlock();
+ return iter;
+}
+
/*
* The pid hash table is scaled according to the amount of memory in the
* machine. From a minimum of 16 slots up to 4096 slots at one gigabyte or
--
1.7.7