https://github.com/torvalds/linux
Revision d6858e190425db1da92f3131b1f3411480c356aa authored by Jakub Kicinski on 15 June 2023, 05:36:53 UTC, committed by Jakub Kicinski on 15 June 2023, 05:36:54 UTC
Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2023-06-12 (igc, igb)

This series contains updates to igc and igb drivers.

Husaini clears Tx rings when interface is brought down for igc.

Vinicius disables PTM and PCI busmaster when removing igc driver.

Alex adds error check and path for NVM read error on igb.

* '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue:
  igb: fix nvm.ops.read() error handling
  igc: Fix possible system crash when loading module
  igc: Clean the TX buffer and TX descriptor ring
====================

Link: https://lore.kernel.org/r/20230612205208.115292-1-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parent s 361b688 + 48a821f
Raw File
Tip revision: d6858e190425db1da92f3131b1f3411480c356aa authored by Jakub Kicinski on 15 June 2023, 05:36:53 UTC
Merge branch '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tip revision: d6858e1
crc64-rocksoft.c
// SPDX-License-Identifier: GPL-2.0-only

#include <linux/types.h>
#include <linux/module.h>
#include <linux/crc64.h>
#include <linux/err.h>
#include <linux/init.h>
#include <crypto/hash.h>
#include <crypto/algapi.h>
#include <linux/static_key.h>
#include <linux/notifier.h>

static struct crypto_shash __rcu *crc64_rocksoft_tfm;
static DEFINE_STATIC_KEY_TRUE(crc64_rocksoft_fallback);
static DEFINE_MUTEX(crc64_rocksoft_mutex);
static struct work_struct crc64_rocksoft_rehash_work;

static int crc64_rocksoft_notify(struct notifier_block *self, unsigned long val, void *data)
{
	struct crypto_alg *alg = data;

	if (val != CRYPTO_MSG_ALG_LOADED ||
	    strcmp(alg->cra_name, CRC64_ROCKSOFT_STRING))
		return NOTIFY_DONE;

	schedule_work(&crc64_rocksoft_rehash_work);
	return NOTIFY_OK;
}

static void crc64_rocksoft_rehash(struct work_struct *work)
{
	struct crypto_shash *new, *old;

	mutex_lock(&crc64_rocksoft_mutex);
	old = rcu_dereference_protected(crc64_rocksoft_tfm,
					lockdep_is_held(&crc64_rocksoft_mutex));
	new = crypto_alloc_shash(CRC64_ROCKSOFT_STRING, 0, 0);
	if (IS_ERR(new)) {
		mutex_unlock(&crc64_rocksoft_mutex);
		return;
	}
	rcu_assign_pointer(crc64_rocksoft_tfm, new);
	mutex_unlock(&crc64_rocksoft_mutex);

	if (old) {
		synchronize_rcu();
		crypto_free_shash(old);
	} else {
		static_branch_disable(&crc64_rocksoft_fallback);
	}
}

static struct notifier_block crc64_rocksoft_nb = {
	.notifier_call = crc64_rocksoft_notify,
};

u64 crc64_rocksoft_update(u64 crc, const unsigned char *buffer, size_t len)
{
	struct {
		struct shash_desc shash;
		u64 crc;
	} desc;
	int err;

	if (static_branch_unlikely(&crc64_rocksoft_fallback))
		return crc64_rocksoft_generic(crc, buffer, len);

	rcu_read_lock();
	desc.shash.tfm = rcu_dereference(crc64_rocksoft_tfm);
	desc.crc = crc;
	err = crypto_shash_update(&desc.shash, buffer, len);
	rcu_read_unlock();

	BUG_ON(err);

	return desc.crc;
}
EXPORT_SYMBOL_GPL(crc64_rocksoft_update);

u64 crc64_rocksoft(const unsigned char *buffer, size_t len)
{
	return crc64_rocksoft_update(0, buffer, len);
}
EXPORT_SYMBOL_GPL(crc64_rocksoft);

static int __init crc64_rocksoft_mod_init(void)
{
	INIT_WORK(&crc64_rocksoft_rehash_work, crc64_rocksoft_rehash);
	crypto_register_notifier(&crc64_rocksoft_nb);
	crc64_rocksoft_rehash(&crc64_rocksoft_rehash_work);
	return 0;
}

static void __exit crc64_rocksoft_mod_fini(void)
{
	crypto_unregister_notifier(&crc64_rocksoft_nb);
	cancel_work_sync(&crc64_rocksoft_rehash_work);
	crypto_free_shash(rcu_dereference_protected(crc64_rocksoft_tfm, 1));
}

module_init(crc64_rocksoft_mod_init);
module_exit(crc64_rocksoft_mod_fini);

static int crc64_rocksoft_transform_show(char *buffer, const struct kernel_param *kp)
{
	struct crypto_shash *tfm;
	int len;

	if (static_branch_unlikely(&crc64_rocksoft_fallback))
		return sprintf(buffer, "fallback\n");

	rcu_read_lock();
	tfm = rcu_dereference(crc64_rocksoft_tfm);
	len = snprintf(buffer, PAGE_SIZE, "%s\n",
		       crypto_shash_driver_name(tfm));
	rcu_read_unlock();

	return len;
}

module_param_call(transform, NULL, crc64_rocksoft_transform_show, NULL, 0444);

MODULE_AUTHOR("Keith Busch <kbusch@kernel.org>");
MODULE_DESCRIPTION("Rocksoft model CRC64 calculation (library API)");
MODULE_LICENSE("GPL");
MODULE_SOFTDEP("pre: crc64");
back to top