hv: hv_fcopy: drop the obsolete message on transfer failure
Dexuan Cui
maintainerPATCH v4 1/1 hv: hv_fcopy: drop the obsolete message on transfer failure
In the case the user-space daemon crashes, hangs or is killed, we need to down the semaphore, otherwise, after the daemon starts next time, the obsolete data in fcopy_transaction.message or fcopy_transaction.fcopy_msg will be used immediately.
---
v2: I removed the "FCP" prefix as Greg asked.
I also updated the output message a little:
"FCP: failed to acquire the semaphore" -->
"can not acquire the semaphore: it is benign"
v3: I added the code in fcopy_release() as Jason Wang suggested.
I removed the pr_debug (it isn't so meaningful)and added a comment instead.
v4: this is a resend of v3, plus adding a comment before
fcopy_release().
--- drivers/hv/hv_fcopy.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
drivers/hv/hv_fcopy.c +27 -0
@@ -86,6 +86,18 @@ static void fcopy_work_func(struct work_struct *dummy)* process the pending transaction. */ fcopy_respond_to_host (HV_E_FAIL ); + +/* In the case the user-space daemon crashes, hangs or is killed, we +* need to down the semaphore, otherwise, after the daemon starts next +* time, the obsolete data in fcopy_transaction.message or +* fcopy_transaction.fcopy_msg will be used immediately. +* +* NOTE: fcopy_read() happens to get the semaphore (very rare)? We're +* still OK, because we've reported the failure to the host. +*/ +if (down_trylock (&fcopy_transaction.read_sema)) + ; + }static int fcopy_handle_handshake (u32 version)
@@ -344,6 +356,14 @@ static int fcopy_open(struct inode *inode, struct file *f)return 0 ; } +/* XXX: there are still some tricky corner cases, e.g., +* 1) In a SMP guest, when fcopy_release() runs between +* schedule_delayed_work() and fcopy_send_data(), there is +* still a chance an obsolete message will be queued. +* +* 2) When the fcopy daemon is running, if we unload the driver, +* we'll notice a kernel oops when we kill the daemon later. +*/ static int fcopy_release (struct inode *inode,struct file *f) {/*
@@ -351,6 +371,13 @@ static int fcopy_release(struct inode *inode, struct file *f)*/ in_hand_shake = true; opened = false; + +if (cancel_delayed_work_sync (&fcopy_work)) { +/* We haven't up()-ed the semaphore(very rare)? */ +if (down_trylock (&fcopy_transaction.read_sema)) + ; +fcopy_respond_to_host (HV_E_FAIL ); + }return 0 ; }
Signature · 1 line
1.9.1
Quoted 17 lines
-----Original Message-----
From: Dexuan Cui [mailto:[email protected]]
Sent: Wednesday, January 14, 2015 1:55 AM
To: [email protected]; [email protected]; driverdev- [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Cc: KY Srinivasan
Subject: [PATCH v4] hv:hv_fcopy: drop the obsolete message on transfer failureIn the case the user-space daemon crashes, hangs or is killed, we need to down the semaphore, otherwise, after the daemon starts next time, the obsolete data in fcopy_transaction.message or fcopy_transaction.fcopy_msg will be used immediately.
Quoted 4 lines
Cc Jason Wang <[email protected]>Cc Vitaly Kuznetsov <[email protected]>Cc K. Y. Srinivasan <[email protected]>Signed-off-by Dexuan Cui <[email protected]>
Quoted 76 lines
---
v2: I removed the "FCP" prefix as Greg asked.
I also updated the output message a little:
"FCP: failed to acquire the semaphore" -->
"can not acquire the semaphore: it is benign"v3: I added the code in
fcopy_release()as Jason Wang suggested.
I removed thepr_debug(it isn't so meaningful)and added a comment
instead.v4: this is a resend of v3, plus adding a comment before
fcopy_release().--- drivers/hv/hv_fcopy.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)drivers/hv/hv_fcopy.c index renamed from drivers/hv/hv_fcopy.c +0
-023b2ce2..cd453e4 100644
drivers/hv/hv_fcopy.c +3
-0@@ -86,6 +86,18 @@ static void fcopy_work_func(struct work_struct*dummy) * process the pending transaction. */ fcopy_respond_to_host (HV_E_FAIL ); + +/* In the case the user-space daemon crashes, hangs or is killed, we +* need to down the semaphore, otherwise, after the daemon starts next
drivers/hv/hv_fcopy.c +4
-0+* time, the obsolete data in fcopy_transaction.message or +* fcopy_transaction.fcopy_msg will be used immediately. +* +* NOTE: fcopy_read() happens to get the semaphore (very rare)? We're
drivers/hv/hv_fcopy.c +5
-0+* still OK, because we've reported the failure to the host. +*/ +if (down_trylock (&fcopy_transaction.read_sema)) + ; + } static int fcopy_handle_handshake(u32 version) @@ -344,6 +356,14 @@static int
fcopy_open(struct inode *inode, struct file *f)drivers/hv/hv_fcopy.c +15
-1return 0 ; } +/* XXX: there are still some tricky corner cases, e.g., +* 1) In a SMP guest, when fcopy_release() runs between +* schedule_delayed_work() and fcopy_send_data(), there is +* still a chance an obsolete message will be queued. +* +* 2) When the fcopy daemon is running, if we unload the driver, +* we'll notice a kernel oops when we kill the daemon later. +*/ static int fcopy_release (struct inode *inode,struct file *f) {/* @@ -351,6 +371,13 @@ static int fcopy_release(struct inode *inode, structfile *f) */ in_hand_shake = true; opened = false; + +if (cancel_delayed_work_sync (&fcopy_work)) { +/* We haven't up()-ed the semaphore(very rare)? */ +if (down_trylock (&fcopy_transaction.read_sema)) + ; +fcopy_respond_to_host (HV_E_FAIL ); + }return 0 ; } --1.9.1