Sorry, forget to add the pieces of code flow...

On reading node:

 3)  dlm_ast-4278  =>  ocfs2dc-4277
 ------------------------------------------

 3)               |  ocfs2_process_blocked_lock() {
 3)               |    ocfs2_unblock_lock() {
 3)   0.116 us    |      ocfs2_prepare_cancel_convert();
 3)               |      ocfs2_cancel_convert() {
 3)               |        user_dlm_unlock() {
 3)               |          dlm_unlock() {
 3)   0.120 us    |            dlm_find_lockspace_local();
 3)   0.158 us    |            find_lkb();
 3)               |            cancel_lock() {
 3)               |              validate_unlock_args() {
 3)   0.093 us    |                del_timeout();
 3)   0.782 us    |              }
 3)               |              _cancel_lock() {
 3)               |                send_common() {
 3)   0.189 us    |                  add_to_waiters();
 3)               |                  create_message() {
 3)               |                    _create_message() {
 3)               |                      dlm_lowcomms_get_buffer() {
 3)   0.156 us    |                        nodeid2con();
 3)   1.680 us    |                      }
 3)   0.108 us    |                      dlm_our_nodeid();
 3)   2.821 us    |                    }
 3)   3.319 us    |                  }
 3)   0.094 us    |                  send_args();
 3)               |                  send_message() {
 3)   0.070 us    |                    dlm_message_out();
 3)   9.485 us    |                    dlm_lowcomms_commit_buffer();
 3) + 10.609 us   |                  }
 3) + 16.054 us   |                }
 3) + 16.632 us   |              }
 3)   0.156 us    |              put_rsb();
 3) + 19.044 us   |            }
 3)               |            dlm_put_lkb() {
 3)   0.094 us    |              __put_lkb();
 3)   0.632 us    |            }
 3)   0.074 us    |            dlm_put_lockspace();
 3) + 22.513 us   |          }
 3) + 23.028 us   |        }
 3) + 23.727 us   |      }
 3) + 25.004 us   |    }
 3)               |    ocfs2_schedule_blocked_lock() {
 3)   0.073 us    |      lockres_set_flags();
 3)   0.592 us    |    }
 3) + 26.852 us   |  }
 ------------------------------------------
 3)  ocfs2dc-4277  =>  dlm_ast-4278
 ------------------------------------------

 3)               |  process_asts() {
 3)   0.202 us    |    dlm_rem_lkb_callback();
 3)   0.081 us    |    dlm_rem_lkb_callback();
 3)               |    fsdlm_lock_ast_wrapper() {
 3)               |      ocfs2_unlock_ast() {
 3)   0.099 us    |        ocfs2_get_inode_osb();
 3)   1.290 us    |        ocfs2_wake_downconvert_thread();
 3)               |        lockres_clear_flags() {
 3)   8.539 us    |          lockres_set_flags();
 3)   9.096 us    |        }
 3) + 12.055 us   |      }
 3) + 12.673 us   |    }
 3)               |    dlm_put_lkb() {
 3)   0.161 us    |      __put_lkb();
 3)   0.718 us    |    }
 3) + 16.133 us   |  }


