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
>
>>> +


Reply via email to