Subject: + ipc-semc-update-sem_otime-for-all-operations.patch added to -mm tree To: manfred@xxxxxxxxxxxxxxxx,davidlohr.bueso@xxxxxx,efault@xxxxxx,jiakernel@xxxxxxxxx From: akpm@xxxxxxxxxxxxxxxxxxxx Date: Thu, 26 Sep 2013 14:06:11 -0700 The patch titled Subject: ipc/sem.c: update sem_otime for all operations has been added to the -mm tree. Its filename is ipc-semc-update-sem_otime-for-all-operations.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/ipc-semc-update-sem_otime-for-all-operations.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/ipc-semc-update-sem_otime-for-all-operations.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Manfred Spraul <manfred@xxxxxxxxxxxxxxxx> Subject: ipc/sem.c: update sem_otime for all operations In 0a2b9d4c ("ipc/sem.c: move wake_up_process out of the spinlock section"), the update of semaphore's sem_otime(last semop time) was moved to one central position (do_smart_update). But: Since do_smart_update() is only called for operations that modify the array, this means that wait-for-zero semops do not update sem_otime anymore. The fix is simple: Non-alter operations must update sem_otime. Signed-off-by: Manfred Spraul <manfred@xxxxxxxxxxxxxxxx> Reported-by: Jia He <jiakernel@xxxxxxxxx> Tested-by: Jia He <jiakernel@xxxxxxxxx> Cc: Davidlohr Bueso <davidlohr.bueso@xxxxxx> Cc: Mike Galbraith <efault@xxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- ipc/sem.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff -puN ipc/sem.c~ipc-semc-update-sem_otime-for-all-operations ipc/sem.c --- a/ipc/sem.c~ipc-semc-update-sem_otime-for-all-operations +++ a/ipc/sem.c @@ -918,6 +918,24 @@ again: } /** + * set_semotime(sma, sops) - set sem_otime + * @sma: semaphore array + * @sops: operations that modified the array, may be NULL + * + * sem_otime is replicated to avoid cache line trashing. + * This function sets one instance to the current time. + */ +static void set_semotime(struct sem_array *sma, struct sembuf *sops) +{ + if (sops == NULL) { + sma->sem_base[0].sem_otime = get_seconds(); + } else { + sma->sem_base[sops[0].sem_num].sem_otime = + get_seconds(); + } +} + +/** * do_smart_update(sma, sops, nsops, otime, pt) - optimized update_queue * @sma: semaphore array * @sops: operations that were performed @@ -967,17 +985,10 @@ static void do_smart_update(struct sem_a } } } - if (otime) { - if (sops == NULL) { - sma->sem_base[0].sem_otime = get_seconds(); - } else { - sma->sem_base[sops[0].sem_num].sem_otime = - get_seconds(); - } - } + if (otime) + set_semotime(sma, sops); } - /* The following counts are associated to each semaphore: * semncnt number of tasks waiting on semval being nonzero * semzcnt number of tasks waiting on semval being zero @@ -1839,10 +1850,16 @@ SYSCALL_DEFINE4(semtimedop, int, semid, error = perform_atomic_semop(sma, sops, nsops, un, task_tgid_vnr(current)); - if (error <= 0) { - if (alter && error == 0) + if (error == 0) { + /* If the operation was successful, then do + * the required updates. + */ + if (alter) do_smart_update(sma, sops, nsops, 1, &tasks); - + else + set_semotime(sma, sops); + } + if (error <= 0) { goto out_unlock_free; } _ Patches currently in -mm which might be from manfred@xxxxxxxxxxxxxxxx are origin.patch ipc-semc-fix-race-in-sem_lock.patch ipc-semc-optimize-sem_lock.patch ipc-semc-synchronize-the-proc-interface.patch ipc-semc-update-sem_otime-for-all-operations.patch slab-leaks3-default-y.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html