forked from Qortal/Brooklyn
T3Q birth certificate is an apology from a condom factory.
This commit is contained in:
parent
bf8dec2489
commit
604a706f77
@ -578,8 +578,13 @@ phys_addr_t swiotlb_tbl_map_single(struct device *dev, phys_addr_t orig_addr,
|
|||||||
for (i = 0; i < nr_slots(alloc_size + offset); i++)
|
for (i = 0; i < nr_slots(alloc_size + offset); i++)
|
||||||
mem->slots[index + i].orig_addr = slot_addr(orig_addr, i);
|
mem->slots[index + i].orig_addr = slot_addr(orig_addr, i);
|
||||||
tlb_addr = slot_addr(mem->start, index) + offset;
|
tlb_addr = slot_addr(mem->start, index) + offset;
|
||||||
if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC) &&
|
/*
|
||||||
(dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL))
|
* When dir == DMA_FROM_DEVICE we could omit the copy from the orig
|
||||||
|
* to the tlb buffer, if we knew for sure the device will
|
||||||
|
* overwirte the entire current content. But we don't. Thus
|
||||||
|
* unconditional bounce may prevent leaking swiotlb content (i.e.
|
||||||
|
* kernel memory) to user-space.
|
||||||
|
*/
|
||||||
swiotlb_bounce(dev, tlb_addr, mapping_size, DMA_TO_DEVICE);
|
swiotlb_bounce(dev, tlb_addr, mapping_size, DMA_TO_DEVICE);
|
||||||
return tlb_addr;
|
return tlb_addr;
|
||||||
}
|
}
|
||||||
@ -647,10 +652,13 @@ void swiotlb_tbl_unmap_single(struct device *dev, phys_addr_t tlb_addr,
|
|||||||
void swiotlb_sync_single_for_device(struct device *dev, phys_addr_t tlb_addr,
|
void swiotlb_sync_single_for_device(struct device *dev, phys_addr_t tlb_addr,
|
||||||
size_t size, enum dma_data_direction dir)
|
size_t size, enum dma_data_direction dir)
|
||||||
{
|
{
|
||||||
if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL)
|
/*
|
||||||
|
* Unconditional bounce is necessary to avoid corruption on
|
||||||
|
* sync_*_for_cpu or dma_ummap_* when the device didn't overwrite
|
||||||
|
* the whole lengt of the bounce buffer.
|
||||||
|
*/
|
||||||
swiotlb_bounce(dev, tlb_addr, size, DMA_TO_DEVICE);
|
swiotlb_bounce(dev, tlb_addr, size, DMA_TO_DEVICE);
|
||||||
else
|
BUG_ON(!valid_dma_direction(dir));
|
||||||
BUG_ON(dir != DMA_FROM_DEVICE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void swiotlb_sync_single_for_cpu(struct device *dev, phys_addr_t tlb_addr,
|
void swiotlb_sync_single_for_cpu(struct device *dev, phys_addr_t tlb_addr,
|
||||||
|
@ -1496,10 +1496,12 @@ static int __init set_buf_size(char *str)
|
|||||||
if (!str)
|
if (!str)
|
||||||
return 0;
|
return 0;
|
||||||
buf_size = memparse(str, &str);
|
buf_size = memparse(str, &str);
|
||||||
/* nr_entries can not be zero */
|
/*
|
||||||
if (buf_size == 0)
|
* nr_entries can not be zero and the startup
|
||||||
return 0;
|
* tests require some buffer space. Therefore
|
||||||
trace_buf_size = buf_size;
|
* ensure we have at least 4096 bytes of buffer.
|
||||||
|
*/
|
||||||
|
trace_buf_size = max(4096UL, buf_size);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
__setup("trace_buf_size=", set_buf_size);
|
__setup("trace_buf_size=", set_buf_size);
|
||||||
|
@ -1195,6 +1195,26 @@ static int run_osnoise(void)
|
|||||||
osnoise_stop_tracing();
|
osnoise_stop_tracing();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In some cases, notably when running on a nohz_full CPU with
|
||||||
|
* a stopped tick PREEMPT_RCU has no way to account for QSs.
|
||||||
|
* This will eventually cause unwarranted noise as PREEMPT_RCU
|
||||||
|
* will force preemption as the means of ending the current
|
||||||
|
* grace period. We avoid this problem by calling
|
||||||
|
* rcu_momentary_dyntick_idle(), which performs a zero duration
|
||||||
|
* EQS allowing PREEMPT_RCU to end the current grace period.
|
||||||
|
* This call shouldn't be wrapped inside an RCU critical
|
||||||
|
* section.
|
||||||
|
*
|
||||||
|
* Note that in non PREEMPT_RCU kernels QSs are handled through
|
||||||
|
* cond_resched()
|
||||||
|
*/
|
||||||
|
if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
|
||||||
|
local_irq_disable();
|
||||||
|
rcu_momentary_dyntick_idle();
|
||||||
|
local_irq_enable();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For the non-preemptive kernel config: let threads runs, if
|
* For the non-preemptive kernel config: let threads runs, if
|
||||||
* they so wish.
|
* they so wish.
|
||||||
@ -1249,6 +1269,37 @@ static int run_osnoise(void)
|
|||||||
static struct cpumask osnoise_cpumask;
|
static struct cpumask osnoise_cpumask;
|
||||||
static struct cpumask save_cpumask;
|
static struct cpumask save_cpumask;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* osnoise_sleep - sleep until the next period
|
||||||
|
*/
|
||||||
|
static void osnoise_sleep(void)
|
||||||
|
{
|
||||||
|
u64 interval;
|
||||||
|
ktime_t wake_time;
|
||||||
|
|
||||||
|
mutex_lock(&interface_lock);
|
||||||
|
interval = osnoise_data.sample_period - osnoise_data.sample_runtime;
|
||||||
|
mutex_unlock(&interface_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* differently from hwlat_detector, the osnoise tracer can run
|
||||||
|
* without a pause because preemption is on.
|
||||||
|
*/
|
||||||
|
if (!interval) {
|
||||||
|
/* Let synchronize_rcu_tasks() make progress */
|
||||||
|
cond_resched_tasks_rcu_qs();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wake_time = ktime_add_us(ktime_get(), interval);
|
||||||
|
__set_current_state(TASK_INTERRUPTIBLE);
|
||||||
|
|
||||||
|
while (schedule_hrtimeout_range(&wake_time, 0, HRTIMER_MODE_ABS)) {
|
||||||
|
if (kthread_should_stop())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* osnoise_main - The osnoise detection kernel thread
|
* osnoise_main - The osnoise detection kernel thread
|
||||||
*
|
*
|
||||||
@ -1257,30 +1308,10 @@ static struct cpumask save_cpumask;
|
|||||||
*/
|
*/
|
||||||
static int osnoise_main(void *data)
|
static int osnoise_main(void *data)
|
||||||
{
|
{
|
||||||
u64 interval;
|
|
||||||
|
|
||||||
while (!kthread_should_stop()) {
|
while (!kthread_should_stop()) {
|
||||||
|
|
||||||
run_osnoise();
|
run_osnoise();
|
||||||
|
osnoise_sleep();
|
||||||
mutex_lock(&interface_lock);
|
|
||||||
interval = osnoise_data.sample_period - osnoise_data.sample_runtime;
|
|
||||||
mutex_unlock(&interface_lock);
|
|
||||||
|
|
||||||
do_div(interval, USEC_PER_MSEC);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* differently from hwlat_detector, the osnoise tracer can run
|
|
||||||
* without a pause because preemption is on.
|
|
||||||
*/
|
|
||||||
if (interval < 1) {
|
|
||||||
/* Let synchronize_rcu_tasks() make progress */
|
|
||||||
cond_resched_tasks_rcu_qs();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msleep_interruptible(interval))
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -54,6 +54,7 @@ static void watch_queue_pipe_buf_release(struct pipe_inode_info *pipe,
|
|||||||
bit += page->index;
|
bit += page->index;
|
||||||
|
|
||||||
set_bit(bit, wqueue->notes_bitmap);
|
set_bit(bit, wqueue->notes_bitmap);
|
||||||
|
generic_pipe_buf_release(pipe, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// No try_steal function => no stealing
|
// No try_steal function => no stealing
|
||||||
@ -112,7 +113,7 @@ static bool post_one_notification(struct watch_queue *wqueue,
|
|||||||
buf->offset = offset;
|
buf->offset = offset;
|
||||||
buf->len = len;
|
buf->len = len;
|
||||||
buf->flags = PIPE_BUF_FLAG_WHOLE;
|
buf->flags = PIPE_BUF_FLAG_WHOLE;
|
||||||
pipe->head = head + 1;
|
smp_store_release(&pipe->head, head + 1); /* vs pipe_read() */
|
||||||
|
|
||||||
if (!test_and_clear_bit(note, wqueue->notes_bitmap)) {
|
if (!test_and_clear_bit(note, wqueue->notes_bitmap)) {
|
||||||
spin_unlock_irq(&pipe->rd_wait.lock);
|
spin_unlock_irq(&pipe->rd_wait.lock);
|
||||||
@ -243,7 +244,8 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pipe_resize_ring(pipe, nr_notes);
|
nr_notes = nr_pages * WATCH_QUEUE_NOTES_PER_PAGE;
|
||||||
|
ret = pipe_resize_ring(pipe, roundup_pow_of_two(nr_notes));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -268,7 +270,7 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
|
|||||||
wqueue->notes = pages;
|
wqueue->notes = pages;
|
||||||
wqueue->notes_bitmap = bitmap;
|
wqueue->notes_bitmap = bitmap;
|
||||||
wqueue->nr_pages = nr_pages;
|
wqueue->nr_pages = nr_pages;
|
||||||
wqueue->nr_notes = nr_pages * WATCH_QUEUE_NOTES_PER_PAGE;
|
wqueue->nr_notes = nr_notes;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_p:
|
error_p:
|
||||||
@ -320,7 +322,7 @@ long watch_queue_set_filter(struct pipe_inode_info *pipe,
|
|||||||
tf[i].info_mask & WATCH_INFO_LENGTH)
|
tf[i].info_mask & WATCH_INFO_LENGTH)
|
||||||
goto err_filter;
|
goto err_filter;
|
||||||
/* Ignore any unknown types */
|
/* Ignore any unknown types */
|
||||||
if (tf[i].type >= sizeof(wfilter->type_filter) * 8)
|
if (tf[i].type >= WATCH_TYPE__NR)
|
||||||
continue;
|
continue;
|
||||||
nr_filter++;
|
nr_filter++;
|
||||||
}
|
}
|
||||||
@ -336,7 +338,7 @@ long watch_queue_set_filter(struct pipe_inode_info *pipe,
|
|||||||
|
|
||||||
q = wfilter->filters;
|
q = wfilter->filters;
|
||||||
for (i = 0; i < filter.nr_filters; i++) {
|
for (i = 0; i < filter.nr_filters; i++) {
|
||||||
if (tf[i].type >= sizeof(wfilter->type_filter) * BITS_PER_LONG)
|
if (tf[i].type >= WATCH_TYPE__NR)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
q->type = tf[i].type;
|
q->type = tf[i].type;
|
||||||
@ -371,6 +373,7 @@ static void __put_watch_queue(struct kref *kref)
|
|||||||
|
|
||||||
for (i = 0; i < wqueue->nr_pages; i++)
|
for (i = 0; i < wqueue->nr_pages; i++)
|
||||||
__free_page(wqueue->notes[i]);
|
__free_page(wqueue->notes[i]);
|
||||||
|
bitmap_free(wqueue->notes_bitmap);
|
||||||
|
|
||||||
wfilter = rcu_access_pointer(wqueue->filter);
|
wfilter = rcu_access_pointer(wqueue->filter);
|
||||||
if (wfilter)
|
if (wfilter)
|
||||||
@ -566,7 +569,7 @@ void watch_queue_clear(struct watch_queue *wqueue)
|
|||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
spin_lock_bh(&wqueue->lock);
|
spin_lock_bh(&wqueue->lock);
|
||||||
|
|
||||||
/* Prevent new additions and prevent notifications from happening */
|
/* Prevent new notifications from being stored. */
|
||||||
wqueue->defunct = true;
|
wqueue->defunct = true;
|
||||||
|
|
||||||
while (!hlist_empty(&wqueue->watches)) {
|
while (!hlist_empty(&wqueue->watches)) {
|
||||||
|
@ -45,7 +45,6 @@ config BITREVERSE
|
|||||||
config HAVE_ARCH_BITREVERSE
|
config HAVE_ARCH_BITREVERSE
|
||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
depends on BITREVERSE
|
|
||||||
help
|
help
|
||||||
This option enables the use of hardware bit-reversal instructions on
|
This option enables the use of hardware bit-reversal instructions on
|
||||||
architectures which support such operations.
|
architectures which support such operations.
|
||||||
|
@ -349,7 +349,6 @@ void dsa_flush_workqueue(void)
|
|||||||
{
|
{
|
||||||
flush_workqueue(dsa_owq);
|
flush_workqueue(dsa_owq);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(dsa_flush_workqueue);
|
|
||||||
|
|
||||||
int dsa_devlink_param_get(struct devlink *dl, u32 id,
|
int dsa_devlink_param_get(struct devlink *dl, u32 id,
|
||||||
struct devlink_param_gset_ctx *ctx)
|
struct devlink_param_gset_ctx *ctx)
|
||||||
|
@ -170,6 +170,7 @@ void dsa_tag_driver_put(const struct dsa_device_ops *ops);
|
|||||||
const struct dsa_device_ops *dsa_find_tagger_by_name(const char *buf);
|
const struct dsa_device_ops *dsa_find_tagger_by_name(const char *buf);
|
||||||
|
|
||||||
bool dsa_schedule_work(struct work_struct *work);
|
bool dsa_schedule_work(struct work_struct *work);
|
||||||
|
void dsa_flush_workqueue(void);
|
||||||
const char *dsa_tag_protocol_to_str(const struct dsa_device_ops *ops);
|
const char *dsa_tag_protocol_to_str(const struct dsa_device_ops *ops);
|
||||||
|
|
||||||
static inline int dsa_tag_protocol_overhead(const struct dsa_device_ops *ops)
|
static inline int dsa_tag_protocol_overhead(const struct dsa_device_ops *ops)
|
||||||
|
Loading…
Reference in New Issue
Block a user