On writing node:

 3)  kworker-443   =>  ocfs2dc-4456
 ------------------------------------------

 3)               |  ocfs2_process_blocked_lock() {
 3)               |    ocfs2_unblock_lock() {
 3)   0.269 us    |      ocfs2_prepare_cancel_convert();
 3)               |      ocfs2_cancel_convert() {
 3)               |        user_dlm_unlock() {
 3)               |          dlm_unlock() {
 3)   0.321 us    |            dlm_find_lockspace_local();
 3)   0.286 us    |            find_lkb();
 3)               |            cancel_lock() {
 3)               |              validate_unlock_args() {
 3)   0.122 us    |                del_timeout();
 3)   0.901 us    |              }
 3)               |              _cancel_lock() {
 3)               |                do_cancel() {
 3)               |                  revert_lock() {
 3)               |                    move_lkb() {
 3)   0.155 us    |                      del_lkb();
 3)   0.243 us    |                      add_lkb();
 3)   1.778 us    |                    }
 3)   2.577 us    |                  }
 3)               |                  queue_cast() {
 3)   0.102 us    |                    del_timeout();
 3)               |                    dlm_add_ast() {
 3)   0.165 us    |                      dlm_add_lkb_callback();
 3) + 14.492 us   |                    }
 3) + 16.381 us   |                  }
 3) + 20.384 us   |                }
 3)               |                grant_pending_locks() {
 3)               |                  grant_pending_convert() {
 3)               |                    can_be_granted() {
 3)   0.143 us    |                      _can_be_granted();
 3)   0.906 us    |                    }
 3)   1.900 us    |                  }
 3)   2.738 us    |                }
 3) + 24.670 us   |              }
 3)   0.154 us    |              put_rsb();
 3) + 28.068 us   |            }
 3)               |            dlm_put_lkb() {
 3)   0.163 us    |              __put_lkb();
 3)   1.029 us    |            }
 3)   0.195 us    |            dlm_put_lockspace();
 3) + 34.035 us   |          }
 3) + 34.914 us   |        }
 3) + 35.919 us   |      }
 3) + 37.864 us   |    }
 3)               |    ocfs2_schedule_blocked_lock() {
 3)   0.210 us    |      lockres_set_flags();
 0)               |  process_asts() {
 3)   0.998 us    |    }
 0)   0.215 us    |    dlm_rem_lkb_callback();
 3) + 40.671 us   |  }
 0)   0.084 us    |    dlm_rem_lkb_callback();
 0)               |    fsdlm_lock_ast_wrapper() {
 0)               |      ocfs2_unlock_ast() {
 0)   0.088 us    |        ocfs2_get_inode_osb();
 0)   9.498 us    |        ocfs2_wake_downconvert_thread();
 0)               |        lockres_clear_flags() {
 0)   1.272 us    |          lockres_set_flags();
 0)   1.757 us    |        }
 0) + 13.396 us   |      }
 0) + 13.983 us   |    }
 0)               |    dlm_put_lkb() {
 0)   0.136 us    |      __put_lkb();
 0)   0.641 us    |    }
 0) + 17.224 us   |  }


Thank,
Eric
On 11/24/15 18:02, Eric Ren wrote:
Hi Joseph,

I use ftrace's function tracer to record some code flow. There's a question that makes me confused - why does ocfs2_cancel_convert() be called here in ocfs2dc thread? In other words, what do we expect it
to do here?

ocfs2_unblock_lock(){
     ...
     if(lockres->l_flags & OCFS2_LOCK_BUSY){
        ...
        ocfs2_cancel_convert()
       ...
    }
}

From what I understand, ocfs2_cancel_convert()->ocfs2_dlm_unlock()->user_dlm_unlock()->dlm_unlock(DLM_LKF_CANCEL) puts the lock back on the the grand queue at its old grant mode. In my case, you know, read/write the same shared file from two nodes, I think the up-conversion can only happen on the writing node - (PR->EX), while on the reading node, no up-conversion is need, right?

But, the following output from writing and reading nodes, shows that ocfs2_cancel_convert() has been called on both nodes. why could
this happen in this scenario?

On 11/16/15 09:40, Joseph Qi wrote:
Sorry, I'm confused about b). You mean b) is also part of ocfs2cmt's
work? Does b) have something to do with a)? And what's the meaning of "evict inode"?
Actually, I can hardly understand the idea of b).
You can go through the code flow:
iput->iput_final->evict->evict_inode->ocfs2_evict_inode
->ocfs2_clear_inode->ocfs2_checkpoint_inode->ocfs2_start_checkpoint

It happens that one node do not use the inode any longer (but not
delete), and will free its related lockres.
OK, thanks~

Eric

_______________________________________________
Ocfs2-devel mailing list
Ocfs2-devel@oss.oracle.com
https://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to