Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1254116

[RFC PATCH 5/7] audit: allow audit_cmd_mutex holders to use reserves

From Richard Guy Briggs <rgb@redhat.com>
Newsgroups linux.kernel
Subject [RFC PATCH 5/7] audit: allow audit_cmd_mutex holders to use reserves
Date 2015-10-22 21:00 +0200
Message-ID <qmtfK-2HW-65@gated-at.bofh.it> (permalink)
References <qmtfH-2HW-1@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


If we hold the audit_cmd_mutex, we should never sleep waiting for auditd
to drain the queue since auditd may need the mutex to shut down.

This was first implemented with mutex_trylock(), but since
audit_log_start() can be called in softirq context, that won't work.
Next, owner_running() was used to check audit_cmd_mutex but another
process could have this locked on another cpu.  Use rcu_read_lock() and
ACCESS_ONCE() to check audit_cmd_mutex.

Signed-off-by: Richard Guy Briggs <rgb@redhat.com>
---
 kernel/audit.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/kernel/audit.c b/kernel/audit.c
index 02a5ec0..34411af 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -1376,12 +1376,15 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
 		return NULL;
 
 	if (gfp_mask & __GFP_WAIT) {
-		if (current->tgid == 1 || (audit_pid && audit_pid == current->tgid))
+		rcu_read_lock();
+		if (ACCESS_ONCE(audit_cmd_mutex.owner) == current ||
+		    current->tgid == 1 ||
+		    (audit_pid && audit_pid == current->tgid))
 			gfp_mask &= ~__GFP_WAIT;
 		else
 			reserve = 0;
+		rcu_read_unlock();
 	}
-
 	while (audit_backlog_limit
 	       && skb_queue_len(&audit_skb_queue) > audit_backlog_limit + reserve) {
 		if (gfp_mask & __GFP_WAIT && audit_backlog_wait_time) {
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[RFC PATCH 0/7] audit: clean up audit queue handling Richard Guy Briggs <rgb@redhat.com> - 2015-10-22 21:00 +0200
  [RFC PATCH 2/7] audit: include auditd's threads in audit_log_start() wait exception Richard Guy Briggs <rgb@redhat.com> - 2015-10-22 21:00 +0200
  [RFC PATCH 1/7] audit: don't needlessly reset valid wait time Richard Guy Briggs <rgb@redhat.com> - 2015-10-22 21:00 +0200
  [RFC PATCH 4/7] audit: wake up threads if queue switched from limited to unlimited Richard Guy Briggs <rgb@redhat.com> - 2015-10-22 21:00 +0200
  [RFC PATCH 6/7] audit: wake up audit_backlog_wait queue when auditd goes away. Richard Guy Briggs <rgb@redhat.com> - 2015-10-22 21:00 +0200
  [RFC PATCH 7/7] audit: wake up kauditd_thread after auditd registers Richard Guy Briggs <rgb@redhat.com> - 2015-10-22 21:00 +0200
  [RFC PATCH 3/7] audit: allow systemd to use queue reserves Richard Guy Briggs <rgb@redhat.com> - 2015-10-22 21:00 +0200
  [RFC PATCH 5/7] audit: allow audit_cmd_mutex holders to use reserves Richard Guy Briggs <rgb@redhat.com> - 2015-10-22 21:00 +0200
  Re: [RFC PATCH 0/7] audit: clean up audit queue handling Paul Moore <pmoore@redhat.com> - 2015-10-27 19:50 +0100
    Re: [RFC PATCH 0/7] audit: clean up audit queue handling Richard Guy Briggs <rgb@redhat.com> - 2015-10-28 19:50 +0100
      Re: [RFC PATCH 0/7] audit: clean up audit queue handling Paul Moore <pmoore@redhat.com> - 2015-10-28 20:00 +0100

csiph-web