You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The UDP offload conflict is dealt with by simply taking what is in net-next where we have removed all of the UFO handling code entirely. The TCP conflict was a case of local variables in a function being removed from both net and net-next. In netvsc we had an assignment right next to where a missing set of u64 stats sync object inits were added. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
+2
-2
@@ -1161,7 +1161,7 @@ M: Brendan Higgins <brendanhiggins@google.com>
|
||||
R: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
R: Joel Stanley <joel@jms.id.au>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
L: openbmc@lists.ozlabs.org
|
||||
L: openbmc@lists.ozlabs.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: drivers/irqchip/irq-aspeed-i2c-ic.c
|
||||
F: drivers/i2c/busses/i2c-aspeed.c
|
||||
@@ -5835,7 +5835,7 @@ F: drivers/staging/greybus/spi.c
|
||||
F: drivers/staging/greybus/spilib.c
|
||||
F: drivers/staging/greybus/spilib.h
|
||||
|
||||
GREYBUS LOOBACK/TIME PROTOCOLS DRIVERS
|
||||
GREYBUS LOOPBACK/TIME PROTOCOLS DRIVERS
|
||||
M: Bryan O'Donoghue <pure.logic@nexus-software.ie>
|
||||
S: Maintained
|
||||
F: drivers/staging/greybus/loopback.c
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1253,7 +1253,8 @@ static int bpf_jit_prog(struct bpf_jit *jit, struct bpf_prog *fp)
|
||||
insn_count = bpf_jit_insn(jit, fp, i);
|
||||
if (insn_count < 0)
|
||||
return -1;
|
||||
jit->addrs[i + 1] = jit->prg; /* Next instruction address */
|
||||
/* Next instruction address */
|
||||
jit->addrs[i + insn_count] = jit->prg;
|
||||
}
|
||||
bpf_jit_epilogue(jit);
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
generic-y += bug.h
|
||||
generic-y += clkdev.h
|
||||
generic-y += device.h
|
||||
generic-y += div64.h
|
||||
generic-y += dma-contiguous.h
|
||||
generic-y += emergency-restart.h
|
||||
@@ -17,6 +18,7 @@ generic-y += local.h
|
||||
generic-y += local64.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += mm-arch-hooks.h
|
||||
generic-y += param.h
|
||||
generic-y += percpu.h
|
||||
generic-y += preempt.h
|
||||
generic-y += rwsem.h
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/*
|
||||
* Arch specific extensions to struct device
|
||||
*
|
||||
* This file is released under the GPLv2
|
||||
*/
|
||||
#ifndef _ASM_XTENSA_DEVICE_H
|
||||
#define _ASM_XTENSA_DEVICE_H
|
||||
|
||||
struct dev_archdata {
|
||||
};
|
||||
|
||||
struct pdev_archdata {
|
||||
};
|
||||
|
||||
#endif /* _ASM_XTENSA_DEVICE_H */
|
||||
@@ -1,18 +0,0 @@
|
||||
/*
|
||||
* include/asm-xtensa/param.h
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2001 - 2005 Tensilica Inc.
|
||||
*/
|
||||
#ifndef _XTENSA_PARAM_H
|
||||
#define _XTENSA_PARAM_H
|
||||
|
||||
#include <uapi/asm/param.h>
|
||||
|
||||
# define HZ CONFIG_HZ /* internal timer frequency */
|
||||
# define USER_HZ 100 /* for user interfaces in "ticks" */
|
||||
# define CLOCKS_PER_SEC (USER_HZ) /* frequnzy at which times() counts */
|
||||
#endif /* _XTENSA_PARAM_H */
|
||||
@@ -94,13 +94,11 @@ unsigned long __sync_fetch_and_or_4(unsigned long *p, unsigned long v)
|
||||
}
|
||||
EXPORT_SYMBOL(__sync_fetch_and_or_4);
|
||||
|
||||
#ifdef CONFIG_NET
|
||||
/*
|
||||
* Networking support
|
||||
*/
|
||||
EXPORT_SYMBOL(csum_partial);
|
||||
EXPORT_SYMBOL(csum_partial_copy_generic);
|
||||
#endif /* CONFIG_NET */
|
||||
|
||||
/*
|
||||
* Architecture-specific symbols
|
||||
|
||||
@@ -103,6 +103,7 @@ void clear_user_highpage(struct page *page, unsigned long vaddr)
|
||||
clear_page_alias(kvaddr, paddr);
|
||||
preempt_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(clear_user_highpage);
|
||||
|
||||
void copy_user_highpage(struct page *dst, struct page *src,
|
||||
unsigned long vaddr, struct vm_area_struct *vma)
|
||||
@@ -119,10 +120,7 @@ void copy_user_highpage(struct page *dst, struct page *src,
|
||||
copy_page_alias(dst_vaddr, src_vaddr, dst_paddr, src_paddr);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
#endif /* DCACHE_WAY_SIZE > PAGE_SIZE */
|
||||
|
||||
#if (DCACHE_WAY_SIZE > PAGE_SIZE) && XCHAL_DCACHE_IS_WRITEBACK
|
||||
EXPORT_SYMBOL(copy_user_highpage);
|
||||
|
||||
/*
|
||||
* Any time the kernel writes to a user page cache page, or it is about to
|
||||
@@ -176,7 +174,7 @@ void flush_dcache_page(struct page *page)
|
||||
|
||||
/* There shouldn't be an entry in the cache for this page anymore. */
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(flush_dcache_page);
|
||||
|
||||
/*
|
||||
* For now, flush the whole cache. FIXME??
|
||||
@@ -188,6 +186,7 @@ void local_flush_cache_range(struct vm_area_struct *vma,
|
||||
__flush_invalidate_dcache_all();
|
||||
__invalidate_icache_all();
|
||||
}
|
||||
EXPORT_SYMBOL(local_flush_cache_range);
|
||||
|
||||
/*
|
||||
* Remove any entry in the cache for this page.
|
||||
@@ -207,8 +206,9 @@ void local_flush_cache_page(struct vm_area_struct *vma, unsigned long address,
|
||||
__flush_invalidate_dcache_page_alias(virt, phys);
|
||||
__invalidate_icache_page_alias(virt, phys);
|
||||
}
|
||||
EXPORT_SYMBOL(local_flush_cache_page);
|
||||
|
||||
#endif
|
||||
#endif /* DCACHE_WAY_SIZE > PAGE_SIZE */
|
||||
|
||||
void
|
||||
update_mmu_cache(struct vm_area_struct * vma, unsigned long addr, pte_t *ptep)
|
||||
@@ -225,7 +225,7 @@ update_mmu_cache(struct vm_area_struct * vma, unsigned long addr, pte_t *ptep)
|
||||
|
||||
flush_tlb_page(vma, addr);
|
||||
|
||||
#if (DCACHE_WAY_SIZE > PAGE_SIZE) && XCHAL_DCACHE_IS_WRITEBACK
|
||||
#if (DCACHE_WAY_SIZE > PAGE_SIZE)
|
||||
|
||||
if (!PageReserved(page) && test_bit(PG_arch_1, &page->flags)) {
|
||||
unsigned long phys = page_to_phys(page);
|
||||
@@ -256,7 +256,7 @@ update_mmu_cache(struct vm_area_struct * vma, unsigned long addr, pte_t *ptep)
|
||||
* flush_dcache_page() on the page.
|
||||
*/
|
||||
|
||||
#if (DCACHE_WAY_SIZE > PAGE_SIZE) && XCHAL_DCACHE_IS_WRITEBACK
|
||||
#if (DCACHE_WAY_SIZE > PAGE_SIZE)
|
||||
|
||||
void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
||||
unsigned long vaddr, void *dst, const void *src,
|
||||
|
||||
+17
-5
@@ -71,17 +71,29 @@ struct bfq_service_tree {
|
||||
*
|
||||
* bfq_sched_data is the basic scheduler queue. It supports three
|
||||
* ioprio_classes, and can be used either as a toplevel queue or as an
|
||||
* intermediate queue on a hierarchical setup. @next_in_service
|
||||
* points to the active entity of the sched_data service trees that
|
||||
* will be scheduled next. It is used to reduce the number of steps
|
||||
* needed for each hierarchical-schedule update.
|
||||
* intermediate queue in a hierarchical setup.
|
||||
*
|
||||
* The supported ioprio_classes are the same as in CFQ, in descending
|
||||
* priority order, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE.
|
||||
* Requests from higher priority queues are served before all the
|
||||
* requests from lower priority queues; among requests of the same
|
||||
* queue requests are served according to B-WF2Q+.
|
||||
* All the fields are protected by the queue lock of the containing bfqd.
|
||||
*
|
||||
* The schedule is implemented by the service trees, plus the field
|
||||
* @next_in_service, which points to the entity on the active trees
|
||||
* that will be served next, if 1) no changes in the schedule occurs
|
||||
* before the current in-service entity is expired, 2) the in-service
|
||||
* queue becomes idle when it expires, and 3) if the entity pointed by
|
||||
* in_service_entity is not a queue, then the in-service child entity
|
||||
* of the entity pointed by in_service_entity becomes idle on
|
||||
* expiration. This peculiar definition allows for the following
|
||||
* optimization, not yet exploited: while a given entity is still in
|
||||
* service, we already know which is the best candidate for next
|
||||
* service among the other active entitities in the same parent
|
||||
* entity. We can then quickly compare the timestamps of the
|
||||
* in-service entity with those of such best candidate.
|
||||
*
|
||||
* All fields are protected by the lock of the containing bfqd.
|
||||
*/
|
||||
struct bfq_sched_data {
|
||||
/* entity in service */
|
||||
|
||||
+81
-65
@@ -188,21 +188,23 @@ static bool bfq_update_parent_budget(struct bfq_entity *next_in_service)
|
||||
|
||||
/*
|
||||
* This function tells whether entity stops being a candidate for next
|
||||
* service, according to the following logic.
|
||||
* service, according to the restrictive definition of the field
|
||||
* next_in_service. In particular, this function is invoked for an
|
||||
* entity that is about to be set in service.
|
||||
*
|
||||
* This function is invoked for an entity that is about to be set in
|
||||
* service. If such an entity is a queue, then the entity is no longer
|
||||
* a candidate for next service (i.e, a candidate entity to serve
|
||||
* after the in-service entity is expired). The function then returns
|
||||
* true.
|
||||
* If entity is a queue, then the entity is no longer a candidate for
|
||||
* next service according to the that definition, because entity is
|
||||
* about to become the in-service queue. This function then returns
|
||||
* true if entity is a queue.
|
||||
*
|
||||
* In contrast, the entity could stil be a candidate for next service
|
||||
* if it is not a queue, and has more than one child. In fact, even if
|
||||
* one of its children is about to be set in service, other children
|
||||
* may still be the next to serve. As a consequence, a non-queue
|
||||
* entity is not a candidate for next-service only if it has only one
|
||||
* child. And only if this condition holds, then the function returns
|
||||
* true for a non-queue entity.
|
||||
* In contrast, entity could still be a candidate for next service if
|
||||
* it is not a queue, and has more than one active child. In fact,
|
||||
* even if one of its children is about to be set in service, other
|
||||
* active children may still be the next to serve, for the parent
|
||||
* entity, even according to the above definition. As a consequence, a
|
||||
* non-queue entity is not a candidate for next-service only if it has
|
||||
* only one active child. And only if this condition holds, then this
|
||||
* function returns true for a non-queue entity.
|
||||
*/
|
||||
static bool bfq_no_longer_next_in_service(struct bfq_entity *entity)
|
||||
{
|
||||
@@ -213,6 +215,18 @@ static bool bfq_no_longer_next_in_service(struct bfq_entity *entity)
|
||||
|
||||
bfqg = container_of(entity, struct bfq_group, entity);
|
||||
|
||||
/*
|
||||
* The field active_entities does not always contain the
|
||||
* actual number of active children entities: it happens to
|
||||
* not account for the in-service entity in case the latter is
|
||||
* removed from its active tree (which may get done after
|
||||
* invoking the function bfq_no_longer_next_in_service in
|
||||
* bfq_get_next_queue). Fortunately, here, i.e., while
|
||||
* bfq_no_longer_next_in_service is not yet completed in
|
||||
* bfq_get_next_queue, bfq_active_extract has not yet been
|
||||
* invoked, and thus active_entities still coincides with the
|
||||
* actual number of active entities.
|
||||
*/
|
||||
if (bfqg->active_entities == 1)
|
||||
return true;
|
||||
|
||||
@@ -954,7 +968,7 @@ static void bfq_update_fin_time_enqueue(struct bfq_entity *entity,
|
||||
* one of its children receives a new request.
|
||||
*
|
||||
* Basically, this function updates the timestamps of entity and
|
||||
* inserts entity into its active tree, ater possible extracting it
|
||||
* inserts entity into its active tree, ater possibly extracting it
|
||||
* from its idle tree.
|
||||
*/
|
||||
static void __bfq_activate_entity(struct bfq_entity *entity,
|
||||
@@ -1048,7 +1062,7 @@ static void __bfq_requeue_entity(struct bfq_entity *entity)
|
||||
entity->start = entity->finish;
|
||||
/*
|
||||
* In addition, if the entity had more than one child
|
||||
* when set in service, then was not extracted from
|
||||
* when set in service, then it was not extracted from
|
||||
* the active tree. This implies that the position of
|
||||
* the entity in the active tree may need to be
|
||||
* changed now, because we have just updated the start
|
||||
@@ -1056,9 +1070,8 @@ static void __bfq_requeue_entity(struct bfq_entity *entity)
|
||||
* time in a moment (the requeueing is then, more
|
||||
* precisely, a repositioning in this case). To
|
||||
* implement this repositioning, we: 1) dequeue the
|
||||
* entity here, 2) update the finish time and
|
||||
* requeue the entity according to the new
|
||||
* timestamps below.
|
||||
* entity here, 2) update the finish time and requeue
|
||||
* the entity according to the new timestamps below.
|
||||
*/
|
||||
if (entity->tree)
|
||||
bfq_active_extract(st, entity);
|
||||
@@ -1105,9 +1118,10 @@ static void __bfq_activate_requeue_entity(struct bfq_entity *entity,
|
||||
|
||||
|
||||
/**
|
||||
* bfq_activate_entity - activate or requeue an entity representing a bfq_queue,
|
||||
* and activate, requeue or reposition all ancestors
|
||||
* for which such an update becomes necessary.
|
||||
* bfq_activate_requeue_entity - activate or requeue an entity representing a
|
||||
* bfq_queue, and activate, requeue or reposition
|
||||
* all ancestors for which such an update becomes
|
||||
* necessary.
|
||||
* @entity: the entity to activate.
|
||||
* @non_blocking_wait_rq: true if this entity was waiting for a request
|
||||
* @requeue: true if this is a requeue, which implies that bfqq is
|
||||
@@ -1135,9 +1149,9 @@ static void bfq_activate_requeue_entity(struct bfq_entity *entity,
|
||||
* @ins_into_idle_tree: if false, the entity will not be put into the
|
||||
* idle tree.
|
||||
*
|
||||
* Deactivates an entity, independently from its previous state. Must
|
||||
* Deactivates an entity, independently of its previous state. Must
|
||||
* be invoked only if entity is on a service tree. Extracts the entity
|
||||
* from that tree, and if necessary and allowed, puts it on the idle
|
||||
* from that tree, and if necessary and allowed, puts it into the idle
|
||||
* tree.
|
||||
*/
|
||||
bool __bfq_deactivate_entity(struct bfq_entity *entity, bool ins_into_idle_tree)
|
||||
@@ -1158,8 +1172,10 @@ bool __bfq_deactivate_entity(struct bfq_entity *entity, bool ins_into_idle_tree)
|
||||
st = bfq_entity_service_tree(entity);
|
||||
is_in_service = entity == sd->in_service_entity;
|
||||
|
||||
if (is_in_service)
|
||||
if (is_in_service) {
|
||||
bfq_calc_finish(entity, entity->service);
|
||||
sd->in_service_entity = NULL;
|
||||
}
|
||||
|
||||
if (entity->tree == &st->active)
|
||||
bfq_active_extract(st, entity);
|
||||
@@ -1177,7 +1193,7 @@ bool __bfq_deactivate_entity(struct bfq_entity *entity, bool ins_into_idle_tree)
|
||||
/**
|
||||
* bfq_deactivate_entity - deactivate an entity representing a bfq_queue.
|
||||
* @entity: the entity to deactivate.
|
||||
* @ins_into_idle_tree: true if the entity can be put on the idle tree
|
||||
* @ins_into_idle_tree: true if the entity can be put into the idle tree
|
||||
*/
|
||||
static void bfq_deactivate_entity(struct bfq_entity *entity,
|
||||
bool ins_into_idle_tree,
|
||||
@@ -1208,16 +1224,29 @@ static void bfq_deactivate_entity(struct bfq_entity *entity,
|
||||
*/
|
||||
bfq_update_next_in_service(sd, NULL);
|
||||
|
||||
if (sd->next_in_service)
|
||||
if (sd->next_in_service || sd->in_service_entity) {
|
||||
/*
|
||||
* The parent entity is still backlogged,
|
||||
* because next_in_service is not NULL. So, no
|
||||
* further upwards deactivation must be
|
||||
* performed. Yet, next_in_service has
|
||||
* changed. Then the schedule does need to be
|
||||
* updated upwards.
|
||||
* The parent entity is still active, because
|
||||
* either next_in_service or in_service_entity
|
||||
* is not NULL. So, no further upwards
|
||||
* deactivation must be performed. Yet,
|
||||
* next_in_service has changed. Then the
|
||||
* schedule does need to be updated upwards.
|
||||
*
|
||||
* NOTE If in_service_entity is not NULL, then
|
||||
* next_in_service may happen to be NULL,
|
||||
* although the parent entity is evidently
|
||||
* active. This happens if 1) the entity
|
||||
* pointed by in_service_entity is the only
|
||||
* active entity in the parent entity, and 2)
|
||||
* according to the definition of
|
||||
* next_in_service, the in_service_entity
|
||||
* cannot be considered as
|
||||
* next_in_service. See the comments on the
|
||||
* definition of next_in_service for details.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get here, then the parent is no more
|
||||
@@ -1494,47 +1523,34 @@ struct bfq_queue *bfq_get_next_queue(struct bfq_data *bfqd)
|
||||
|
||||
/*
|
||||
* If entity is no longer a candidate for next
|
||||
* service, then we extract it from its active tree,
|
||||
* for the following reason. To further boost the
|
||||
* throughput in some special case, BFQ needs to know
|
||||
* which is the next candidate entity to serve, while
|
||||
* there is already an entity in service. In this
|
||||
* respect, to make it easy to compute/update the next
|
||||
* candidate entity to serve after the current
|
||||
* candidate has been set in service, there is a case
|
||||
* where it is necessary to extract the current
|
||||
* candidate from its service tree. Such a case is
|
||||
* when the entity just set in service cannot be also
|
||||
* a candidate for next service. Details about when
|
||||
* this conditions holds are reported in the comments
|
||||
* on the function bfq_no_longer_next_in_service()
|
||||
* invoked below.
|
||||
* service, then it must be extracted from its active
|
||||
* tree, so as to make sure that it won't be
|
||||
* considered when computing next_in_service. See the
|
||||
* comments on the function
|
||||
* bfq_no_longer_next_in_service() for details.
|
||||
*/
|
||||
if (bfq_no_longer_next_in_service(entity))
|
||||
bfq_active_extract(bfq_entity_service_tree(entity),
|
||||
entity);
|
||||
|
||||
/*
|
||||
* For the same reason why we may have just extracted
|
||||
* entity from its active tree, we may need to update
|
||||
* next_in_service for the sched_data of entity too,
|
||||
* regardless of whether entity has been extracted.
|
||||
* In fact, even if entity has not been extracted, a
|
||||
* descendant entity may get extracted. Such an event
|
||||
* would cause a change in next_in_service for the
|
||||
* level of the descendant entity, and thus possibly
|
||||
* back to upper levels.
|
||||
* Even if entity is not to be extracted according to
|
||||
* the above check, a descendant entity may get
|
||||
* extracted in one of the next iterations of this
|
||||
* loop. Such an event could cause a change in
|
||||
* next_in_service for the level of the descendant
|
||||
* entity, and thus possibly back to this level.
|
||||
*
|
||||
* We cannot perform the resulting needed update
|
||||
* before the end of this loop, because, to know which
|
||||
* is the correct next-to-serve candidate entity for
|
||||
* each level, we need first to find the leaf entity
|
||||
* to set in service. In fact, only after we know
|
||||
* which is the next-to-serve leaf entity, we can
|
||||
* discover whether the parent entity of the leaf
|
||||
* entity becomes the next-to-serve, and so on.
|
||||
* However, we cannot perform the resulting needed
|
||||
* update of next_in_service for this level before the
|
||||
* end of the whole loop, because, to know which is
|
||||
* the correct next-to-serve candidate entity for each
|
||||
* level, we need first to find the leaf entity to set
|
||||
* in service. In fact, only after we know which is
|
||||
* the next-to-serve leaf entity, we can discover
|
||||
* whether the parent entity of the leaf entity
|
||||
* becomes the next-to-serve, and so on.
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
bfqq = bfq_entity_to_bfqq(entity);
|
||||
|
||||
+11
-6
@@ -301,11 +301,12 @@ static struct request *blk_mq_get_request(struct request_queue *q,
|
||||
struct elevator_queue *e = q->elevator;
|
||||
struct request *rq;
|
||||
unsigned int tag;
|
||||
struct blk_mq_ctx *local_ctx = NULL;
|
||||
|
||||
blk_queue_enter_live(q);
|
||||
data->q = q;
|
||||
if (likely(!data->ctx))
|
||||
data->ctx = blk_mq_get_ctx(q);
|
||||
data->ctx = local_ctx = blk_mq_get_ctx(q);
|
||||
if (likely(!data->hctx))
|
||||
data->hctx = blk_mq_map_queue(q, data->ctx->cpu);
|
||||
if (op & REQ_NOWAIT)
|
||||
@@ -324,6 +325,10 @@ static struct request *blk_mq_get_request(struct request_queue *q,
|
||||
|
||||
tag = blk_mq_get_tag(data);
|
||||
if (tag == BLK_MQ_TAG_FAIL) {
|
||||
if (local_ctx) {
|
||||
blk_mq_put_ctx(local_ctx);
|
||||
data->ctx = NULL;
|
||||
}
|
||||
blk_queue_exit(q);
|
||||
return NULL;
|
||||
}
|
||||
@@ -356,12 +361,12 @@ struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,
|
||||
|
||||
rq = blk_mq_get_request(q, NULL, op, &alloc_data);
|
||||
|
||||
blk_mq_put_ctx(alloc_data.ctx);
|
||||
blk_queue_exit(q);
|
||||
|
||||
if (!rq)
|
||||
return ERR_PTR(-EWOULDBLOCK);
|
||||
|
||||
blk_mq_put_ctx(alloc_data.ctx);
|
||||
blk_queue_exit(q);
|
||||
|
||||
rq->__data_len = 0;
|
||||
rq->__sector = (sector_t) -1;
|
||||
rq->bio = rq->biotail = NULL;
|
||||
@@ -407,11 +412,11 @@ struct request *blk_mq_alloc_request_hctx(struct request_queue *q,
|
||||
|
||||
rq = blk_mq_get_request(q, NULL, op, &alloc_data);
|
||||
|
||||
blk_queue_exit(q);
|
||||
|
||||
if (!rq)
|
||||
return ERR_PTR(-EWOULDBLOCK);
|
||||
|
||||
blk_queue_exit(q);
|
||||
|
||||
return rq;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blk_mq_alloc_request_hctx);
|
||||
|
||||
@@ -1492,7 +1492,7 @@ static void _warn_unseeded_randomness(const char *func_name, void *caller,
|
||||
#ifndef CONFIG_WARN_ALL_UNSEEDED_RANDOM
|
||||
print_once = true;
|
||||
#endif
|
||||
pr_notice("random: %s called from %pF with crng_init=%d\n",
|
||||
pr_notice("random: %s called from %pS with crng_init=%d\n",
|
||||
func_name, caller, crng_init);
|
||||
}
|
||||
|
||||
|
||||
@@ -883,10 +883,7 @@ static int safexcel_hmac_sha1_setkey(struct crypto_ahash *tfm, const u8 *key,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
memcpy(ctx->ipad, &istate.state, SHA1_DIGEST_SIZE);
|
||||
memcpy(ctx->opad, &ostate.state, SHA1_DIGEST_SIZE);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(istate.state); i++) {
|
||||
for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++) {
|
||||
if (ctx->ipad[i] != le32_to_cpu(istate.state[i]) ||
|
||||
ctx->opad[i] != le32_to_cpu(ostate.state[i])) {
|
||||
ctx->base.needs_inv = true;
|
||||
@@ -894,6 +891,9 @@ static int safexcel_hmac_sha1_setkey(struct crypto_ahash *tfm, const u8 *key,
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(ctx->ipad, &istate.state, SHA1_DIGEST_SIZE);
|
||||
memcpy(ctx->opad, &ostate.state, SHA1_DIGEST_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -983,7 +983,7 @@ config I2C_UNIPHIER_F
|
||||
|
||||
config I2C_VERSATILE
|
||||
tristate "ARM Versatile/Realview I2C bus support"
|
||||
depends on ARCH_VERSATILE || ARCH_REALVIEW || ARCH_VEXPRESS || COMPILE_TEST
|
||||
depends on ARCH_MPS2 || ARCH_VERSATILE || ARCH_REALVIEW || ARCH_VEXPRESS || COMPILE_TEST
|
||||
select I2C_ALGOBIT
|
||||
help
|
||||
Say yes if you want to support the I2C serial bus on ARMs Versatile
|
||||
|
||||
@@ -298,6 +298,9 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
acpi_speed = i2c_acpi_find_bus_speed(&pdev->dev);
|
||||
/* Some broken DSTDs use 1MiHz instead of 1MHz */
|
||||
if (acpi_speed == 1048576)
|
||||
acpi_speed = 1000000;
|
||||
/*
|
||||
* Find bus speed from the "clock-frequency" device property, ACPI
|
||||
* or by using fast mode if neither is set.
|
||||
@@ -319,7 +322,8 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
|
||||
if (dev->clk_freq != 100000 && dev->clk_freq != 400000
|
||||
&& dev->clk_freq != 1000000 && dev->clk_freq != 3400000) {
|
||||
dev_err(&pdev->dev,
|
||||
"Only 100kHz, 400kHz, 1MHz and 3.4MHz supported");
|
||||
"%d Hz is unsupported, only 100kHz, 400kHz, 1MHz and 3.4MHz are supported\n",
|
||||
dev->clk_freq);
|
||||
ret = -EINVAL;
|
||||
goto exit_reset;
|
||||
}
|
||||
|
||||
@@ -230,6 +230,16 @@ void i2c_acpi_register_devices(struct i2c_adapter *adap)
|
||||
dev_warn(&adap->dev, "failed to enumerate I2C slaves\n");
|
||||
}
|
||||
|
||||
const struct acpi_device_id *
|
||||
i2c_acpi_match_device(const struct acpi_device_id *matches,
|
||||
struct i2c_client *client)
|
||||
{
|
||||
if (!(client && matches))
|
||||
return NULL;
|
||||
|
||||
return acpi_match_device(matches, &client->dev);
|
||||
}
|
||||
|
||||
static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level,
|
||||
void *data, void **return_value)
|
||||
{
|
||||
@@ -289,7 +299,7 @@ u32 i2c_acpi_find_bus_speed(struct device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i2c_acpi_find_bus_speed);
|
||||
|
||||
static int i2c_acpi_match_adapter(struct device *dev, void *data)
|
||||
static int i2c_acpi_find_match_adapter(struct device *dev, void *data)
|
||||
{
|
||||
struct i2c_adapter *adapter = i2c_verify_adapter(dev);
|
||||
|
||||
@@ -299,7 +309,7 @@ static int i2c_acpi_match_adapter(struct device *dev, void *data)
|
||||
return ACPI_HANDLE(dev) == (acpi_handle)data;
|
||||
}
|
||||
|
||||
static int i2c_acpi_match_device(struct device *dev, void *data)
|
||||
static int i2c_acpi_find_match_device(struct device *dev, void *data)
|
||||
{
|
||||
return ACPI_COMPANION(dev) == data;
|
||||
}
|
||||
@@ -309,7 +319,7 @@ static struct i2c_adapter *i2c_acpi_find_adapter_by_handle(acpi_handle handle)
|
||||
struct device *dev;
|
||||
|
||||
dev = bus_find_device(&i2c_bus_type, NULL, handle,
|
||||
i2c_acpi_match_adapter);
|
||||
i2c_acpi_find_match_adapter);
|
||||
return dev ? i2c_verify_adapter(dev) : NULL;
|
||||
}
|
||||
|
||||
@@ -317,7 +327,8 @@ static struct i2c_client *i2c_acpi_find_client_by_adev(struct acpi_device *adev)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
dev = bus_find_device(&i2c_bus_type, NULL, adev, i2c_acpi_match_device);
|
||||
dev = bus_find_device(&i2c_bus_type, NULL, adev,
|
||||
i2c_acpi_find_match_device);
|
||||
return dev ? i2c_verify_client(dev) : NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -357,6 +357,7 @@ static int i2c_device_probe(struct device *dev)
|
||||
* Tree match table entry is supplied for the probing device.
|
||||
*/
|
||||
if (!driver->id_table &&
|
||||
!i2c_acpi_match_device(dev->driver->acpi_match_table, client) &&
|
||||
!i2c_of_match_device(dev->driver->of_match_table, client))
|
||||
return -ENODEV;
|
||||
|
||||
|
||||
@@ -31,9 +31,18 @@ int i2c_check_addr_validity(unsigned addr, unsigned short flags);
|
||||
int i2c_check_7bit_addr_validity_strict(unsigned short addr);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
const struct acpi_device_id *
|
||||
i2c_acpi_match_device(const struct acpi_device_id *matches,
|
||||
struct i2c_client *client);
|
||||
void i2c_acpi_register_devices(struct i2c_adapter *adap);
|
||||
#else /* CONFIG_ACPI */
|
||||
static inline void i2c_acpi_register_devices(struct i2c_adapter *adap) { }
|
||||
static inline const struct acpi_device_id *
|
||||
i2c_acpi_match_device(const struct acpi_device_id *matches,
|
||||
struct i2c_client *client)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_ACPI */
|
||||
extern struct notifier_block i2c_acpi_notifier;
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ config I2C_MUX_PINCTRL
|
||||
different sets of pins at run-time.
|
||||
|
||||
This driver can also be built as a module. If so, the module will be
|
||||
called pinctrl-i2cmux.
|
||||
called i2c-mux-pinctrl.
|
||||
|
||||
config I2C_MUX_REG
|
||||
tristate "Register-based I2C multiplexer"
|
||||
|
||||
@@ -61,6 +61,7 @@ struct addr_req {
|
||||
void (*callback)(int status, struct sockaddr *src_addr,
|
||||
struct rdma_dev_addr *addr, void *context);
|
||||
unsigned long timeout;
|
||||
struct delayed_work work;
|
||||
int status;
|
||||
u32 seq;
|
||||
};
|
||||
@@ -295,7 +296,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
|
||||
}
|
||||
EXPORT_SYMBOL(rdma_translate_ip);
|
||||
|
||||
static void set_timeout(unsigned long time)
|
||||
static void set_timeout(struct delayed_work *delayed_work, unsigned long time)
|
||||
{
|
||||
unsigned long delay;
|
||||
|
||||
@@ -303,7 +304,7 @@ static void set_timeout(unsigned long time)
|
||||
if ((long)delay < 0)
|
||||
delay = 0;
|
||||
|
||||
mod_delayed_work(addr_wq, &work, delay);
|
||||
mod_delayed_work(addr_wq, delayed_work, delay);
|
||||
}
|
||||
|
||||
static void queue_req(struct addr_req *req)
|
||||
@@ -318,8 +319,7 @@ static void queue_req(struct addr_req *req)
|
||||
|
||||
list_add(&req->list, &temp_req->list);
|
||||
|
||||
if (req_list.next == &req->list)
|
||||
set_timeout(req->timeout);
|
||||
set_timeout(&req->work, req->timeout);
|
||||
mutex_unlock(&lock);
|
||||
}
|
||||
|
||||
@@ -574,6 +574,37 @@ static int addr_resolve(struct sockaddr *src_in,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void process_one_req(struct work_struct *_work)
|
||||
{
|
||||
struct addr_req *req;
|
||||
struct sockaddr *src_in, *dst_in;
|
||||
|
||||
mutex_lock(&lock);
|
||||
req = container_of(_work, struct addr_req, work.work);
|
||||
|
||||
if (req->status == -ENODATA) {
|
||||
src_in = (struct sockaddr *)&req->src_addr;
|
||||
dst_in = (struct sockaddr *)&req->dst_addr;
|
||||
req->status = addr_resolve(src_in, dst_in, req->addr,
|
||||
true, req->seq);
|
||||
if (req->status && time_after_eq(jiffies, req->timeout)) {
|
||||
req->status = -ETIMEDOUT;
|
||||
} else if (req->status == -ENODATA) {
|
||||
/* requeue the work for retrying again */
|
||||
set_timeout(&req->work, req->timeout);
|
||||
mutex_unlock(&lock);
|
||||
return;
|
||||
}
|
||||
}
|
||||
list_del(&req->list);
|
||||
mutex_unlock(&lock);
|
||||
|
||||
req->callback(req->status, (struct sockaddr *)&req->src_addr,
|
||||
req->addr, req->context);
|
||||
put_client(req->client);
|
||||
kfree(req);
|
||||
}
|
||||
|
||||
static void process_req(struct work_struct *work)
|
||||
{
|
||||
struct addr_req *req, *temp_req;
|
||||
@@ -591,20 +622,23 @@ static void process_req(struct work_struct *work)
|
||||
true, req->seq);
|
||||
if (req->status && time_after_eq(jiffies, req->timeout))
|
||||
req->status = -ETIMEDOUT;
|
||||
else if (req->status == -ENODATA)
|
||||
else if (req->status == -ENODATA) {
|
||||
set_timeout(&req->work, req->timeout);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
list_move_tail(&req->list, &done_list);
|
||||
}
|
||||
|
||||
if (!list_empty(&req_list)) {
|
||||
req = list_entry(req_list.next, struct addr_req, list);
|
||||
set_timeout(req->timeout);
|
||||
}
|
||||
mutex_unlock(&lock);
|
||||
|
||||
list_for_each_entry_safe(req, temp_req, &done_list, list) {
|
||||
list_del(&req->list);
|
||||
/* It is safe to cancel other work items from this work item
|
||||
* because at a time there can be only one work item running
|
||||
* with this single threaded work queue.
|
||||
*/
|
||||
cancel_delayed_work(&req->work);
|
||||
req->callback(req->status, (struct sockaddr *) &req->src_addr,
|
||||
req->addr, req->context);
|
||||
put_client(req->client);
|
||||
@@ -647,6 +681,7 @@ int rdma_resolve_ip(struct rdma_addr_client *client,
|
||||
req->context = context;
|
||||
req->client = client;
|
||||
atomic_inc(&client->refcount);
|
||||
INIT_DELAYED_WORK(&req->work, process_one_req);
|
||||
req->seq = (u32)atomic_inc_return(&ib_nl_addr_request_seq);
|
||||
|
||||
req->status = addr_resolve(src_in, dst_in, addr, true, req->seq);
|
||||
@@ -701,7 +736,7 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr)
|
||||
req->status = -ECANCELED;
|
||||
req->timeout = jiffies;
|
||||
list_move(&req->list, &req_list);
|
||||
set_timeout(req->timeout);
|
||||
set_timeout(&req->work, req->timeout);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -807,9 +842,8 @@ static int netevent_callback(struct notifier_block *self, unsigned long event,
|
||||
if (event == NETEVENT_NEIGH_UPDATE) {
|
||||
struct neighbour *neigh = ctx;
|
||||
|
||||
if (neigh->nud_state & NUD_VALID) {
|
||||
set_timeout(jiffies);
|
||||
}
|
||||
if (neigh->nud_state & NUD_VALID)
|
||||
set_timeout(&work, jiffies);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -820,7 +854,7 @@ static struct notifier_block nb = {
|
||||
|
||||
int addr_init(void)
|
||||
{
|
||||
addr_wq = alloc_workqueue("ib_addr", WQ_MEM_RECLAIM, 0);
|
||||
addr_wq = alloc_ordered_workqueue("ib_addr", WQ_MEM_RECLAIM);
|
||||
if (!addr_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user