From patchwork Mon Sep 29 09:24:33 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vitaly Mayatskih X-Patchwork-Id: 1879 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id A2F91DE201 for ; Mon, 29 Sep 2008 19:24:53 +1000 (EST) X-Original-To: linuxppc-dev@ozlabs.org Delivered-To: linuxppc-dev@ozlabs.org Received: from fg-out-1718.google.com (fg-out-1718.google.com [72.14.220.157]) by ozlabs.org (Postfix) with ESMTP id 59F6EDDDE7 for ; Mon, 29 Sep 2008 19:24:38 +1000 (EST) Received: by fg-out-1718.google.com with SMTP id d23so1490195fga.39 for ; Mon, 29 Sep 2008 02:24:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:message-id:from:to:cc :subject:in-reply-to:references:user-agent:mime-version:content-type; bh=i6kQcoYQidnylakXnqi4hfYd4tk16F4V+3zSO5+vZjs=; b=AR5ppT1doiqkpArhRE2xlR/xOKzWozn+z/DbVDsVBbnUqP/Jy1nrYfbZUn54V/j9uC ZFtAjmDs4hqmx1lXakM3JuB94w41nW1DTGjr/Wlwy7aZUgwftQROkJl7CJVmLf1FC4xw VcAt2VBY3Ao3WcLKGuV+H4qs0GdsY8s1Dbpq8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:message-id:from:to:cc:subject:in-reply-to:references :user-agent:mime-version:content-type; b=iyfPsUODKhAqDw+4a7UiXDuxXarynBYMmawJe0ZnYB/ed8cPLcF060KuGMaw5i7r7A EVyHGjIdfp+6Heex/kZmokrvlM70dUkOU0GzP4CdPpCIWT591x0LwntkB/a4LNuAqM/8 euf7Yzpn4Rp+l09xd1u8+Nj378dkw0TUdoyNY= Received: by 10.86.79.19 with SMTP id c19mr3994106fgb.67.1222680276880; Mon, 29 Sep 2008 02:24:36 -0700 (PDT) Received: from gravicappa.englab.brq.redhat.com (nat-pool-brq.redhat.com [62.40.79.66]) by mx.google.com with ESMTPS id 4sm3318594fge.8.2008.09.29.02.24.35 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 29 Sep 2008 02:24:35 -0700 (PDT) Date: Mon, 29 Sep 2008 11:24:33 +0200 Message-ID: From: Vitaly Mayatskikh To: linuxppc-dev@ozlabs.org Subject: Re: take in count O_NONBLOCK flag for rtas log In-Reply-To: References: User-Agent: Wanderlust/2.15.6 (Almost Unreal) Emacs/23.0 Mule/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Cc: Paul Mackerras X-BeenThere: linuxppc-dev@ozlabs.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org rtas_log_read() doesn't check file flags for O_NONBLOCK and blocks non-blocking reader of /proc/ppc64/rtas/error_log if there's no data available. Patch makes sure that non-blocking reader will never blocks. Also rtas_log_read() returns now with ENODATA to prevent suspending of process in wait_event_interruptible() when logging facility was switched off and log is already empty. Acked-by: David Howells Signed-off-by: Vitaly Mayatskikh --- wbr, Vitaly diff --git a/arch/powerpc/platforms/pseries/rtasd.c b/arch/powerpc/platforms/pseries/rtasd.c index c9ffd8c..4f76e3b 100644 --- a/arch/powerpc/platforms/pseries/rtasd.c +++ b/arch/powerpc/platforms/pseries/rtasd.c @@ -295,19 +295,29 @@ static ssize_t rtas_log_read(struct file * file, char __user * buf, if (!tmp) return -ENOMEM; - spin_lock_irqsave(&rtasd_log_lock, s); /* if it's 0, then we know we got the last one (the one in NVRAM) */ - if (rtas_log_size == 0 && logging_enabled) - nvram_clear_error_log(); - spin_unlock_irqrestore(&rtasd_log_lock, s); + while (rtas_log_size == 0) { + if (file->f_flags & O_NONBLOCK) { + spin_unlock_irqrestore(&rtasd_log_lock, s); + error = -EAGAIN; + goto out; + } + if (!logging_enabled) { + spin_unlock_irqrestore(&rtasd_log_lock, s); + error = -ENODATA; + goto out; + } + nvram_clear_error_log(); - error = wait_event_interruptible(rtas_log_wait, rtas_log_size); - if (error) - goto out; + spin_unlock_irqrestore(&rtasd_log_lock, s); + error = wait_event_interruptible(rtas_log_wait, rtas_log_size); + if (error) + goto out; + spin_lock_irqsave(&rtasd_log_lock, s); + } - spin_lock_irqsave(&rtasd_log_lock, s); offset = rtas_error_log_buffer_max * (rtas_log_start & LOG_NUMBER_MASK); memcpy(tmp, &rtas_log_buf[offset], count);