From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-0.6 required=3.0 tests=DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,T_DKIM_INVALID,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by aws-us-west-2-korg-lkml-1.web.codeaurora.org (Postfix) with ESMTP id 10013C5CFF1 for ; Tue, 12 Jun 2018 19:07:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A430B2089C for ; Tue, 12 Jun 2018 19:07:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="PjRV7tk2" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A430B2089C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934301AbeFLTH2 (ORCPT ); Tue, 12 Jun 2018 15:07:28 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:39214 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933328AbeFLTFw (ORCPT ); Tue, 12 Jun 2018 15:05:52 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=c2/n85BT4uXR7VMX0EP4l9zdhed3u7SlpkmCZnzeQ+Q=; b=PjRV7tk2lD3+yaxg9JGeTEzIr yftlJqG+ilMdotkgb4AAlQ5IEAMvsHgFUBvbNp6VWdPlfh139rg1+8VkOl37TVp2UGi9mYf488uhP 2dv2w5uNMhD0YB2cAbNei/07STc2R3JY4FfWCYYOy+CWUa8FsyjAL7ppy3gn5HQVw1A6GZMA+bb+V wdrYWl6oD8QDqqGu9Q+kX4atk357TTi4fL0KDYl+JBDJpHZnIYP9yurEZ104syWH8eoiMbxHlA8nG R0DkUzaMUD6lIfXPvUAyQI3wCkAuioOUqk+E/p/DF19k4Dn5rp6oBpyDVNX9HuIH+ntaqmpMkQY2h eqQrtzb9Q==; Received: from willy by bombadil.infradead.org with local (Exim 4.90_1 #2 (Red Hat Linux)) id 1fSoc2-0002uz-Sn; Tue, 12 Jun 2018 19:05:50 +0000 From: Matthew Wilcox To: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, target-devel@vger.kernel.org, linux1394-devel@lists.sourceforge.net, linux-usb@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, Juergen Gross , qla2xxx-upstream@qlogic.com, Kent Overstreet , Jens Axboe Cc: Matthew Wilcox Subject: [PATCH 2/3] Convert target drivers to use sbitmap Date: Tue, 12 Jun 2018 12:05:44 -0700 Message-Id: <20180612190545.10781-3-willy@infradead.org> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180612190545.10781-1-willy@infradead.org> References: <20180612190545.10781-1-willy@infradead.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The sbitmap and the percpu_ida perform essentially the same task, allocating tags for commands. The sbitmap outperforms the percpu_ida as documented here: https://lkml.org/lkml/2014/4/22/553 The sbitmap interface is a little harder to use, but being able to remove the percpu_ida code and getting better performance justifies the additional complexity. Signed-off-by: Matthew Wilcox Acked-by: Felipe Balbi # f_tcm --- drivers/scsi/qla2xxx/qla_target.c | 10 ++++--- drivers/target/iscsi/iscsi_target_util.c | 33 +++++++++++++++++++++--- drivers/target/sbp/sbp_target.c | 5 ++-- drivers/target/target_core_transport.c | 5 ++-- drivers/target/tcm_fc/tfc_cmd.c | 6 ++--- drivers/usb/gadget/function/f_tcm.c | 5 ++-- drivers/vhost/scsi.c | 6 ++--- drivers/xen/xen-scsiback.c | 5 ++-- include/target/iscsi/iscsi_target_core.h | 1 + include/target/target_core_base.h | 7 ++--- 10 files changed, 59 insertions(+), 24 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 05290966e630..a1725a054749 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -4277,9 +4277,9 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha, { struct se_session *se_sess = sess->se_sess; struct qla_tgt_cmd *cmd; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return NULL; @@ -4292,6 +4292,7 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha, qlt_incr_num_pend_cmds(vha); cmd->vha = vha; cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->sess = sess; cmd->loop_id = sess->loop_id; cmd->conf_compl_supported = sess->conf_compl_supported; @@ -5294,7 +5295,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, struct fc_port *sess; struct se_session *se_sess; struct qla_tgt_cmd *cmd; - int tag; + int tag, cpu; unsigned long flags; if (unlikely(tgt->tgt_stop)) { @@ -5326,7 +5327,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, se_sess = sess->se_sess; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return; @@ -5357,6 +5358,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, cmd->reset_count = ha->base_qpair->chip_reset; cmd->q_full = 1; cmd->qpair = ha->base_qpair; + cmd->se_cmd.map_cpu = cpu; if (qfull) { cmd->q_full = 1; diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index 7e98697cfb8e..8cfcf9033507 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c @@ -17,7 +17,7 @@ ******************************************************************************/ #include -#include +#include #include /* ipv6_addr_equal() */ #include #include @@ -147,6 +147,30 @@ void iscsit_free_r2ts_from_list(struct iscsi_cmd *cmd) spin_unlock_bh(&cmd->r2t_lock); } +static int iscsit_wait_for_tag(struct se_session *se_sess, int state, int *cpup) +{ + int tag = -1; + DEFINE_WAIT(wait); + struct sbq_wait_state *ws; + + if (state == TASK_RUNNING) + return tag; + + ws = &se_sess->sess_tag_pool.ws[0]; + for (;;) { + prepare_to_wait_exclusive(&ws->wait, &wait, state); + if (signal_pending_state(state, current)) + break; + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, cpup); + if (tag >= 0) + break; + schedule(); + } + + finish_wait(&ws->wait, &wait); + return tag; +} + /* * May be called from software interrupt (timer) context for allocating * iSCSI NopINs. @@ -155,9 +179,11 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, int state) { struct iscsi_cmd *cmd; struct se_session *se_sess = conn->sess->se_sess; - int size, tag; + int size, tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, state); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); + if (tag < 0) + tag = iscsit_wait_for_tag(se_sess, state, &cpu); if (tag < 0) return NULL; @@ -166,6 +192,7 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, int state) memset(cmd, 0, size); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->conn = conn; cmd->data_direction = DMA_NONE; INIT_LIST_HEAD(&cmd->i_conn_node); diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c index 679ae29d25ab..42b21f2ac8b0 100644 --- a/drivers/target/sbp/sbp_target.c +++ b/drivers/target/sbp/sbp_target.c @@ -926,15 +926,16 @@ static struct sbp_target_request *sbp_mgt_get_req(struct sbp_session *sess, { struct se_session *se_sess = sess->se_sess; struct sbp_target_request *req; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return ERR_PTR(-ENOMEM); req = &((struct sbp_target_request *)se_sess->sess_cmd_map)[tag]; memset(req, 0, sizeof(*req)); req->se_cmd.map_tag = tag; + req->se_cmd.map_cpu = cpu; req->se_cmd.tag = next_orb; return req; diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index f0e8f0f4ccb4..18c53c5cdd3d 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -260,7 +260,8 @@ int transport_alloc_session_tags(struct se_session *se_sess, } } - rc = percpu_ida_init(&se_sess->sess_tag_pool, tag_num); + rc = sbitmap_queue_init_node(&se_sess->sess_tag_pool, tag_num, -1, + false, GFP_KERNEL, NUMA_NO_NODE); if (rc < 0) { pr_err("Unable to init se_sess->sess_tag_pool," " tag_num: %u\n", tag_num); @@ -547,7 +548,7 @@ void transport_free_session(struct se_session *se_sess) target_put_nacl(se_nacl); } if (se_sess->sess_cmd_map) { - percpu_ida_destroy(&se_sess->sess_tag_pool); + sbitmap_queue_free(&se_sess->sess_tag_pool); kvfree(se_sess->sess_cmd_map); } kmem_cache_free(se_sess_cache, se_sess); diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index 13e4efbe1ce7..a183d4da7db2 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -448,9 +447,9 @@ static void ft_recv_cmd(struct ft_sess *sess, struct fc_frame *fp) struct ft_cmd *cmd; struct fc_lport *lport = sess->tport->lport; struct se_session *se_sess = sess->se_sess; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) goto busy; @@ -458,6 +457,7 @@ static void ft_recv_cmd(struct ft_sess *sess, struct fc_frame *fp) memset(cmd, 0, sizeof(struct ft_cmd)); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->sess = sess; cmd->seq = fc_seq_assign(lport, fp); if (!cmd->seq) { diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c index 9f670d9224b9..5003e857dce7 100644 --- a/drivers/usb/gadget/function/f_tcm.c +++ b/drivers/usb/gadget/function/f_tcm.c @@ -1071,15 +1071,16 @@ static struct usbg_cmd *usbg_get_cmd(struct f_uas *fu, { struct se_session *se_sess = tv_nexus->tvn_se_sess; struct usbg_cmd *cmd; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return ERR_PTR(-ENOMEM); cmd = &((struct usbg_cmd *)se_sess->sess_cmd_map)[tag]; memset(cmd, 0, sizeof(*cmd)); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->se_cmd.tag = cmd->tag = scsi_tag; cmd->fu = fu; diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 70d35e696533..c9c5d6b291cc 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c @@ -46,7 +46,6 @@ #include #include #include -#include #include "vhost.h" @@ -567,7 +566,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, struct se_session *se_sess; struct scatterlist *sg, *prot_sg; struct page **pages; - int tag; + int tag, cpu; tv_nexus = tpg->tpg_nexus; if (!tv_nexus) { @@ -576,7 +575,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, } se_sess = tv_nexus->tvn_se_sess; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) { pr_err("Unable to obtain tag for vhost_scsi_cmd\n"); return ERR_PTR(-ENOMEM); @@ -591,6 +590,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, cmd->tvc_prot_sgl = prot_sg; cmd->tvc_upages = pages; cmd->tvc_se_cmd.map_tag = tag; + cmd->tvc_se_cmd.map_cpu = cpu; cmd->tvc_tag = scsi_tag; cmd->tvc_lun = lun; cmd->tvc_task_attr = task_attr; diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c index ec6635258ed8..764dd9aa0131 100644 --- a/drivers/xen/xen-scsiback.c +++ b/drivers/xen/xen-scsiback.c @@ -654,9 +654,9 @@ static struct vscsibk_pend *scsiback_get_pend_req(struct vscsiif_back_ring *ring struct scsiback_nexus *nexus = tpg->tpg_nexus; struct se_session *se_sess = nexus->tvn_se_sess; struct vscsibk_pend *req; - int tag, i; + int tag, cpu, i; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) { pr_err("Unable to obtain tag for vscsiif_request\n"); return ERR_PTR(-ENOMEM); @@ -665,6 +665,7 @@ static struct vscsibk_pend *scsiback_get_pend_req(struct vscsiif_back_ring *ring req = &((struct vscsibk_pend *)se_sess->sess_cmd_map)[tag]; memset(req, 0, sizeof(*req)); req->se_cmd.map_tag = tag; + req->se_cmd.map_cpu = cpu; for (i = 0; i < VSCSI_MAX_GRANTS; i++) req->grant_handles[i] = SCSIBACK_INVALID_HANDLE; diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h index cf5f3fff1f1a..f2e6abea8490 100644 --- a/include/target/iscsi/iscsi_target_core.h +++ b/include/target/iscsi/iscsi_target_core.h @@ -4,6 +4,7 @@ #include /* enum dma_data_direction */ #include /* struct list_head */ +#include #include /* struct sockaddr_storage */ #include /* u8 */ #include /* itt_t */ diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 260c2f3e9460..448f291125c2 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -4,7 +4,7 @@ #include /* struct config_group */ #include /* enum dma_data_direction */ -#include /* struct percpu_ida */ +#include #include #include /* struct semaphore */ #include @@ -455,6 +455,7 @@ struct se_cmd { int sam_task_attr; /* Used for se_sess->sess_tag_pool */ unsigned int map_tag; + int map_cpu; /* Transport protocol dependent state, see transport_state_table */ enum transport_state_table t_state; /* See se_cmd_flags_table */ @@ -608,7 +609,7 @@ struct se_session { struct list_head sess_wait_list; spinlock_t sess_cmd_lock; void *sess_cmd_map; - struct percpu_ida sess_tag_pool; + struct sbitmap_queue sess_tag_pool; }; struct se_device; @@ -936,7 +937,7 @@ static inline void atomic_dec_mb(atomic_t *v) static inline void target_free_tag(struct se_session *sess, struct se_cmd *cmd) { - percpu_ida_free(&sess->sess_tag_pool, cmd->map_tag); + sbitmap_queue_clear(&sess->sess_tag_pool, cmd->map_tag, cmd->map_cpu); } #endif /* TARGET_CORE_BASE_H */ -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Wilcox Subject: [PATCH 2/3] Convert target drivers to use sbitmap Date: Tue, 12 Jun 2018 12:05:44 -0700 Message-ID: <20180612190545.10781-3-willy@infradead.org> References: <20180612190545.10781-1-willy@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: Matthew Wilcox To: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, target-devel@vger.kernel.org, linux1394-devel@lists.sourceforge.net, linux-usb@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, Juergen Gross , qla2xxx-upstream@qlogic.com, Kent Overstreet , Jens Axboe Return-path: In-Reply-To: <20180612190545.10781-1-willy@infradead.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux1394-devel-bounces@lists.sourceforge.net List-Id: netdev.vger.kernel.org The sbitmap and the percpu_ida perform essentially the same task, allocating tags for commands. The sbitmap outperforms the percpu_ida as documented here: https://lkml.org/lkml/2014/4/22/553 The sbitmap interface is a little harder to use, but being able to remove the percpu_ida code and getting better performance justifies the additional complexity. Signed-off-by: Matthew Wilcox Acked-by: Felipe Balbi # f_tcm --- drivers/scsi/qla2xxx/qla_target.c | 10 ++++--- drivers/target/iscsi/iscsi_target_util.c | 33 +++++++++++++++++++++--- drivers/target/sbp/sbp_target.c | 5 ++-- drivers/target/target_core_transport.c | 5 ++-- drivers/target/tcm_fc/tfc_cmd.c | 6 ++--- drivers/usb/gadget/function/f_tcm.c | 5 ++-- drivers/vhost/scsi.c | 6 ++--- drivers/xen/xen-scsiback.c | 5 ++-- include/target/iscsi/iscsi_target_core.h | 1 + include/target/target_core_base.h | 7 ++--- 10 files changed, 59 insertions(+), 24 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 05290966e630..a1725a054749 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -4277,9 +4277,9 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha, { struct se_session *se_sess = sess->se_sess; struct qla_tgt_cmd *cmd; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return NULL; @@ -4292,6 +4292,7 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha, qlt_incr_num_pend_cmds(vha); cmd->vha = vha; cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->sess = sess; cmd->loop_id = sess->loop_id; cmd->conf_compl_supported = sess->conf_compl_supported; @@ -5294,7 +5295,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, struct fc_port *sess; struct se_session *se_sess; struct qla_tgt_cmd *cmd; - int tag; + int tag, cpu; unsigned long flags; if (unlikely(tgt->tgt_stop)) { @@ -5326,7 +5327,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, se_sess = sess->se_sess; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return; @@ -5357,6 +5358,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, cmd->reset_count = ha->base_qpair->chip_reset; cmd->q_full = 1; cmd->qpair = ha->base_qpair; + cmd->se_cmd.map_cpu = cpu; if (qfull) { cmd->q_full = 1; diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index 7e98697cfb8e..8cfcf9033507 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c @@ -17,7 +17,7 @@ ******************************************************************************/ #include -#include +#include #include /* ipv6_addr_equal() */ #include #include @@ -147,6 +147,30 @@ void iscsit_free_r2ts_from_list(struct iscsi_cmd *cmd) spin_unlock_bh(&cmd->r2t_lock); } +static int iscsit_wait_for_tag(struct se_session *se_sess, int state, int *cpup) +{ + int tag = -1; + DEFINE_WAIT(wait); + struct sbq_wait_state *ws; + + if (state == TASK_RUNNING) + return tag; + + ws = &se_sess->sess_tag_pool.ws[0]; + for (;;) { + prepare_to_wait_exclusive(&ws->wait, &wait, state); + if (signal_pending_state(state, current)) + break; + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, cpup); + if (tag >= 0) + break; + schedule(); + } + + finish_wait(&ws->wait, &wait); + return tag; +} + /* * May be called from software interrupt (timer) context for allocating * iSCSI NopINs. @@ -155,9 +179,11 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, int state) { struct iscsi_cmd *cmd; struct se_session *se_sess = conn->sess->se_sess; - int size, tag; + int size, tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, state); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); + if (tag < 0) + tag = iscsit_wait_for_tag(se_sess, state, &cpu); if (tag < 0) return NULL; @@ -166,6 +192,7 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, int state) memset(cmd, 0, size); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->conn = conn; cmd->data_direction = DMA_NONE; INIT_LIST_HEAD(&cmd->i_conn_node); diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c index 679ae29d25ab..42b21f2ac8b0 100644 --- a/drivers/target/sbp/sbp_target.c +++ b/drivers/target/sbp/sbp_target.c @@ -926,15 +926,16 @@ static struct sbp_target_request *sbp_mgt_get_req(struct sbp_session *sess, { struct se_session *se_sess = sess->se_sess; struct sbp_target_request *req; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return ERR_PTR(-ENOMEM); req = &((struct sbp_target_request *)se_sess->sess_cmd_map)[tag]; memset(req, 0, sizeof(*req)); req->se_cmd.map_tag = tag; + req->se_cmd.map_cpu = cpu; req->se_cmd.tag = next_orb; return req; diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index f0e8f0f4ccb4..18c53c5cdd3d 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -260,7 +260,8 @@ int transport_alloc_session_tags(struct se_session *se_sess, } } - rc = percpu_ida_init(&se_sess->sess_tag_pool, tag_num); + rc = sbitmap_queue_init_node(&se_sess->sess_tag_pool, tag_num, -1, + false, GFP_KERNEL, NUMA_NO_NODE); if (rc < 0) { pr_err("Unable to init se_sess->sess_tag_pool," " tag_num: %u\n", tag_num); @@ -547,7 +548,7 @@ void transport_free_session(struct se_session *se_sess) target_put_nacl(se_nacl); } if (se_sess->sess_cmd_map) { - percpu_ida_destroy(&se_sess->sess_tag_pool); + sbitmap_queue_free(&se_sess->sess_tag_pool); kvfree(se_sess->sess_cmd_map); } kmem_cache_free(se_sess_cache, se_sess); diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index 13e4efbe1ce7..a183d4da7db2 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -448,9 +447,9 @@ static void ft_recv_cmd(struct ft_sess *sess, struct fc_frame *fp) struct ft_cmd *cmd; struct fc_lport *lport = sess->tport->lport; struct se_session *se_sess = sess->se_sess; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) goto busy; @@ -458,6 +457,7 @@ static void ft_recv_cmd(struct ft_sess *sess, struct fc_frame *fp) memset(cmd, 0, sizeof(struct ft_cmd)); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->sess = sess; cmd->seq = fc_seq_assign(lport, fp); if (!cmd->seq) { diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c index 9f670d9224b9..5003e857dce7 100644 --- a/drivers/usb/gadget/function/f_tcm.c +++ b/drivers/usb/gadget/function/f_tcm.c @@ -1071,15 +1071,16 @@ static struct usbg_cmd *usbg_get_cmd(struct f_uas *fu, { struct se_session *se_sess = tv_nexus->tvn_se_sess; struct usbg_cmd *cmd; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return ERR_PTR(-ENOMEM); cmd = &((struct usbg_cmd *)se_sess->sess_cmd_map)[tag]; memset(cmd, 0, sizeof(*cmd)); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->se_cmd.tag = cmd->tag = scsi_tag; cmd->fu = fu; diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 70d35e696533..c9c5d6b291cc 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c @@ -46,7 +46,6 @@ #include #include #include -#include #include "vhost.h" @@ -567,7 +566,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, struct se_session *se_sess; struct scatterlist *sg, *prot_sg; struct page **pages; - int tag; + int tag, cpu; tv_nexus = tpg->tpg_nexus; if (!tv_nexus) { @@ -576,7 +575,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, } se_sess = tv_nexus->tvn_se_sess; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) { pr_err("Unable to obtain tag for vhost_scsi_cmd\n"); return ERR_PTR(-ENOMEM); @@ -591,6 +590,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, cmd->tvc_prot_sgl = prot_sg; cmd->tvc_upages = pages; cmd->tvc_se_cmd.map_tag = tag; + cmd->tvc_se_cmd.map_cpu = cpu; cmd->tvc_tag = scsi_tag; cmd->tvc_lun = lun; cmd->tvc_task_attr = task_attr; diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c index ec6635258ed8..764dd9aa0131 100644 --- a/drivers/xen/xen-scsiback.c +++ b/drivers/xen/xen-scsiback.c @@ -654,9 +654,9 @@ static struct vscsibk_pend *scsiback_get_pend_req(struct vscsiif_back_ring *ring struct scsiback_nexus *nexus = tpg->tpg_nexus; struct se_session *se_sess = nexus->tvn_se_sess; struct vscsibk_pend *req; - int tag, i; + int tag, cpu, i; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) { pr_err("Unable to obtain tag for vscsiif_request\n"); return ERR_PTR(-ENOMEM); @@ -665,6 +665,7 @@ static struct vscsibk_pend *scsiback_get_pend_req(struct vscsiif_back_ring *ring req = &((struct vscsibk_pend *)se_sess->sess_cmd_map)[tag]; memset(req, 0, sizeof(*req)); req->se_cmd.map_tag = tag; + req->se_cmd.map_cpu = cpu; for (i = 0; i < VSCSI_MAX_GRANTS; i++) req->grant_handles[i] = SCSIBACK_INVALID_HANDLE; diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h index cf5f3fff1f1a..f2e6abea8490 100644 --- a/include/target/iscsi/iscsi_target_core.h +++ b/include/target/iscsi/iscsi_target_core.h @@ -4,6 +4,7 @@ #include /* enum dma_data_direction */ #include /* struct list_head */ +#include #include /* struct sockaddr_storage */ #include /* u8 */ #include /* itt_t */ diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 260c2f3e9460..448f291125c2 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -4,7 +4,7 @@ #include /* struct config_group */ #include /* enum dma_data_direction */ -#include /* struct percpu_ida */ +#include #include #include /* struct semaphore */ #include @@ -455,6 +455,7 @@ struct se_cmd { int sam_task_attr; /* Used for se_sess->sess_tag_pool */ unsigned int map_tag; + int map_cpu; /* Transport protocol dependent state, see transport_state_table */ enum transport_state_table t_state; /* See se_cmd_flags_table */ @@ -608,7 +609,7 @@ struct se_session { struct list_head sess_wait_list; spinlock_t sess_cmd_lock; void *sess_cmd_map; - struct percpu_ida sess_tag_pool; + struct sbitmap_queue sess_tag_pool; }; struct se_device; @@ -936,7 +937,7 @@ static inline void atomic_dec_mb(atomic_t *v) static inline void target_free_tag(struct se_session *sess, struct se_cmd *cmd) { - percpu_ida_free(&sess->sess_tag_pool, cmd->map_tag); + sbitmap_queue_clear(&sess->sess_tag_pool, cmd->map_tag, cmd->map_cpu); } #endif /* TARGET_CORE_BASE_H */ -- 2.17.1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Wilcox Date: Tue, 12 Jun 2018 19:05:44 +0000 Subject: [PATCH 2/3] Convert target drivers to use sbitmap Message-Id: <20180612190545.10781-3-willy@infradead.org> List-Id: References: <20180612190545.10781-1-willy@infradead.org> In-Reply-To: <20180612190545.10781-1-willy@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, target-devel@vger.kernel.org, linux1394-devel@lists.sourceforge.net, linux-usb@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, Juergen Gross , qla2xxx-upstream@qlogic.com, Kent Overstreet , Jens Axboe Cc: Matthew Wilcox The sbitmap and the percpu_ida perform essentially the same task, allocating tags for commands. The sbitmap outperforms the percpu_ida as documented here: https://lkml.org/lkml/2014/4/22/553 The sbitmap interface is a little harder to use, but being able to remove the percpu_ida code and getting better performance justifies the additional complexity. Signed-off-by: Matthew Wilcox Acked-by: Felipe Balbi # f_tcm --- drivers/scsi/qla2xxx/qla_target.c | 10 ++++--- drivers/target/iscsi/iscsi_target_util.c | 33 +++++++++++++++++++++--- drivers/target/sbp/sbp_target.c | 5 ++-- drivers/target/target_core_transport.c | 5 ++-- drivers/target/tcm_fc/tfc_cmd.c | 6 ++--- drivers/usb/gadget/function/f_tcm.c | 5 ++-- drivers/vhost/scsi.c | 6 ++--- drivers/xen/xen-scsiback.c | 5 ++-- include/target/iscsi/iscsi_target_core.h | 1 + include/target/target_core_base.h | 7 ++--- 10 files changed, 59 insertions(+), 24 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 05290966e630..a1725a054749 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -4277,9 +4277,9 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha, { struct se_session *se_sess = sess->se_sess; struct qla_tgt_cmd *cmd; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return NULL; @@ -4292,6 +4292,7 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha, qlt_incr_num_pend_cmds(vha); cmd->vha = vha; cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->sess = sess; cmd->loop_id = sess->loop_id; cmd->conf_compl_supported = sess->conf_compl_supported; @@ -5294,7 +5295,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, struct fc_port *sess; struct se_session *se_sess; struct qla_tgt_cmd *cmd; - int tag; + int tag, cpu; unsigned long flags; if (unlikely(tgt->tgt_stop)) { @@ -5326,7 +5327,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, se_sess = sess->se_sess; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return; @@ -5357,6 +5358,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha, cmd->reset_count = ha->base_qpair->chip_reset; cmd->q_full = 1; cmd->qpair = ha->base_qpair; + cmd->se_cmd.map_cpu = cpu; if (qfull) { cmd->q_full = 1; diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index 7e98697cfb8e..8cfcf9033507 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c @@ -17,7 +17,7 @@ ******************************************************************************/ #include -#include +#include #include /* ipv6_addr_equal() */ #include #include @@ -147,6 +147,30 @@ void iscsit_free_r2ts_from_list(struct iscsi_cmd *cmd) spin_unlock_bh(&cmd->r2t_lock); } +static int iscsit_wait_for_tag(struct se_session *se_sess, int state, int *cpup) +{ + int tag = -1; + DEFINE_WAIT(wait); + struct sbq_wait_state *ws; + + if (state = TASK_RUNNING) + return tag; + + ws = &se_sess->sess_tag_pool.ws[0]; + for (;;) { + prepare_to_wait_exclusive(&ws->wait, &wait, state); + if (signal_pending_state(state, current)) + break; + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, cpup); + if (tag >= 0) + break; + schedule(); + } + + finish_wait(&ws->wait, &wait); + return tag; +} + /* * May be called from software interrupt (timer) context for allocating * iSCSI NopINs. @@ -155,9 +179,11 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, int state) { struct iscsi_cmd *cmd; struct se_session *se_sess = conn->sess->se_sess; - int size, tag; + int size, tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, state); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); + if (tag < 0) + tag = iscsit_wait_for_tag(se_sess, state, &cpu); if (tag < 0) return NULL; @@ -166,6 +192,7 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, int state) memset(cmd, 0, size); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->conn = conn; cmd->data_direction = DMA_NONE; INIT_LIST_HEAD(&cmd->i_conn_node); diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c index 679ae29d25ab..42b21f2ac8b0 100644 --- a/drivers/target/sbp/sbp_target.c +++ b/drivers/target/sbp/sbp_target.c @@ -926,15 +926,16 @@ static struct sbp_target_request *sbp_mgt_get_req(struct sbp_session *sess, { struct se_session *se_sess = sess->se_sess; struct sbp_target_request *req; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return ERR_PTR(-ENOMEM); req = &((struct sbp_target_request *)se_sess->sess_cmd_map)[tag]; memset(req, 0, sizeof(*req)); req->se_cmd.map_tag = tag; + req->se_cmd.map_cpu = cpu; req->se_cmd.tag = next_orb; return req; diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index f0e8f0f4ccb4..18c53c5cdd3d 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -260,7 +260,8 @@ int transport_alloc_session_tags(struct se_session *se_sess, } } - rc = percpu_ida_init(&se_sess->sess_tag_pool, tag_num); + rc = sbitmap_queue_init_node(&se_sess->sess_tag_pool, tag_num, -1, + false, GFP_KERNEL, NUMA_NO_NODE); if (rc < 0) { pr_err("Unable to init se_sess->sess_tag_pool," " tag_num: %u\n", tag_num); @@ -547,7 +548,7 @@ void transport_free_session(struct se_session *se_sess) target_put_nacl(se_nacl); } if (se_sess->sess_cmd_map) { - percpu_ida_destroy(&se_sess->sess_tag_pool); + sbitmap_queue_free(&se_sess->sess_tag_pool); kvfree(se_sess->sess_cmd_map); } kmem_cache_free(se_sess_cache, se_sess); diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index 13e4efbe1ce7..a183d4da7db2 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -448,9 +447,9 @@ static void ft_recv_cmd(struct ft_sess *sess, struct fc_frame *fp) struct ft_cmd *cmd; struct fc_lport *lport = sess->tport->lport; struct se_session *se_sess = sess->se_sess; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) goto busy; @@ -458,6 +457,7 @@ static void ft_recv_cmd(struct ft_sess *sess, struct fc_frame *fp) memset(cmd, 0, sizeof(struct ft_cmd)); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->sess = sess; cmd->seq = fc_seq_assign(lport, fp); if (!cmd->seq) { diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c index 9f670d9224b9..5003e857dce7 100644 --- a/drivers/usb/gadget/function/f_tcm.c +++ b/drivers/usb/gadget/function/f_tcm.c @@ -1071,15 +1071,16 @@ static struct usbg_cmd *usbg_get_cmd(struct f_uas *fu, { struct se_session *se_sess = tv_nexus->tvn_se_sess; struct usbg_cmd *cmd; - int tag; + int tag, cpu; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) return ERR_PTR(-ENOMEM); cmd = &((struct usbg_cmd *)se_sess->sess_cmd_map)[tag]; memset(cmd, 0, sizeof(*cmd)); cmd->se_cmd.map_tag = tag; + cmd->se_cmd.map_cpu = cpu; cmd->se_cmd.tag = cmd->tag = scsi_tag; cmd->fu = fu; diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 70d35e696533..c9c5d6b291cc 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c @@ -46,7 +46,6 @@ #include #include #include -#include #include "vhost.h" @@ -567,7 +566,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, struct se_session *se_sess; struct scatterlist *sg, *prot_sg; struct page **pages; - int tag; + int tag, cpu; tv_nexus = tpg->tpg_nexus; if (!tv_nexus) { @@ -576,7 +575,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, } se_sess = tv_nexus->tvn_se_sess; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) { pr_err("Unable to obtain tag for vhost_scsi_cmd\n"); return ERR_PTR(-ENOMEM); @@ -591,6 +590,7 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, cmd->tvc_prot_sgl = prot_sg; cmd->tvc_upages = pages; cmd->tvc_se_cmd.map_tag = tag; + cmd->tvc_se_cmd.map_cpu = cpu; cmd->tvc_tag = scsi_tag; cmd->tvc_lun = lun; cmd->tvc_task_attr = task_attr; diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c index ec6635258ed8..764dd9aa0131 100644 --- a/drivers/xen/xen-scsiback.c +++ b/drivers/xen/xen-scsiback.c @@ -654,9 +654,9 @@ static struct vscsibk_pend *scsiback_get_pend_req(struct vscsiif_back_ring *ring struct scsiback_nexus *nexus = tpg->tpg_nexus; struct se_session *se_sess = nexus->tvn_se_sess; struct vscsibk_pend *req; - int tag, i; + int tag, cpu, i; - tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING); + tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); if (tag < 0) { pr_err("Unable to obtain tag for vscsiif_request\n"); return ERR_PTR(-ENOMEM); @@ -665,6 +665,7 @@ static struct vscsibk_pend *scsiback_get_pend_req(struct vscsiif_back_ring *ring req = &((struct vscsibk_pend *)se_sess->sess_cmd_map)[tag]; memset(req, 0, sizeof(*req)); req->se_cmd.map_tag = tag; + req->se_cmd.map_cpu = cpu; for (i = 0; i < VSCSI_MAX_GRANTS; i++) req->grant_handles[i] = SCSIBACK_INVALID_HANDLE; diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h index cf5f3fff1f1a..f2e6abea8490 100644 --- a/include/target/iscsi/iscsi_target_core.h +++ b/include/target/iscsi/iscsi_target_core.h @@ -4,6 +4,7 @@ #include /* enum dma_data_direction */ #include /* struct list_head */ +#include #include /* struct sockaddr_storage */ #include /* u8 */ #include /* itt_t */ diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 260c2f3e9460..448f291125c2 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -4,7 +4,7 @@ #include /* struct config_group */ #include /* enum dma_data_direction */ -#include /* struct percpu_ida */ +#include #include #include /* struct semaphore */ #include @@ -455,6 +455,7 @@ struct se_cmd { int sam_task_attr; /* Used for se_sess->sess_tag_pool */ unsigned int map_tag; + int map_cpu; /* Transport protocol dependent state, see transport_state_table */ enum transport_state_table t_state; /* See se_cmd_flags_table */ @@ -608,7 +609,7 @@ struct se_session { struct list_head sess_wait_list; spinlock_t sess_cmd_lock; void *sess_cmd_map; - struct percpu_ida sess_tag_pool; + struct sbitmap_queue sess_tag_pool; }; struct se_device; @@ -936,7 +937,7 @@ static inline void atomic_dec_mb(atomic_t *v) static inline void target_free_tag(struct se_session *sess, struct se_cmd *cmd) { - percpu_ida_free(&sess->sess_tag_pool, cmd->map_tag); + sbitmap_queue_clear(&sess->sess_tag_pool, cmd->map_tag, cmd->map_cpu); } #endif /* TARGET_CORE_BASE_H */ -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [2/3] Convert target drivers to use sbitmap From: Matthew Wilcox Message-Id: <20180612190545.10781-3-willy@infradead.org> Date: Tue, 12 Jun 2018 12:05:44 -0700 To: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, target-devel@vger.kernel.org, linux1394-devel@lists.sourceforge.net, linux-usb@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, Juergen Gross , qla2xxx-upstream@qlogic.com, Kent Overstreet , Jens Axboe Cc: Matthew Wilcox List-ID: VGhlIHNiaXRtYXAgYW5kIHRoZSBwZXJjcHVfaWRhIHBlcmZvcm0gZXNzZW50aWFsbHkgdGhlIHNh bWUgdGFzaywKYWxsb2NhdGluZyB0YWdzIGZvciBjb21tYW5kcy4gIFRoZSBzYml0bWFwIG91dHBl cmZvcm1zIHRoZSBwZXJjcHVfaWRhCmFzIGRvY3VtZW50ZWQgaGVyZTogaHR0cHM6Ly9sa21sLm9y Zy9sa21sLzIwMTQvNC8yMi81NTMKClRoZSBzYml0bWFwIGludGVyZmFjZSBpcyBhIGxpdHRsZSBo YXJkZXIgdG8gdXNlLCBidXQgYmVpbmcgYWJsZSB0bwpyZW1vdmUgdGhlIHBlcmNwdV9pZGEgY29k ZSBhbmQgZ2V0dGluZyBiZXR0ZXIgcGVyZm9ybWFuY2UganVzdGlmaWVzIHRoZQphZGRpdGlvbmFs IGNvbXBsZXhpdHkuCgpTaWduZWQtb2ZmLWJ5OiBNYXR0aGV3IFdpbGNveCA8d2lsbHlAaW5mcmFk ZWFkLm9yZz4KQWNrZWQtYnk6IEZlbGlwZSBCYWxiaSA8ZmVsaXBlLmJhbGJpQGxpbnV4LmludGVs LmNvbT4JIyBmX3RjbQotLS0KIGRyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuYyAgICAg ICAgfCAxMCArKysrLS0tCiBkcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfdXRpbC5j IHwgMzMgKysrKysrKysrKysrKysrKysrKysrLS0tCiBkcml2ZXJzL3RhcmdldC9zYnAvc2JwX3Rh cmdldC5jICAgICAgICAgIHwgIDUgKystLQogZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJh bnNwb3J0LmMgICB8ICA1ICsrLS0KIGRyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMgICAg ICAgICAgfCAgNiArKy0tLQogZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfdGNtLmMgICAg ICB8ICA1ICsrLS0KIGRyaXZlcnMvdmhvc3Qvc2NzaS5jICAgICAgICAgICAgICAgICAgICAgfCAg NiArKy0tLQogZHJpdmVycy94ZW4veGVuLXNjc2liYWNrLmMgICAgICAgICAgICAgICB8ICA1ICsr LS0KIGluY2x1ZGUvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9jb3JlLmggfCAgMSArCiBpbmNs dWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmggICAgICAgIHwgIDcgKystLS0KIDEwIGZpbGVz IGNoYW5nZWQsIDU5IGluc2VydGlvbnMoKyksIDI0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4 L3FsYV90YXJnZXQuYwppbmRleCAwNTI5MDk2NmU2MzAuLmExNzI1YTA1NDc0OSAxMDA2NDQKLS0t IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RhcmdldC5jCisrKyBiL2RyaXZlcnMvc2NzaS9x bGEyeHh4L3FsYV90YXJnZXQuYwpAQCAtNDI3Nyw5ICs0Mjc3LDkgQEAgc3RhdGljIHN0cnVjdCBx bGFfdGd0X2NtZCAqcWx0X2dldF90YWcoc2NzaV9xbGFfaG9zdF90ICp2aGEsCiB7CiAJc3RydWN0 IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBzZXNzLT5zZV9zZXNzOwogCXN0cnVjdCBxbGFfdGd0X2Nt ZCAqY21kOwotCWludCB0YWc7CisJaW50IHRhZywgY3B1OwogCi0JdGFnID0gcGVyY3B1X2lkYV9h bGxvYygmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgVEFTS19SVU5OSU5HKTsKKwl0YWcgPSBzYml0 bWFwX3F1ZXVlX2dldCgmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgJmNwdSk7CiAJaWYgKHRhZyA8 IDApCiAJCXJldHVybiBOVUxMOwogCkBAIC00MjkyLDYgKzQyOTIsNyBAQCBzdGF0aWMgc3RydWN0 IHFsYV90Z3RfY21kICpxbHRfZ2V0X3RhZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwKIAlxbHRfaW5j cl9udW1fcGVuZF9jbWRzKHZoYSk7CiAJY21kLT52aGEgPSB2aGE7CiAJY21kLT5zZV9jbWQubWFw X3RhZyA9IHRhZzsKKwljbWQtPnNlX2NtZC5tYXBfY3B1ID0gY3B1OwogCWNtZC0+c2VzcyA9IHNl c3M7CiAJY21kLT5sb29wX2lkID0gc2Vzcy0+bG9vcF9pZDsKIAljbWQtPmNvbmZfY29tcGxfc3Vw cG9ydGVkID0gc2Vzcy0+Y29uZl9jb21wbF9zdXBwb3J0ZWQ7CkBAIC01Mjk0LDcgKzUyOTUsNyBA QCBxbHRfYWxsb2NfcWZ1bGxfY21kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCiAJc3RydWN0 IGZjX3BvcnQgKnNlc3M7CiAJc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3M7CiAJc3RydWN0IHFs YV90Z3RfY21kICpjbWQ7Ci0JaW50IHRhZzsKKwlpbnQgdGFnLCBjcHU7CiAJdW5zaWduZWQgbG9u ZyBmbGFnczsKIAogCWlmICh1bmxpa2VseSh0Z3QtPnRndF9zdG9wKSkgewpAQCAtNTMyNiw3ICs1 MzI3LDcgQEAgcWx0X2FsbG9jX3FmdWxsX2NtZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAog CiAJc2Vfc2VzcyA9IHNlc3MtPnNlX3Nlc3M7CiAKLQl0YWcgPSBwZXJjcHVfaWRhX2FsbG9jKCZz ZV9zZXNzLT5zZXNzX3RhZ19wb29sLCBUQVNLX1JVTk5JTkcpOworCXRhZyA9IHNiaXRtYXBfcXVl dWVfZ2V0KCZzZV9zZXNzLT5zZXNzX3RhZ19wb29sLCAmY3B1KTsKIAlpZiAodGFnIDwgMCkKIAkJ cmV0dXJuOwogCkBAIC01MzU3LDYgKzUzNTgsNyBAQCBxbHRfYWxsb2NfcWZ1bGxfY21kKHN0cnVj dCBzY3NpX3FsYV9ob3N0ICp2aGEsCiAJY21kLT5yZXNldF9jb3VudCA9IGhhLT5iYXNlX3FwYWly LT5jaGlwX3Jlc2V0OwogCWNtZC0+cV9mdWxsID0gMTsKIAljbWQtPnFwYWlyID0gaGEtPmJhc2Vf cXBhaXI7CisJY21kLT5zZV9jbWQubWFwX2NwdSA9IGNwdTsKIAogCWlmIChxZnVsbCkgewogCQlj bWQtPnFfZnVsbCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90 YXJnZXRfdXRpbC5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3V0aWwuYwpp bmRleCA3ZTk4Njk3Y2ZiOGUuLjhjZmNmOTAzMzUwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJn ZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3V0aWwuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9p c2NzaV90YXJnZXRfdXRpbC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLwogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9p ZGEuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9zaWduYWwuaD4KICNpbmNsdWRlIDxuZXQvaXB2 Ni5oPiAgICAgICAgIC8qIGlwdjZfYWRkcl9lcXVhbCgpICovCiAjaW5jbHVkZSA8c2NzaS9zY3Np X3RjcS5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfcHJvdG8uaD4KQEAgLTE0Nyw2ICsxNDcsMzAg QEAgdm9pZCBpc2NzaXRfZnJlZV9yMnRzX2Zyb21fbGlzdChzdHJ1Y3QgaXNjc2lfY21kICpjbWQp CiAJc3Bpbl91bmxvY2tfYmgoJmNtZC0+cjJ0X2xvY2spOwogfQogCitzdGF0aWMgaW50IGlzY3Np dF93YWl0X2Zvcl90YWcoc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MsIGludCBzdGF0ZSwgaW50 ICpjcHVwKQoreworCWludCB0YWcgPSAtMTsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlzdHJ1Y3Qg c2JxX3dhaXRfc3RhdGUgKndzOworCisJaWYgKHN0YXRlID09IFRBU0tfUlVOTklORykKKwkJcmV0 dXJuIHRhZzsKKworCXdzID0gJnNlX3Nlc3MtPnNlc3NfdGFnX3Bvb2wud3NbMF07CisJZm9yICg7 OykgeworCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCZ3cy0+d2FpdCwgJndhaXQsIHN0YXRl KTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nX3N0YXRlKHN0YXRlLCBjdXJyZW50KSkKKwkJCWJyZWFr OworCQl0YWcgPSBzYml0bWFwX3F1ZXVlX2dldCgmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgY3B1 cCk7CisJCWlmICh0YWcgPj0gMCkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKworCWZp bmlzaF93YWl0KCZ3cy0+d2FpdCwgJndhaXQpOworCXJldHVybiB0YWc7Cit9CisKIC8qCiAgKiBN YXkgYmUgY2FsbGVkIGZyb20gc29mdHdhcmUgaW50ZXJydXB0ICh0aW1lcikgY29udGV4dCBmb3Ig YWxsb2NhdGluZwogICogaVNDU0kgTm9wSU5zLgpAQCAtMTU1LDkgKzE3OSwxMSBAQCBzdHJ1Y3Qg aXNjc2lfY21kICppc2NzaXRfYWxsb2NhdGVfY21kKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBp bnQgc3RhdGUpCiB7CiAJc3RydWN0IGlzY3NpX2NtZCAqY21kOwogCXN0cnVjdCBzZV9zZXNzaW9u ICpzZV9zZXNzID0gY29ubi0+c2Vzcy0+c2Vfc2VzczsKLQlpbnQgc2l6ZSwgdGFnOworCWludCBz aXplLCB0YWcsIGNwdTsKIAotCXRhZyA9IHBlcmNwdV9pZGFfYWxsb2MoJnNlX3Nlc3MtPnNlc3Nf dGFnX3Bvb2wsIHN0YXRlKTsKKwl0YWcgPSBzYml0bWFwX3F1ZXVlX2dldCgmc2Vfc2Vzcy0+c2Vz c190YWdfcG9vbCwgJmNwdSk7CisJaWYgKHRhZyA8IDApCisJCXRhZyA9IGlzY3NpdF93YWl0X2Zv cl90YWcoc2Vfc2Vzcywgc3RhdGUsICZjcHUpOwogCWlmICh0YWcgPCAwKQogCQlyZXR1cm4gTlVM TDsKIApAQCAtMTY2LDYgKzE5Miw3IEBAIHN0cnVjdCBpc2NzaV9jbWQgKmlzY3NpdF9hbGxvY2F0 ZV9jbWQoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIGludCBzdGF0ZSkKIAltZW1zZXQoY21kLCAw LCBzaXplKTsKIAogCWNtZC0+c2VfY21kLm1hcF90YWcgPSB0YWc7CisJY21kLT5zZV9jbWQubWFw X2NwdSA9IGNwdTsKIAljbWQtPmNvbm4gPSBjb25uOwogCWNtZC0+ZGF0YV9kaXJlY3Rpb24gPSBE TUFfTk9ORTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT5pX2Nvbm5fbm9kZSk7CmRpZmYgLS1naXQg YS9kcml2ZXJzL3RhcmdldC9zYnAvc2JwX3RhcmdldC5jIGIvZHJpdmVycy90YXJnZXQvc2JwL3Ni cF90YXJnZXQuYwppbmRleCA2NzlhZTI5ZDI1YWIuLjQyYjIxZjJhYzhiMCAxMDA2NDQKLS0tIGEv ZHJpdmVycy90YXJnZXQvc2JwL3NicF90YXJnZXQuYworKysgYi9kcml2ZXJzL3RhcmdldC9zYnAv c2JwX3RhcmdldC5jCkBAIC05MjYsMTUgKzkyNiwxNiBAQCBzdGF0aWMgc3RydWN0IHNicF90YXJn ZXRfcmVxdWVzdCAqc2JwX21ndF9nZXRfcmVxKHN0cnVjdCBzYnBfc2Vzc2lvbiAqc2VzcywKIHsK IAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IHNlc3MtPnNlX3Nlc3M7CiAJc3RydWN0IHNi cF90YXJnZXRfcmVxdWVzdCAqcmVxOwotCWludCB0YWc7CisJaW50IHRhZywgY3B1OwogCi0JdGFn ID0gcGVyY3B1X2lkYV9hbGxvYygmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgVEFTS19SVU5OSU5H KTsKKwl0YWcgPSBzYml0bWFwX3F1ZXVlX2dldCgmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgJmNw dSk7CiAJaWYgKHRhZyA8IDApCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJcmVxID0g Jigoc3RydWN0IHNicF90YXJnZXRfcmVxdWVzdCAqKXNlX3Nlc3MtPnNlc3NfY21kX21hcClbdGFn XTsKIAltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOwogCXJlcS0+c2VfY21kLm1hcF90YWcg PSB0YWc7CisJcmVxLT5zZV9jbWQubWFwX2NwdSA9IGNwdTsKIAlyZXEtPnNlX2NtZC50YWcgPSBu ZXh0X29yYjsKIAogCXJldHVybiByZXE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJn ZXRfY29yZV90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9y dC5jCmluZGV4IGYwZThmMGY0Y2NiNC4uMThjNTNjNWNkZDNkIDEwMDY0NAotLS0gYS9kcml2ZXJz L3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJn ZXRfY29yZV90cmFuc3BvcnQuYwpAQCAtMjYwLDcgKzI2MCw4IEBAIGludCB0cmFuc3BvcnRfYWxs b2Nfc2Vzc2lvbl90YWdzKHN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzLAogCQl9CiAJfQogCi0J cmMgPSBwZXJjcHVfaWRhX2luaXQoJnNlX3Nlc3MtPnNlc3NfdGFnX3Bvb2wsIHRhZ19udW0pOwor CXJjID0gc2JpdG1hcF9xdWV1ZV9pbml0X25vZGUoJnNlX3Nlc3MtPnNlc3NfdGFnX3Bvb2wsIHRh Z19udW0sIC0xLAorCQkJZmFsc2UsIEdGUF9LRVJORUwsIE5VTUFfTk9fTk9ERSk7CiAJaWYgKHJj IDwgMCkgewogCQlwcl9lcnIoIlVuYWJsZSB0byBpbml0IHNlX3Nlc3MtPnNlc3NfdGFnX3Bvb2ws IgogCQkJIiB0YWdfbnVtOiAldVxuIiwgdGFnX251bSk7CkBAIC01NDcsNyArNTQ4LDcgQEAgdm9p ZCB0cmFuc3BvcnRfZnJlZV9zZXNzaW9uKHN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzKQogCQl0 YXJnZXRfcHV0X25hY2woc2VfbmFjbCk7CiAJfQogCWlmIChzZV9zZXNzLT5zZXNzX2NtZF9tYXAp IHsKLQkJcGVyY3B1X2lkYV9kZXN0cm95KCZzZV9zZXNzLT5zZXNzX3RhZ19wb29sKTsKKwkJc2Jp dG1hcF9xdWV1ZV9mcmVlKCZzZV9zZXNzLT5zZXNzX3RhZ19wb29sKTsKIAkJa3ZmcmVlKHNlX3Nl c3MtPnNlc3NfY21kX21hcCk7CiAJfQogCWttZW1fY2FjaGVfZnJlZShzZV9zZXNzX2NhY2hlLCBz ZV9zZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMgYi9k cml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCmluZGV4IDEzZTRlZmJlMWNlNy4uYTE4M2Q0 ZGE3ZGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCisrKyBi L2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNs dWRlIDxsaW51eC9jb25maWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVk ZSA8bGludXgvaGFzaC5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9pZGEuaD4KICNpbmNsdWRl IDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgogI2luY2x1ZGUg PHNjc2kvbGliZmMuaD4KQEAgLTQ0OCw5ICs0NDcsOSBAQCBzdGF0aWMgdm9pZCBmdF9yZWN2X2Nt ZChzdHJ1Y3QgZnRfc2VzcyAqc2Vzcywgc3RydWN0IGZjX2ZyYW1lICpmcCkKIAlzdHJ1Y3QgZnRf Y21kICpjbWQ7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHNlc3MtPnRwb3J0LT5scG9ydDsK IAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IHNlc3MtPnNlX3Nlc3M7Ci0JaW50IHRhZzsK KwlpbnQgdGFnLCBjcHU7CiAKLQl0YWcgPSBwZXJjcHVfaWRhX2FsbG9jKCZzZV9zZXNzLT5zZXNz X3RhZ19wb29sLCBUQVNLX1JVTk5JTkcpOworCXRhZyA9IHNiaXRtYXBfcXVldWVfZ2V0KCZzZV9z ZXNzLT5zZXNzX3RhZ19wb29sLCAmY3B1KTsKIAlpZiAodGFnIDwgMCkKIAkJZ290byBidXN5Owog CkBAIC00NTgsNiArNDU3LDcgQEAgc3RhdGljIHZvaWQgZnRfcmVjdl9jbWQoc3RydWN0IGZ0X3Nl c3MgKnNlc3MsIHN0cnVjdCBmY19mcmFtZSAqZnApCiAJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKHN0 cnVjdCBmdF9jbWQpKTsKIAogCWNtZC0+c2VfY21kLm1hcF90YWcgPSB0YWc7CisJY21kLT5zZV9j bWQubWFwX2NwdSA9IGNwdTsKIAljbWQtPnNlc3MgPSBzZXNzOwogCWNtZC0+c2VxID0gZmNfc2Vx X2Fzc2lnbihscG9ydCwgZnApOwogCWlmICghY21kLT5zZXEpIHsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3RjbS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0 aW9uL2ZfdGNtLmMKaW5kZXggOWY2NzBkOTIyNGI5Li41MDAzZTg1N2RjZTcgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3RjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2dh ZGdldC9mdW5jdGlvbi9mX3RjbS5jCkBAIC0xMDcxLDE1ICsxMDcxLDE2IEBAIHN0YXRpYyBzdHJ1 Y3QgdXNiZ19jbWQgKnVzYmdfZ2V0X2NtZChzdHJ1Y3QgZl91YXMgKmZ1LAogewogCXN0cnVjdCBz ZV9zZXNzaW9uICpzZV9zZXNzID0gdHZfbmV4dXMtPnR2bl9zZV9zZXNzOwogCXN0cnVjdCB1c2Jn X2NtZCAqY21kOwotCWludCB0YWc7CisJaW50IHRhZywgY3B1OwogCi0JdGFnID0gcGVyY3B1X2lk YV9hbGxvYygmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgVEFTS19SVU5OSU5HKTsKKwl0YWcgPSBz Yml0bWFwX3F1ZXVlX2dldCgmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgJmNwdSk7CiAJaWYgKHRh ZyA8IDApCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJY21kID0gJigoc3RydWN0IHVz YmdfY21kICopc2Vfc2Vzcy0+c2Vzc19jbWRfbWFwKVt0YWddOwogCW1lbXNldChjbWQsIDAsIHNp emVvZigqY21kKSk7CiAJY21kLT5zZV9jbWQubWFwX3RhZyA9IHRhZzsKKwljbWQtPnNlX2NtZC5t YXBfY3B1ID0gY3B1OwogCWNtZC0+c2VfY21kLnRhZyA9IGNtZC0+dGFnID0gc2NzaV90YWc7CiAJ Y21kLT5mdSA9IGZ1OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Njc2kuYyBiL2RyaXZl cnMvdmhvc3Qvc2NzaS5jCmluZGV4IDcwZDM1ZTY5NjUzMy4uYzljNWQ2YjI5MWNjIDEwMDY0NAot LS0gYS9kcml2ZXJzL3Zob3N0L3Njc2kuYworKysgYi9kcml2ZXJzL3Zob3N0L3Njc2kuYwpAQCAt NDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19zY3NpLmg+CiAjaW5jbHVkZSA8 bGludXgvbGxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KLSNpbmNsdWRlIDxsaW51 eC9wZXJjcHVfaWRhLmg+CiAKICNpbmNsdWRlICJ2aG9zdC5oIgogCkBAIC01NjcsNyArNTY2LDcg QEAgdmhvc3Rfc2NzaV9nZXRfdGFnKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLCBzdHJ1Y3Qg dmhvc3Rfc2NzaV90cGcgKnRwZywKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzczsKIAlzdHJ1 Y3Qgc2NhdHRlcmxpc3QgKnNnLCAqcHJvdF9zZzsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwotCWlu dCB0YWc7CisJaW50IHRhZywgY3B1OwogCiAJdHZfbmV4dXMgPSB0cGctPnRwZ19uZXh1czsKIAlp ZiAoIXR2X25leHVzKSB7CkBAIC01NzYsNyArNTc1LDcgQEAgdmhvc3Rfc2NzaV9nZXRfdGFnKHN0 cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLCBzdHJ1Y3Qgdmhvc3Rfc2NzaV90cGcgKnRwZywKIAl9 CiAJc2Vfc2VzcyA9IHR2X25leHVzLT50dm5fc2Vfc2VzczsKIAotCXRhZyA9IHBlcmNwdV9pZGFf YWxsb2MoJnNlX3Nlc3MtPnNlc3NfdGFnX3Bvb2wsIFRBU0tfUlVOTklORyk7CisJdGFnID0gc2Jp dG1hcF9xdWV1ZV9nZXQoJnNlX3Nlc3MtPnNlc3NfdGFnX3Bvb2wsICZjcHUpOwogCWlmICh0YWcg PCAwKSB7CiAJCXByX2VycigiVW5hYmxlIHRvIG9idGFpbiB0YWcgZm9yIHZob3N0X3Njc2lfY21k XG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC01OTEsNiArNTkwLDcgQEAgdmhv c3Rfc2NzaV9nZXRfdGFnKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLCBzdHJ1Y3Qgdmhvc3Rf c2NzaV90cGcgKnRwZywKIAljbWQtPnR2Y19wcm90X3NnbCA9IHByb3Rfc2c7CiAJY21kLT50dmNf dXBhZ2VzID0gcGFnZXM7CiAJY21kLT50dmNfc2VfY21kLm1hcF90YWcgPSB0YWc7CisJY21kLT50 dmNfc2VfY21kLm1hcF9jcHUgPSBjcHU7CiAJY21kLT50dmNfdGFnID0gc2NzaV90YWc7CiAJY21k LT50dmNfbHVuID0gbHVuOwogCWNtZC0+dHZjX3Rhc2tfYXR0ciA9IHRhc2tfYXR0cjsKZGlmZiAt LWdpdCBhL2RyaXZlcnMveGVuL3hlbi1zY3NpYmFjay5jIGIvZHJpdmVycy94ZW4veGVuLXNjc2li YWNrLmMKaW5kZXggZWM2NjM1MjU4ZWQ4Li43NjRkZDlhYTAxMzEgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMveGVuL3hlbi1zY3NpYmFjay5jCisrKyBiL2RyaXZlcnMveGVuL3hlbi1zY3NpYmFjay5jCkBA IC02NTQsOSArNjU0LDkgQEAgc3RhdGljIHN0cnVjdCB2c2NzaWJrX3BlbmQgKnNjc2liYWNrX2dl dF9wZW5kX3JlcShzdHJ1Y3QgdnNjc2lpZl9iYWNrX3JpbmcgKnJpbmcKIAlzdHJ1Y3Qgc2NzaWJh Y2tfbmV4dXMgKm5leHVzID0gdHBnLT50cGdfbmV4dXM7CiAJc3RydWN0IHNlX3Nlc3Npb24gKnNl X3Nlc3MgPSBuZXh1cy0+dHZuX3NlX3Nlc3M7CiAJc3RydWN0IHZzY3NpYmtfcGVuZCAqcmVxOwot CWludCB0YWcsIGk7CisJaW50IHRhZywgY3B1LCBpOwogCi0JdGFnID0gcGVyY3B1X2lkYV9hbGxv Yygmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgVEFTS19SVU5OSU5HKTsKKwl0YWcgPSBzYml0bWFw X3F1ZXVlX2dldCgmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgJmNwdSk7CiAJaWYgKHRhZyA8IDAp IHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gb2J0YWluIHRhZyBmb3IgdnNjc2lpZl9yZXF1ZXN0XG4i KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC02NjUsNiArNjY1LDcgQEAgc3RhdGlj IHN0cnVjdCB2c2NzaWJrX3BlbmQgKnNjc2liYWNrX2dldF9wZW5kX3JlcShzdHJ1Y3QgdnNjc2lp Zl9iYWNrX3JpbmcgKnJpbmcKIAlyZXEgPSAmKChzdHJ1Y3QgdnNjc2lia19wZW5kICopc2Vfc2Vz cy0+c2Vzc19jbWRfbWFwKVt0YWddOwogCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CiAJ cmVxLT5zZV9jbWQubWFwX3RhZyA9IHRhZzsKKwlyZXEtPnNlX2NtZC5tYXBfY3B1ID0gY3B1Owog CiAJZm9yIChpID0gMDsgaSA8IFZTQ1NJX01BWF9HUkFOVFM7IGkrKykKIAkJcmVxLT5ncmFudF9o YW5kbGVzW2ldID0gU0NTSUJBQ0tfSU5WQUxJRF9IQU5ETEU7CmRpZmYgLS1naXQgYS9pbmNsdWRl L3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29yZS5oIGIvaW5jbHVkZS90YXJnZXQvaXNjc2kv aXNjc2lfdGFyZ2V0X2NvcmUuaAppbmRleCBjZjVmM2ZmZjFmMWEuLmYyZTZhYmVhODQ5MCAxMDA2 NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2NvcmUuaAorKysgYi9p bmNsdWRlL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29yZS5oCkBAIC00LDYgKzQsNyBAQAog CiAjaW5jbHVkZSA8bGludXgvZG1hLWRpcmVjdGlvbi5oPiAgICAgLyogZW51bSBkbWFfZGF0YV9k aXJlY3Rpb24gKi8KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+ICAgICAgICAgICAgICAvKiBzdHJ1 Y3QgbGlzdF9oZWFkICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51 eC9zb2NrZXQuaD4gICAgICAgICAgICAvKiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLwogI2lu Y2x1ZGUgPGxpbnV4L3R5cGVzLmg+ICAgICAgICAgICAgIC8qIHU4ICovCiAjaW5jbHVkZSA8c2Nz aS9pc2NzaV9wcm90by5oPiAgICAgICAgLyogaXR0X3QgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUv dGFyZ2V0L3RhcmdldF9jb3JlX2Jhc2UuaCBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2Jh c2UuaAppbmRleCAyNjBjMmYzZTk0NjAuLjQ0OGYyOTExMjVjMiAxMDA2NDQKLS0tIGEvaW5jbHVk ZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCisrKyBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9j b3JlX2Jhc2UuaApAQCAtNCw3ICs0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZ2ZzLmg+ ICAgICAgLyogc3RydWN0IGNvbmZpZ19ncm91cCAqLwogI2luY2x1ZGUgPGxpbnV4L2RtYS1kaXJl Y3Rpb24uaD4gLyogZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gKi8KLSNpbmNsdWRlIDxsaW51eC9w ZXJjcHVfaWRhLmg+ICAgIC8qIHN0cnVjdCBwZXJjcHVfaWRhICovCisjaW5jbHVkZSA8bGludXgv c2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS1yZWZjb3VudC5oPgogI2luY2x1ZGUg PGxpbnV4L3NlbWFwaG9yZS5oPiAgICAgLyogc3RydWN0IHNlbWFwaG9yZSAqLwogI2luY2x1ZGUg PGxpbnV4L2NvbXBsZXRpb24uaD4KQEAgLTQ1NSw2ICs0NTUsNyBAQCBzdHJ1Y3Qgc2VfY21kIHsK IAlpbnQJCQlzYW1fdGFza19hdHRyOwogCS8qIFVzZWQgZm9yIHNlX3Nlc3MtPnNlc3NfdGFnX3Bv b2wgKi8KIAl1bnNpZ25lZCBpbnQJCW1hcF90YWc7CisJaW50CQkJbWFwX2NwdTsKIAkvKiBUcmFu c3BvcnQgcHJvdG9jb2wgZGVwZW5kZW50IHN0YXRlLCBzZWUgdHJhbnNwb3J0X3N0YXRlX3RhYmxl ICovCiAJZW51bSB0cmFuc3BvcnRfc3RhdGVfdGFibGUgdF9zdGF0ZTsKIAkvKiBTZWUgc2VfY21k X2ZsYWdzX3RhYmxlICovCkBAIC02MDgsNyArNjA5LDcgQEAgc3RydWN0IHNlX3Nlc3Npb24gewog CXN0cnVjdCBsaXN0X2hlYWQJc2Vzc193YWl0X2xpc3Q7CiAJc3BpbmxvY2tfdAkJc2Vzc19jbWRf bG9jazsKIAl2b2lkCQkJKnNlc3NfY21kX21hcDsKLQlzdHJ1Y3QgcGVyY3B1X2lkYQlzZXNzX3Rh Z19wb29sOworCXN0cnVjdCBzYml0bWFwX3F1ZXVlCXNlc3NfdGFnX3Bvb2w7CiB9OwogCiBzdHJ1 Y3Qgc2VfZGV2aWNlOwpAQCAtOTM2LDcgKzkzNyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBhdG9t aWNfZGVjX21iKGF0b21pY190ICp2KQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFyZ2V0X2ZyZWVf dGFnKHN0cnVjdCBzZV9zZXNzaW9uICpzZXNzLCBzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0JcGVy Y3B1X2lkYV9mcmVlKCZzZXNzLT5zZXNzX3RhZ19wb29sLCBjbWQtPm1hcF90YWcpOworCXNiaXRt YXBfcXVldWVfY2xlYXIoJnNlc3MtPnNlc3NfdGFnX3Bvb2wsIGNtZC0+bWFwX3RhZywgY21kLT5t YXBfY3B1KTsKIH0KIAogI2VuZGlmIC8qIFRBUkdFVF9DT1JFX0JBU0VfSCAqLwo=