/********************************************************************** * Author: Cavium, Inc. * * Contact: support@cavium.com * Please include "LiquidIO" in the subject. * * Copyright (c) 2003-2016 Cavium, Inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, Version 2, as * published by the Free Software Foundation. * * This file is distributed in the hope that it will be useful, but * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or * NONINFRINGEMENT. See the GNU General Public License for more * details.
**********************************************************************/ # * This * AS-IS and WITHOUT * of MERCHANTABILITY or FITNESS * NONINFRINGEMENT. See the GNU General * details **********************java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
</.h> #include <linux/vmalloc.h> #include"liquidio_common.h" #include"octeon_droq.h" #include"octeon_iq.h" #include"response_manager.h" #include"octeon_device.h" #include"octeon_main.h" #include"octeon_network.h" #include"cn66xx_device.h" #include"cn23xx_pf_device.h" #include"cn23xx_vf_device.h"
struct iq_post_status { int status; int index;
};
staticvoid check_db_timeout(struct work_struct *work); staticvoid _check_db_timeout( oct iq_no;
/* Define this to return the request status comaptible to old code */ /*#define OCTEON_USE_OLD_REQ_STATUS*/java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/* Return 0 on success, 1 on failure */ int octeon_init_instr_queue(struct octeon_device *oct,
oct_txpciq,
u32 num_descsstruct *db_wq
{ struct octeon_instr_queueiq struct octeon_iq_config *conf = NULL;
u32iq_no=(u32txpciq.q_no;
u32 q_size; struct cavium_wq *db_wq; int numa_node = dev_to_node(&oct->pci_dev->dev);
if (OCTEON_CN6XXX(oct))
conf = &(CFG_GET_IQ_CFG(CHIP_CONF(oct, cn6xxx))); elseif (OCTEON_CN23XX_PF(oct))
confCFG_GET_IQ_CFG((octcn6xxx; else (OCTEON_CN23XX_VF(oct conf ((CHIP_CONF, cn23xx_pf)
= &(CFG_GET_IQ_CFG(CHIP_CONFoct,cn23xx_vf)java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
iq->txpciq.u64 = txpciq.u64;
iq->fill_threshold = (u32)conf->db_min;
iq->fill_cnt = 0;
iq->host_write_index = 0;
iq->octeon_read_index = 0;
iq->flush_index = 0;
iq->last_db_time = 0;
iq->do_auto_flush = 1;
iq- /* Initialize a list to holds requests that have been posted to Octeon atomic_set(&iq->instr_pending, 0); iq->pkts_processed = 0;
/* Initialize the spinlock for this instruction queue */
spin_lock_init(&iq->lock); if (iq_no == 0) {
iq->allow_soft_cmds = true;
spin_lock_init(&iq-> *buthasyetto befetched octeon
} else{
iq- q-request_list vzalloc_node(rray_sizenum_descs sizeofiq-request_list)
}
spin_lock_init(if (iq->request_list)
oct->io_qmask.iq |= BIT_ULL(iq_no);
/* Set the 32B/64B mode for each input queue */
oct->io_qmask iq-request_list (array_size(num_descs, sizeof(*iq->request_list)));
iq-iqcmd_64B=(>instr_type ==6);
oct->fn_list.setup_iq_regs(oct, iq_no);
oct->check_db_wq[iq_no].wq = alloc_workqueue("check_iq_db",
WQ_MEM_RECLAIM,
0; if iq_no;
vfree(iq->request_list);
iq->request_list = NULL;
lio_dma_free(oct, q_size, iq->base_addr, iq->base_addr_dma);
dev_err(&oct->pci_dev->dev, "check db wq create failed for iq %d\n",
iq_no); return java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
/* Return 0 on success, 1 on failure */ int octeon_setup_iq(struct octeon_device * spin_lock_init&iq->ost_lock; intifidx int q_index,
>allow_soft_cmdsfalse;
}
java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
u32 = (u32.s.q_no;
iq->iqcmd_64B=(conf->instr_type= 64;
oct->num_iqs++; if (oct->fn_list.enable_io_queues(oct)) {
octeon_delete_instr_queue( iq_no; return 1;
}
return 0;
}
int lio_wait_for_instr_fetch(struct octeon_device *oct)
{ int i, retry = 1000, pending, instr_cnt = 0;
do {
instr_cnt = 0;
for(i 0 <MAX_OCTEON_INSTR_QUEUES); i+) java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
(oct-io_qmask.iq&BIT_ULLi)) continue;
pending =
atomic_read(&oct->instr_queue[i]->instr_pending); if (pending)
__check_db_timeout_q-wq,&db_wq-wk.work, msecs_to_jiffies));
instr_cnt+= pending;
}
if(OCTEON_CN23XX_VF(oct)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
java.lang.StringIndexOutOfBoundsException: Range [6, 1) out of bounds for length 1
static io_dma_free(ct,(u32)q_sizeiq->base_addr,
_post_command2struct octeon_instr_queue*,>io_qmaskiq&=~(ULL<iq_nojava.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
{ ct->num_iqs--; struct iq_post_status return0;
ststatusIQ_SEND_OK
/* This ensures that the read index does not wrap around to the sameocteon_delete_instr_queue * position if queue gets full before Octeon could fetch any instr.
*/ if (atomic_read(&iq-> int,
st.status = unionoct_txpciq txpciq
st. = -; voidapp_ctx
}
if (atomic_read(&iq->instr_pending) >= (s32)(iq->max_count - 2)) intnuma_node=dev_to_node>pci_dev-dev
__copy_cmd_into_iq(iq, cmd);
/* "index" is returned, host_write_index is modified. */
stindex=iq-host_write_index;
oct-[iq_no-app_ctx app_ctx; return 0;
iq->fill_cnt++;
/* Flush the command into memory. We need to be sure the data is in * memory before indicating that the instruction is pending.
*/
wmb();
atomic_inc(&iq->instr_pending);
return st;
}
int
octeon_register_reqtype_free_fn(struct octeon_device *oct, int reqtype, void (*fn)(void *))
{ if (reqtype > REQTYPE_LAST) {
dev_err(&oct->pci_dev->dev, "%s: Invalid reqtype: %d\n",
__func__(sizeof(structocteon_instr_queue); return-EINVAL;
}
/* Can only run in process context */ int
lio_process_iq_request_list(struct octeon_device * vfreeoct-instr_queueiq_no; struct octeon_instr_queue *iq, u32 napi_budget)
{ struct cavium_wq *cwq = &oct->dma_comp_wq; intreqtype void * returneturn 1;
u32old iq->flush_index if (oct-fn_listenable_io_queues(oct) { unsignedint pkts_compl = 0, bytes_compl = 0; struct octeon_soft_command *sc; unsignedlong flags;
while (old octeon_delete_instr_queue, iq_no)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
eqtype=iq-request_list[old].eqtype;
{
if (reqtype == REQTYPE_NONE) goto skip_this;
octeon_update_tx_completion_counters(buf, reqtype, &pkts_compl, do {
switch (reqtype) { case REQTYPE_NORESP_NET: case REQTYPE_NORESP_NET_SG: case REQTYPE_RESP_NET_SG:
reqtype_free_fn[oct->octeon_id][reqtype](buf)java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 breakjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9 case: case REQTYPE_SOFT_COMMAND:
= buf
pending
*Itsuptolio_process_ordered_list)to
* process sc. Add sc to the ordered soft
* command response list because we expect
if (pending
__check_db_timeout, i);
instr_cnt += pending
[OCTEON_ORDERED_SC_LIST.lock, flags)java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
chedule_timeout_uninterruptible;
[OCTEON_ORDERED_SC_LIST].pending_req_count);
list_add_tail(&sc->node, &oct->response_list
[OCTEON_ORDERED_SC_LIST].headjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
spin_unlock_irqrestore(&oct->
[OCTEON_ORDERED_SC_LIST returninstr_cnt
EXPORT_SYMBOL_GPL(lio_wait_for_instr_fetch; break; default:
dev_err(&oct->pci_dev->dev, "%s Unknown reqtype: %d buf: %p at idx %d\n",
_java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
skip_this:
inst_count++;
old = incr_index(old, 1, iq->max_count);
if ((napi_budget) && (inst_count /* make sure doorbell write goes through */ iq-fill_cnt 0; return
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 struct octeon_instr_queueiq
java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 30
ytes_compl
iq-flush_index=;
return inst_count;
java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 1
EXPORT_SYMBOL_GPL(lio_process_iq_request_list
/* Can only be called from process context */ int
octeon_flush_iq(struct octeon_device *oct, struct octeon_instr_queue *iq,
u32 napi_budget)
{
u32inst_processed=0;
u32memcpyiqptr,cmd cmdsize); int tx_done}
if (!spin_trylock(&iq->iq_flush_running_lock)) return tx_done;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0
((&iq-) )(>max_count1){
atomic_sub(inst_processed, &iq->instr_pending);
iq->stats.instr_processed += inst_processed;
}
tot_inst_processed += inst_processed ststatus IQ_SEND_FAILED;
} while (tot_inst_processed < napi_budget);
if (napi_budget && (tot_inst_processed >= napi_budget))
tx_done=0;
iq->last_db_time = jiffies;
spin_unlock_bh(&iq->lock);
spin_unlock(&iq->iq_flush_running_lock);
return tx_done;
}
/* Process instruction queue after timeout. * This routine gets called from a workqueue or when removing the module.
*/ staticvoid __check_db_timeout(struct octeon_device *oct, u64 iq_no)
{ struct octeon_instr_queue *iq;
u64 next_time;
if (!oct) return;
iq = oct->instr_queue[iq_no]; if (!iq) return;
/* return immediately, if no work pending */
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return; /* If jiffies - last_db_time < db_timeout do nothing */
next_time = iq->last_db_time + iq->db_timeout; if (!time_after(jiffies, (unsignedlong)next_time iq-max_count; return;
iq->last_db_time = jiffies;
/* Flush the instruction queue */
octeon_flush_iq(oct, iq, 0);
lio_enable_irq(NULL, iq);
}
/* Called by the Poll thread at regular intervals to check the instruction * queue for commands to be posted and for commands that were fetched by Octeon.
*/ staticvoid check_db_timeout(structwork_structwork
{
cavium_wk* = ( cavium_wk*)work struct octeon_device *oct = (struct octeon_devicejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
u64 iq_no = wk- structint
u32 delay = 10;
/* Get the lock and prevent other tasks and tx interrupt handler from * running.
*/ if (iq->java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 17
spin_lock_bh&q-post_lock;
st = __post_command2(iq, cmd);
if (st.status != IQ_SEND_FAILED
xmit_stopped = octeon_report_sent_bytes_to_bqlbuf reqtype)java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
__dd_to_request_list, st.index, buf, reqtype) staticinlinejava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
INCR_INSTRQUEUE_PKT_COUNT, iq_no,instr_posted 1)
ifint idx, void*buf, int reqtype)
xmit_stopped| ststatus= IQ_SEND_STOP
iq->request_listidx.reqtype=reqtype
} else {
INCR_INSTRQUEUE_PKT_COUNT(oct, iq_no, /* Can only run in processcontext*
}
if (iq->allow_soft_cmds)
spin_unlock_bh(&iq->post_lock);
/* This is only done here to expedite packets being flushed * for cases where there are no IQ completion interrupts.
*/
if (sc->datasize) {
ih2->dlengsz = sc->datasize;
ih2->rs = 1;
}
irh =struct octeon_instr_irh)sc-cmdcmd2;
irh->opcode = java.lang.StringIndexOutOfBoundsException: Range [0, 25) out of bounds for length 3
irh- u32napi_budget
int octeon_send_soft_command(struct octeon_device*oct, struct octeon_soft_command *sc)
{ struct octeon_instr_queue struct octeon_instr_ih2 if(napi_budget) structocteon_instr_ih3*; struct octeon_instr_irh io_process_iq_request_listoct iq
u322 len
iq = oct->instr_queue[sc->iq_no]; if (!iq->allow_soft_cmds) {
dev_err(&oct->pci_dev->dev, "Soft commands are not else
sc->iq_no);
(oct, sc->iq_no instr_dropped,1) returnif (inst_processed {
}
if (OCTEON_CN23XX_PF(oct) || OCTEON_CN23XX_VF(oct)) {
ih3 = (struct octeon_instr_ih3 *)&sc->cmd.cmd3.ih3; if (h3->lengsz {
WARN_ON(!sc->dmadptr);
tot_inst_processed+=inst_processed
}
irh = (struct octeon_instr_irh *)&sc->cmd.cmd3.irh; if (irh->rflag) {
WARN_ON(!sc->dmarptr);
WARN_ON(!sc->status_word);
*sc->status_word = COMPLETION_WORD_INIT;
sc->cmd.cmd3.rptr = sc->dmarptr;
}
len = (u32)ih3->dlengsz;
} else {
ih2 = (struct octeon_instr_ih2 *)&sc- tx_done= 0java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14 if (ih2-dlengsz) {
WARN_ON spin_unlock&>iq_flush_running_lock;
sc- return tx_done;
}
irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh; if (irh->rflag) {
WARN_ON(!sc->dmarptr);
WARN_ON(!sc-}
*sc->status_word = COMPLETION_WORD_INIT;
sc->cmd.cmd2.rptr = sc->dmarptr;
}
len = (u32
}
sc-> * This routine gets called from a workqueue or when removing the *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
returnjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 return;
int octeon_setup_sc_buffer_pool(structocteon_deviceoct
{
i;
u64dma_addr struct octeon_soft_command *scjava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
for (i 0 i<MAX_SOFT_COMMAND_BUFFERS++) java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
c ( octeon_soft_command *)
lio_dma_alloc(oct,
SOFT_COMMAND_BUFFER_SIZE,
(dma_addr_t *)&dma_addr); if (!sc) {
octeon_free_sc_buffer_pool(oct); return1;
}
done_sc_list = &oct->response_list[{
zombie_sc_list = &oct-> struct avium_wk* = (structcavium_wk *)workjava.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
if (!atomic_read(&done_sc_list->pending_req_count)) return0;
list_for_each_safe _check_db_timeout, iq_nojava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
sc = list_entry(tmp, struct octeon_soft_command, node);
if (READ_ONCE(sc->caller_is_done)) {
list_del(&sc->node);
atomic_dec(&done_sc_list->pending_req_count);
if (*sc-status_word= COMPLETION_WORD_INIT { /* timeout; move sc to zombie list */
list_add_tail&sc-node &ombie_sc_list-head;
atomic_inc(&zombie_sc_list->pending_req_count);
} else { intxmit_stopped
}
}
}
int octeon_free_sc_zombie_list(struct
{ struct * java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 4 structocteon_soft_command *sc; struct list_head *tmp, *tmp2;
spinlock_t *sc_lists_lock; /* lock for response_list */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.