linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Haren Myneni <haren@linux.ibm.com>
To: mpe@ellerman.id.au
Cc: npiggin@gmail.com, mikey@neuling.org,
	herbert@gondor.apana.org.au, frederic.barrat@fr.ibm.com,
	srikar@linux.vnet.ibm.com, linux-kernel@vger.kernel.org,
	hch@infradead.org, oohall@gmail.com, clg@kaod.org,
	sukadev@linux.vnet.ibm.com, linuxppc-dev@lists.ozlabs.org,
	ajd@linux.ibm.com
Subject: [PATCH v9 09/13] powerpc/vas: Return credits after handling fault
Date: Wed, 01 Apr 2020 14:29:58 -0700	[thread overview]
Message-ID: <1585776598.10664.453.camel@hbabu-laptop> (raw)
In-Reply-To: <1585775978.10664.438.camel@hbabu-laptop>


NX uses credit mechanism to control the number of requests issued on
a specific window at any point of time. Only send windows and fault
window are used credits. When the request is issued on a given window,
a credit is taken. This credit will be returned after that request is
processed. If credits are not available, returns RMA_Busy for send
window and RMA_Reject for fault window.

NX expects OS to return credit for send window after processing fault
CRB. Also credit has to be returned for fault window after handling
the fault.

Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Haren Myneni <haren@linux.ibm.com>
---
 arch/powerpc/platforms/powernv/vas-fault.c  |  9 ++++++++
 arch/powerpc/platforms/powernv/vas-window.c | 36 +++++++++++++++++++++++++++++
 arch/powerpc/platforms/powernv/vas.h        |  1 +
 3 files changed, 46 insertions(+)

diff --git a/arch/powerpc/platforms/powernv/vas-fault.c b/arch/powerpc/platforms/powernv/vas-fault.c
index 354577d..b6bec64 100644
--- a/arch/powerpc/platforms/powernv/vas-fault.c
+++ b/arch/powerpc/platforms/powernv/vas-fault.c
@@ -224,6 +224,10 @@ irqreturn_t vas_fault_thread_fn(int irq, void *data)
 		memcpy(crb, fifo, CRB_SIZE);
 		entry->stamp.nx.pswid = cpu_to_be32(FIFO_INVALID_ENTRY);
 		entry->ccw |= cpu_to_be32(CCW0_INVALID);
+		/*
+		 * Return credit for the fault window.
+		 */
+		vas_return_credit(vinst->fault_win, false);
 
 		pr_devel("VAS[%d] fault_fifo %p, fifo %p, fault_crbs %d\n",
 				vinst->vas_id, vinst->fault_fifo, fifo,
@@ -249,6 +253,11 @@ irqreturn_t vas_fault_thread_fn(int irq, void *data)
 			WARN_ON_ONCE(1);
 		} else {
 			update_csb(window, crb);
+			/*
+			 * Return credit for send window after processing
+			 * fault CRB.
+			 */
+			vas_return_credit(window, true);
 		}
 	}
 }
diff --git a/arch/powerpc/platforms/powernv/vas-window.c b/arch/powerpc/platforms/powernv/vas-window.c
index 382fe25..33aaa7a 100644
--- a/arch/powerpc/platforms/powernv/vas-window.c
+++ b/arch/powerpc/platforms/powernv/vas-window.c
@@ -1318,6 +1318,42 @@ int vas_win_close(struct vas_window *window)
 }
 EXPORT_SYMBOL_GPL(vas_win_close);
 
