On 8.2.2017 19:51, Kashyap Desai wrote: >>> +static inline void >>> +megasas_complete_r1_command(struct megasas_instance *instance, >>> + struct megasas_cmd_fusion *cmd) { >>> + u8 *sense, status, ex_status; >>> + u32 data_length; >>> + u16 peer_smid; >>> + struct fusion_context *fusion; >>> + struct megasas_cmd_fusion *r1_cmd = NULL; >>> + struct scsi_cmnd *scmd_local = NULL; >>> + struct RAID_CONTEXT_G35 *rctx_g35; >>> + >>> + rctx_g35 = &cmd->io_request->RaidContext.raid_context_g35; >>> + fusion = instance->ctrl_context; >>> + peer_smid = le16_to_cpu(rctx_g35->smid.peer_smid); >>> + >>> + r1_cmd = fusion->cmd_list[peer_smid - 1]; >>> + scmd_local = cmd->scmd; >>> + status = rctx_g35->status; >>> + ex_status = rctx_g35->ex_status; >>> + data_length = cmd->io_request->DataLength; >>> + sense = cmd->sense; >>> + >>> + cmd->cmd_completed = true; >> Please help me understand how this works >> - there are two peer commands sent to the controller >> - both are completed and the later calls scsi_done and returns both > r1_cmd >> + cmd >> - if both commands can be completed at the same time, is it possible > that >> the >> above line is executed at the same moment for both completions ? >> How is the code protected against a double completion when both >> completed commands see the peer cmd_completed as set ? > > Tomas, cmd and r1_cmd (part of same Raid 1 FP) will be always completed > on same reply queue by firmware. That is one of the key requirement here > for raid 1 fast path. > What you ask is possible if FW completes cmd and r1_cmd on different reply > queue. If you notice when we clone r1_cmd, we also clone MSI-x index from > parent command. > So eventually, FW is aware of binding of both cmd and r1_cmd w.r.t reply > queue index. ok, thanks > > ` Kashyap > >>> +