+/*
+ * Return credit for the given window.
+ * Send windows and fault window uses credit mechanism as follows:
+ *
+ * Send windows:
+ * - The default number of credits available for each send window is
+ *   1024. It means 1024 requests can be issued asynchronously at the
+ *   same time. If the credit is not available, that request will be
+ *   returned with RMA_Busy.
+ * - One credit is taken when NX request is issued.
+ * - This credit is returned after NX processed that request.
+ * - If NX encounters translation error, kernel will return the
+ *   credit on the specific send window after processing the fault CRB.
+ *
+ * Fault window:
+ * - The total number credits available is FIFO_SIZE/CRB_SIZE.
+ *   Means 4MB/128 in the current implementation. If credit is not
+ *   available, RMA_Reject is returned.
+ * - A credit is taken when NX pastes CRB in fault FIFO.
+ * - The kernel with return credit on fault window after reading entry
+ *   from fault FIFO.
+ */
+void vas_return_credit(struct vas_window *window, bool tx)
+{
+	uint64_t val;
+
+	val = 0ULL;
+	if (tx) { /* send window */
+		val = SET_FIELD(VAS_TX_WCRED, val, 1);
+		write_hvwc_reg(window, VREG(TX_WCRED_ADDER), val);
+	} else {
+		val = SET_FIELD(VAS_LRX_WCRED, val, 1);
+		write_hvwc_reg(window, VREG(LRX_WCRED_ADDER), val);
+	}
+}
+
 struct vas_window *vas_pswid_to_window(struct vas_instance *vinst,
 		uint32_t pswid)
 {
diff --git a/arch/powerpc/platforms/powernv/vas.h b/arch/powerpc/platforms/powernv/vas.h
index 0af7912..efdaa28 100644
--- a/arch/powerpc/platforms/powernv/vas.h
+++ b/arch/powerpc/platforms/powernv/vas.h
@@ -436,6 +436,7 @@ struct vas_winctx {
 extern int vas_setup_fault_window(struct vas_instance *vinst);
 extern irqreturn_t vas_fault_thread_fn(int irq, void *data);
 extern irqreturn_t vas_fault_handler(int irq, void *dev_id);
+extern void vas_return_credit(struct vas_window *window, bool tx);
 extern struct vas_window *vas_pswid_to_window(struct vas_instance *vinst,
 						uint32_t pswid);
 
-- 
1.8.3.1




  parent reply	other threads:[~2020-04-01 21:31 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-01 21:19 [PATCH v9 00/13] powerpc/vas: Page fault handling for user space NX requests Haren Myneni
2020-04-01 21:25 ` [PATCH v9 01/13] powerpc/xive: Define xive_native_alloc_irq_on_chip() Haren Myneni
2020-04-01 21:25 ` [PATCH v9 02/13] powerpc/vas: Define nx_fault_stamp in coprocessor_request_block Haren Myneni
2020-04-01 21:26 ` [PATCH v9 03/13] powerpc/vas: Alloc and setup IRQ and trigger port address Haren Myneni
2020-04-01 21:26 ` [PATCH v9 04/13] powerpc/vas: Setup fault window per VAS instance Haren Myneni
2020-04-01 21:27 ` [PATCH v9 05/13] powerpc/vas: Register NX with fault window ID and IRQ port value Haren Myneni
2020-04-01 21:28 ` [PATCH 06/13] powerpc/vas: Take reference to PID and mm for user space windows Haren Myneni
2020-04-01 22:13   ` [PATCH v9 " Haren Myneni
2020-04-01 21:28 ` [PATCH v9 07/13] powerpc/vas: Setup thread IRQ handler per VAS instance Haren Myneni
2020-04-01 21:29 ` [PATCH v9 08/13] powerpc/vas: Update CSB and notify process for fault CRBs Haren Myneni
2020-04-01 21:29 ` Haren Myneni [this message]
2020-04-01 21:30 ` [PATCH v9 10/13] powerpc/vas: Print CRB and FIFO values Haren Myneni
2020-04-01 21:31 ` [PATCH v9 11/13] powerpc/vas: Do not use default credits for receive window Haren Myneni
2020-04-01 21:31 ` [PATCH v9 12/13] powerpc/vas: Display process stuck message Haren Myneni
2020-04-01 21:32 ` [PATCH v9 13/13] powerpc/vas: Free send window in VAS instance after credits returned Haren Myneni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1585776598.10664.453.camel@hbabu-laptop \
    --to=haren@linux.ibm.com \
    --cc=ajd@linux.ibm.com \
    --cc=clg@kaod.org \
    --cc=frederic.barrat@fr.ibm.com \
    --cc=hch@infradead.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mikey@neuling.org \
    --cc=mpe@ellerman.id.au \
    --cc=npiggin@gmail.com \
    --cc=oohall@gmail.com \
    --cc=srikar@linux.vnet.ibm.com \
    --cc=sukadev@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).